Respuestas:
El estado 422 parece más apropiado según la especificación .
El código de estado 422 (entidad no procesable) significa que el servidor comprende el tipo de contenido de la entidad de solicitud (por lo tanto, un código de estado 415 (tipo de medio no admitido) es inapropiado) y la sintaxis de la entidad de solicitud es correcta (por lo tanto, un 400 (solicitud incorrecta) ) el código de estado es inapropiado) pero no pudo procesar las instrucciones contenidas. Por ejemplo, esta condición de error puede ocurrir si un cuerpo de solicitud XML contiene instrucciones XML bien formadas (es decir, sintácticamente correctas), pero semánticamente erróneas.
Afirman que xml con formato incorrecto es un ejemplo de sintaxis incorrecta (que requiere un 400). Una cadena de consulta mal formada parece análoga a esto, por lo que 400 no parece apropiado para una cadena de consulta bien formada a la que le falta un parámetro.
ACTUALIZAR @DavidV señala correctamente que esta especificación es para WebDAV, no HTTP central. Pero algunas API populares que no son WebDAV están utilizando 422 de todos modos, por falta de un mejor código de estado ( ver esto ).
400
es más apropiado
No estoy seguro de que haya un estándar establecido, pero habría utilizado 400 Bad Request , que la última especificación HTTP (de 2014) documenta de la siguiente manera :
6.5.1. 400 Petición IncorrectaEl código de estado 400 (Solicitud incorrecta) indica que el servidor no puede o no procesará la solicitud debido a algo que se percibe como un error del cliente (por ejemplo, sintaxis de solicitud con formato incorrecto, enmarcado de mensaje de solicitud no válido o enrutamiento de solicitud engañoso).
400 Bad Request
está destinado a indicar problemas a nivel de protocolo, no errores semánticos. Si vamos a secuestrar códigos de estado HTTP para indicar errores a nivel de aplicación (en lugar de a nivel de protocolo), ¿por qué no ir hasta el final y simplemente usar 412
?
La API WCF en .NET maneja los parámetros faltantes al devolver un HTTP 404
error "Punto final no encontrado", cuando se usa webHttpBinding .
El 404 Not Found
puede tener sentido si se tiene en cuenta su servicio web nombre de método, junto con su firma parámetro. Es decir, si expone un método de servicio web LoginUser(string, string)
y lo solicita LoginUser(string)
, este último no se encuentra.
Básicamente, esto significaría que no se puede encontrar el método de servicio web al que está llamando, junto con la firma de parámetros que especificó.
10.4.5 404 no encontrado
El servidor no ha encontrado nada que coincida con el URI de solicitud. No se indica si la condición es temporal o permanente.
El 400 Bad Request
, como sugirió Gert , sigue siendo un código de respuesta válido, pero creo que normalmente se usa para indicar problemas de nivel inferior. Se podría interpretar fácilmente como una solicitud HTTP con formato incorrecto, tal vez encabezados HTTP faltantes o no válidos, o similar.
10.4.1 400 Solicitud incorrecta
El servidor no pudo entender la solicitud debido a una sintaxis incorrecta. El cliente NO DEBE repetir la solicitud sin modificaciones.
Puede enviar un código 400 Bad Request. Es uno de los códigos de estado 4xx más generales, por lo que puede usarlo para decir lo que pretende: el cliente está enviando una solicitud a la que le falta información / parámetros que su aplicación requiere para procesarla correctamente.
En uno de nuestros proyectos de API, decidimos establecer un Estado 409 para alguna solicitud, cuando no podemos completarlo al 100% debido a la falta de un parámetro.
El Código de estado HTTP "Conflicto 409" fue un buen intento para nosotros porque su definición requiere incluir suficiente información para que el usuario reconozca la fuente del conflicto.
Referencia: w3.org/Protocols/
Entonces, entre otras respuestas como 400 o 404, elegimos 409 para imponer la necesidad de revisar algunas notas en la solicitud que es útil para configurar una solicitud nueva y correcta.
De todos modos, nuestro caso fue particular porque necesitamos enviar algunos datos incluso si la solicitud no era completamente correcta, y debemos obligar al cliente a mirar el mensaje y comprender lo que está mal en la solicitud.
En general, si solo tenemos algunos parámetros faltantes, buscamos un 400 y una matriz de parámetros faltantes. Pero cuando necesitamos enviar más información, como un mensaje de caso particular y queremos estar más seguros de que el cliente se encargará de eso, enviamos un 409
Por lo general, elijo 422 (entidad no procesable) si algo en los parámetros requeridos no coincide con lo que requería el punto final de la API (como una contraseña demasiado corta) pero para un parámetro faltante, iría por 406 (inaceptable).
Accept-Language: de
, que indica que solo aceptará respuestas en alemán, pero las únicas versiones del documento solicitado que su servidor tiene disponible están en inglés o francés). Usarlo para indicar que falta un parámetro en la solicitud es incorrecto, por la definición en espec.
Para aquellos interesados, Spring MVC (3.x al menos) devuelve un 400 en este caso, lo que me parece incorrecto.
Probé varias URL de Google (accounts.google.com) y eliminé los parámetros necesarios, y en general en este caso devuelven un 404.
Copiaría Google.
Se podría argumentar que se 404 Not Found
debe utilizar a ya que no se pudo encontrar el recurso especificado.
A menudo uso un error prohibido 403. El razonamiento es que la solicitud fue entendida, pero no voy a hacer lo que me piden (porque las cosas están mal). La entidad de respuesta explica qué está mal, por lo que si la respuesta es una página HTML, los mensajes de error están en la página. Si se trata de una respuesta JSON o XML, la información del error está allí.
Desde rfc2616 :
10.4.4 403 Prohibido
El servidor entendió la solicitud, pero se niega a cumplirla.
La autorización no ayudará y la solicitud NO DEBE repetirse.
Si el método de solicitud no era HEAD y el servidor desea hacer
público por qué la solicitud no se ha cumplido, DEBERÍA describir el motivo del rechazo en la entidad. Si el servidor no desea que esta información esté disponible para el cliente,
se puede utilizar el código de estado 404 (No encontrado).
Authorization will not help
, por lo que Twitter no debería enviar esto por credenciales de OAuth no válidas.
401 Unauthorized
en su lugar. Sin embargo, puede entender por qué no lo hacen si mira las descripciones de los dos documentos de MDN de estos dos códigos, que son muy similares.
Solo para usar ASP.NET Core como referencia o ejemplo, ASP.NET Core le permite construir un controlador con acciones, así es como se ve la acción "Detalles".
// GET: Cars/Details/5
public async Task<IActionResult> Details(int? id)
{
if (id == null)
{
return NotFound();
}
var car = await _context.Cars.FirstOrDefaultAsync(m => m.CarId == id);
if (car == null)
{
return NotFound();
}
return View(car);
}
Si el parámetro id
no está configurado, devuelve 404 No encontrado.
Devuelve un 404 , lo que significa que no se pudo encontrar el recurso.
Intente editar una url de un sitio que contenga una identificación. Probé algunos:
Todos devuelven 404, en mi opinión, porque esos desarrolladores están interpretando el estándar correctamente, lo que la respuesta aquí y muchas otras no.
requestBody
.
Yo iría con un 403.
Desde RFC 2616 - Protocolo de transferencia de hipertexto - HTTP / 1.1
403 prohibido
El servidor entendió la solicitud, pero se niega a cumplirla. La autorización no ayudará y la solicitud NO DEBE repetirse. Si el método de solicitud no era HEAD y el servidor desea hacer público por qué la solicitud no se ha cumplido, DEBERÍA describir el motivo del rechazo en la entidad. Si el servidor no desea que esta información esté disponible para el cliente, se puede utilizar el código de estado 404 (No encontrado).
Debe describir la razón del fracaso en su respuesta. Si prefiere no hacerlo, simplemente use 404.