前言
一次http请求通常包含以下几个步骤:
1、建立或处理连接,web浏览器和web服务器建立相应的TCP连接。
2、发送请求:web浏览器向web服务器发送http请求,如:GET/sample/hello.jsp HTTP/1.1。
3、处理请求:用于对请求报文进行解析,获取客户端请求的资源及请求方法等相关信息;
4、访问资源,访问获取请求报文中请求的资源;
5、构建响应报文;
6、发送响应报文;
7、记录请求日志;
上述请求过程中涉及到了http通信的两个报文:request和respond报文。
-
报文格式:
request请求报文的格式类似于:
<method> <URL> <VERSION>
<headers>
<blank-line>
<entity-body>
response响应报文的格式类似于:
<version> <status> <reason-phrase>
<headers>
<blank-line>
<entity-body>
上述格式中各字段的解释为:
<method>:请求方法,标明客户端希望服务器对资源执行的动作,如GET、POST、HEAD等;
<version>:http服务的版本,格式通常为:HTTP/<major>.<minor>;
<status>:状态响应码,其格式通常为三位数字,如200,301,302,404等,每一个状态响应码标记请求处理过程中发生的情况;
<reason-phrase>:状态响应码所标记的状态的简要描述;
<headers>:由每个请求或响应报文包含的任意首部组成的,其首部格式类似于:Connection: Keep-Alive;
<blank-line>:在编写完最后一个请求头之后是一个空行,发送回车符和换行符,通知服务器以下不再有请求头。
<entity-body>:请求报文中附加的数据或响应时附加的数据;
本文着重介绍http报文的请求方法、状态响应码。
报文请求方法
http协议的请求方法包括:GET、POST、PUT、DELETE、OPTIONS、TRACE、CONNECT,这8个请求方法的作用为:
GET:向服务器请求访问获取特定的资源;
POST:向指定资源提交数据进行处理请求,如提交表单或上传文件等;数据包含在请求体中,POST请求可能会导致新的资源的创建或已有资源的修改;
PUT:向指定资源位置上传数据;
DELETE:请求服务器删除Request-URI所标识的资源内容;
TRACE:回显服务器收到的请求,主要用于测试或诊断。
CONNECT:HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
虽然http协议中的请求方法有8种之多,但是实际上常用的只有GET和POST,其他的请求方式基本都可以通过这两种方式间接实现。
在实验中若要测试发送GET和POST请求,可telnet访问相应IP地址和端口,然后发送相应报文格式来查看对应的结果,如:
GET /http/demo1.php HTTP/1.1 #<method> <URL> <VERSION>
Host:localhost #<headers>
空行
回车
HTTP/1.1 200 OK #<version> <status> <reason-phrase>
Date: Thu, 08 Dec 2016 03:37:44 GMT
Server: Apache/2.4.18 (Ubuntu) #<headers>
Content-Length: 5 #<headers>
Content-Type: text/html; charset=UTF-8 #<headers>
空行
demo1 #<entity-body>
状态响应码
状态响应码是http请求处理返回的结果状态标识,属于响应报文中的内容,熟知常见的状态响应码能帮助我们快速定位故障及进行相应的排错,状态码的类型大体可分为下面几类:
1xx:100-101,代表请求已被接受,需要继续处理,除非在某些试验条件下,服务器禁止向此类客户端发送 1xx 响应;
2xx:200-206, 代表请求已成功被服务器接收、理解、并接受;
3xx:300-305, 这类状态码代表需要客户端采取进一步的操作才能完成请求。通常,这些状态码用来重定向;
4xx:400-415, 代表了客户端看起来可能发生了错误,妨碍了服务器的处理;
5xx:500-505, 代表了服务器在处理请求的过程中有错误或者异常状态发生,也有可能是服务器意识到以当前的软硬件资源无法完成对请求的处理。;
常见的状态响应码及解释如下:
200: 成功,请求的所有数据通过响应报文的entity-body部分发送;OK
301: 请求的URL指向的资源已经被删除;但在响应报文中通过首部Location指明了资源现在所处的新位置;Moved Permanently
302: 与301相似,但在响应报文中通过Location指明资源现在所处临时新位置; Found
304: 客户端发出了条件式请求,但服务器上的资源未曾发生改变,则通过响应此响应状态码通知客户端;Not Modified
401: 需要输入账号和密码认证方能访问资源;Unauthorized
403: 请求被禁止;Forbidden
404: 服务器无法找到客户端请求的资源;Not Found
499:nginx自定义的,客户端关闭连接;
500: 服务器内部错误;Internal Server Error
501:Not Implemented,服务器不支持当前请求所需要的某个功能,当服务器无法识别请求的方法,并且无法支持其对任何资源的请求。
502: 代理服务器从后端服务器收到了一条伪响应;Bad Gateway
503:Service Unavailable,由于临时的服务器维护或者过载,服务器当前无法处理请求;
504:Gateway Time-out,504错误是(网关超时) 服务器作为网关或代理,但是没有及时从上游服务器收到请求。
其他常见的状态码可参考:
https://blog.csdn.net/helin916012530/article/details/29842595
499状态码:https://www.cnblogs.com/pangguoping/p/5603049.html