我有一个JSON请求,我正在将其发布到HTTP URL。
如果requestedResource
字段存在,但"Roman"
是该字段的无效值,那么这应该被视为400
吗?
[{requestedResource:"Roman"}]
如果"blah"
字段根本不存在,这应该被视为400
吗?
[{blah:"Roman"}]
我有一个JSON请求,我正在将其发布到HTTP URL。
如果requestedResource
字段存在,但"Roman"
是该字段的无效值,那么这应该被视为400
吗?
[{requestedResource:"Roman"}]
如果"blah"
字段根本不存在,这应该被视为400
吗?
[{blah:"Roman"}]
400表示请求格式错误。换句话说,客户端发送给服务器的数据流不符合规则。
对于带有JSON有效负载的REST API,400通常会被正确地用于指示根据服务API规范,JSON以某种方式无效。
按照这种逻辑,您提供的两种情况都应该是400s。
想象一下如果这是XML而不是JSON,两种情况下,XML永远不会通过模式验证——要么是由于未定义元素,要么是由于不当的元素值。那将是一个错误的请求。这里也是同样的道理。
来自 w3.org
10.4.1 400 错误请求
由于格式错误,服务器无法理解该请求。客户端不应在未经修改的情况下重复发送请求。
{
"error_type" : "unsupported_resource",
"error_description" : "\"Roman\" is not supported"
}
或者更一般的错误,如果这种情况是客户端中的逻辑错误,并且不被期望,除非开发人员做错了什么:
{
"error_type" : "malformed_json",
"error_description" : "\"Roman\" is not supported for \"requestedResource\" field"
}
{"error": {"message": "未知请求关键字"}}
或其他类似的内容。除了表示“请求格式错误”以外,使用400
状态码是错误的。
如果请求有效负载包含无法解析为application/json
(如果服务器期望该数据格式)的字节序列,则应使用适当的状态码415
:
服务器拒绝服务请求,因为所请求方法的请求实体需要在请求的资源上下文中使用不支持的格式。
如果请求有效负载在语法上正确但在语义上不正确,则可以使用非标准的422
响应码或标准的403
状态码:
服务器已理解请求,但拒绝执行。授权将无助于解决问题,不应重复该请求。
考虑预期。
作为客户端应用程序,您希望知道服务器端是否出现错误。如果服务器需要在缺少blah
或者requestedResource
值不正确时抛出错误,则400错误是合适的。
这让我想起了和别人的一个常见对话,"我理解-只是我不同意"
400表示服务器无法理解请求
200表示服务器准确理解并完全处理了请求。
当服务器返回200时,它在说:"我理解了您的请求,我已经处理完毕并没有遇到任何错误,并且这是我的正确响应"。
200意味着您可以信任响应中发送的答案。也许答案是"罗马人不允许" - 但无论如何,这都是一个适当的答案,并且没有发生任何意外的问题。
200并不表达有关预期错误或已处理的异常的任何信息 - 因为这不是消息传输过程的一部分。这些是有关HTTP的状态代码,是传输本身的状态。
我认为应该避免模糊"传输/通信"和"处理"之间的界线。
对于那些喜欢使用HTTP代码指示处理问题(“我不同意”部分)的人,似乎409冲突最适用于"不允许罗马人"
RFC 7231 409冲突
冲突几乎意味着"缺乏协议",对吗?
无论您选择哪种HTTP响应代码,似乎每个人都同意您的响应应该解释为什么失败以及如何解决它。对于罗马人来说,也许返回一个字段的可接受值列表?
首先检查URL是否正确,如果正确,则检查您发送的请求正文,可能的原因是您发送的请求缺少正确的语法。
具体而言,请检查请求字符串中的特殊字符。如果使用了(特殊字符),则这是此错误的根本原因。
尝试复制请求并分析每个标记的数据。
$.ajax
将表单数据发送到服务器,并且一开始也遇到了400
错误。var formData = {
"name":"Gearon",
"hobby":"Be different"
};
不要直接使用变量formData
作为键data
的值,如下所示:
$.ajax({
type: "post",
dataType: "json",
url: "http://localhost/user/add",
contentType: "application/json",
data: formData,
success: function(data, textStatus){
alert("Data: " + data + "\nStatus: " + status);
}
});
不要这样使用,而是按照以下方式使用JSON.stringify来封装formData
:
$.ajax({
type: "post",
dataType: "json",
url: "http://localhost/user/add",
contentType: "application/json",
data: JSON.stringify(formData),
success: function(data, textStatus){
alert("Data: " + data + "\nStatus: " + status);
}
});
无论如何,正如其他人所说明的那样,错误是因为服务器无法识别请求导致语法错误,我只是在实践中举了一个例子。希望对某个人有所帮助。