您的位置:

详解400 bad request错误原因

当使用HTTP协议通讯时,客户端向服务器发送请求,服务器会接收请求并返回相应的响应。如果客户端在请求中传递的参数格式有问题或者不符合规范,服务器就可能会返回错误状态码400 Bad Request。本文将从HTTP协议层面、客户端、服务端三个方面详细阐述400 Bad Request错误原因。

一、HTTP协议层面

1、HTTP请求格式非法

GET http://www.example.com HTTP/1.1
Host: www.example.com
Accept-Encoding: gzip
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36
Connection: close

在上方的请求中,缺少了一个空格以及请求方法。请求参数格式错误会导致服务端无法正常解析请求内容,因此会返回400 Bad Request错误。

2、HTTP请求参数格式错误

GET http://www.example.com/?a[]=1&a[]=2&b=3 HTTP/1.1
Host: www.example.com
Accept-Encoding: gzip
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36
Connection: close

以上请求中,查询字符串中参数a的值使用了数组类型,并用了[]表示。正常情况下,数组类型的值应该通过逗号分隔,而非在参数名中使用方括号。这种格式错误也会导致服务端返回400 Bad Request错误。

二、客户端

1、客户端发送的POST请求没有正确设置Content-Type

POST http://www.example.com HTTP/1.1
Host: www.example.com
Accept-Encoding: gzip
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36
Connection: close

name=example

以上请求为未设置Content-Type的POST请求,该请求中发送的数据格式为表单格式且默认的Content-Type为application/x-www-form-urlencoded。如果该请求中没有设置Content-Type,服务端将无法正常解析请求体中的内容,导致返回400 Bad Request错误。

2、客户端在使用GET请求方式时,参数需要经过URL编码

GET http://www.example.com/?name=John Samson HTTP/1.1
Host: www.example.com
Accept-Encoding: gzip
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36
Connection: close

以上请求中,参数name中包含空格,如果不对其进行URL编码,那么服务端会将空格识别为参数值的结束符,导致参数值被认为是John,后面的Samson则被认为是不合法字符,从而导致返回400 Bad Request错误。

三、服务端

1、服务端接收的数据格式与接口定义不符

POST http://www.example.com HTTP/1.1
Host: www.example.com
Accept-Encoding: gzip
Content-Type: application/json
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36
Connection: close

{
    "name": "John",
    "age": 28
}

以上请求中,客户端向服务端发送的是JSON格式的数据,但服务端在接收数据时却认为它是表单格式的数据,从而无法正常解析请求内容,导致返回400 Bad Request错误。

2、服务端接收到含有非法字符的请求

GET http://www.example.com/?search=helloworld HTTP/1.1
Host: www.example.com
Accept-Encoding: gzip
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36
Connection: close

以上请求中,查询字符串中注入了HTML注释,服务端在接收到请求后,需要解析其内容以便进行处理,但是在解析时,会认为注释符号是一个非法字符,无法正常解析请求内容,导致返回错误400 Bad Request。

小结

以上是对常见的400 Bad Request错误原因进行的分析,希望对大家在开发过程中遇到的问题有所帮助。注意,每个服务器都可能对不同格式的请求做出不同的响应,因此在开发中要根据服务器返回的错误代码和消息来判断错误原因,以及做出相应的解决方案。