我有一个要发布到HTTP URL的JSON请求。
如果这被视为400
其中requestedResource
场存在,但"Roman"
对于这方面的无效值?
[{requestedResource:"Roman"}]
应该将其视为根本不存在字段的400
地方"blah"
吗?
[{blah:"Roman"}]
我有一个要发布到HTTP URL的JSON请求。
如果这被视为400
其中requestedResource
场存在,但"Roman"
对于这方面的无效值?
[{requestedResource:"Roman"}]
应该将其视为根本不存在字段的400
地方"blah"
吗?
[{blah:"Roman"}]
Answers:
400表示请求格式错误。换句话说,客户端发送到服务器的数据流不遵循规则。
对于具有JSON有效负载的REST API,通常,并且我会正确地说,根据服务的API规范,通常使用400来表示JSON无效。
按照这种逻辑,您提供的两个方案都应为400。
想象一下,这是XML而不是JSON。在这两种情况下,XML都永远不会通过架构验证-由于未定义元素或元素值不正确。那将是一个糟糕的要求。同样的交易。
来自w3.org
10.4.1 400错误的请求
由于语法格式错误,服务器无法理解该请求。客户不应在没有修改的情况下重复请求。
选择HTTP响应代码是一件很容易的事情,可以用简单的规则来描述。经常被忘记的唯一棘手的部分是RFC 7231中的6.5段:
除响应HEAD请求外,服务器应发送一个包含错误情况说明以及它是暂时还是永久的说明。
规则如下:
因此,在您的情况下,我将返回400错误,并且如果从用户输入中获取“罗马”字样,并且客户端必须有特定的反应,则类似这样:
{
"error_type" : "unsupported_resource",
"error_description" : "\"Roman\" is not supported"
}
或更常见的错误,如果这种情况是客户端中的逻辑错误,并且不希望发生,除非开发人员做错了什么:
{
"error_type" : "malformed_json",
"error_description" : "\"Roman\" is not supported for \"requestedResource\" field"
}
在两种情况下,“语法都格式错误”。这是错误的语义。因此,恕我直言400是不合适的。相反,返回200和某种错误对象(例如{ "error": { "message": "Unknown request keyword" } }
或其他。
考虑客户端处理路径。语法错误(例如无效的JSON)是程序逻辑中的错误,换句话说是某种错误,应按照类似于403的方式进行相应的处理;例如:换句话说,坏事出了错。
另一方面,参数值中的错误是语义错误,这可能是由于用户验证输入无效所致。这不是HTTP错误(尽管我想可能是422)。处理路径将不同。
例如,在jQuery中,我希望不必编写处理500之类的错误处理程序和某些特定于应用程序的语义错误的错误处理程序。其他框架,例如Ember,也将400s和500s之类的HTTP错误等同地视为大错误,要求程序员检测正在发生的事情并根据是否是“实际”错误进行分支。
将400
状态代码用于指示请求以外的其他目的的格式不正确是完全错误的。
如果请求有效负载包含无法解析为的字节序列application/json
(如果服务器期望该数据格式),则相应的状态码为415
:
服务器拒绝为请求提供服务,因为请求的实体的格式不受请求的方法所请求的资源支持。
如果请求有效负载在语法上正确但在语义上不正确,422
则可以使用非标准响应代码或标准403
状态代码:
服务器理解了该请求,但拒绝执行该请求。授权将无济于事,并且不应重复该请求。
image/gif
代替text/json
在 Content-Type:
报头中。-如果multipart的组件指定了错误的类型,那么这大概也适用,请参见tools.ietf.org/html/rfc4918,其中讨论了422,以进行更多讨论,
首先检查URL,可能是错误的,如果正确,然后检查您正在发送的请求正文,可能的原因是您正在发送的请求缺少正确的语法。
要详细说明,请检查请求字符串中是否有特殊字符。如果正在使用(特殊字符),则这是此错误的根本原因。
尝试复制请求并分析每个标签数据。
作为补充,对于那些可能遇到与我相同的问题的人,我$.ajax
经常将表单数据发布到服务器,并且我也得到了400
错误。
假设我有一个javascript变量,
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);
}
});
无论如何,正如其他人所说明的那样,错误是因为服务器无法识别导致语法格式错误的请求,我只是在实践中提出一个实例。希望对某人有帮助。
Roman
,