前言
HTTP即超文本传输协议,是Internet上最主要的Web应用层标准。HTTP消息包Request和Response,基本上就是消息头和消息体两部分。消息头字段以键值对的方式为服务器或者客户端提供对方的信息,消息体则没有固定格式,下面就简单介绍一下。
Request
Request是客户端向服务器端发起请求。格式如下
【请求方法】 【URL】【协议版本】
【头字段1】:value1
【头字段2】:value2
……
【头字段N】:valueN
【消息体】
Response
Response是服务器很据客户端的请求包做相应处理后想客户端返回的结果。格式如下
【协议版本】【错误码】【错误字符串】
【头字段1】:value1
【头字段2】:value2
……
【头字段N】:valueN
【消息体】
请求头
| 字段名 | 方向 | 解释 | 可能的值 |
|---|---|---|---|
| Accept | Request | 接受什么介质类型 | type/sub-type */*表示任何类型 type/*表示该类型下的所有子类型 |
| Accept-Charse | Rrequest | 接收的字符集 | ISO-8859-1 |
| Accept-Encoding | Request | 接受的编码方法,通常指定压缩方法、是否支持压缩、支持什么压缩 | Gzip、deflate、UTF8 |
| Accept-Language | Request | 接收的语言 | En、cn |
| Accept-Ranges | Request | 服务器表明自己是否接受获取某个实体的一部分的请求 | byte:表示接受 none:表示不接受 |
| Age | Response | 用该头部表明该实体从生产到现在经过多长时间 | |
| Authorization | Response | 当客户端接收到来自Web服务器的www-Authenticate响应时,该头部回应自己的身份验证信息给Web服务器 | username:password |
| Cache-Control | Request | 对服务器的缓存控制 | no-cache:不需要从缓存中去取,要求先从web服务器中去取 |
| Cache-Contol | Response | 对客户端缓存控制 | public:可以用缓存内容回应任何用户,pricate:只能用缓存内容回应先前请求该内容的那个用户 |
| Connection | Request | 对服务器连接的控制 | Close:告诉web服务器在完成本次请求响应后,断开连接,不要等待本次连接后的请求了,Keepalive:告诉Web服务器在完成本次请求响应后,保持连接,等待本次连接的后续请求 |
| Connection | Response | 连接状态通知 | Close:连接已经关闭,Keepalive:保持连接等地啊本次连接的后续请求 |
| Etag | both | 内容唯一标识,客户端需要保服务器传来的Rtag保留,在下次请求相同的URL时提交给服务器。服务器用Rtag值哦按段同一个URL的内容是否有变化,如有变化则发送更新的内容给客户端。 | 任何值 |
| Expired | Response | Web服务器表明该实力将在什么时候国企 | YYYY-MM-DD HH:MM:SS |
| Host | Request | 客户端指定自己想访问的Web服务器的域名、IP地址和端口号 | ip:port |
| Location | Response | 访问的对象已经被一道别的位置,应该大本字段指向的地址获取 | mysite.com/another |
| Proxy=Authenticate | Respinse | 代理服务器响应浏览器,要求提供代理身份验证信息 | |
| Proxy-Authenticate | Request | 提供自己在代理服务器中的身份验证信息 | username:password |
| range | Request | 需要获取对象的哪一部分内容 | bytes=1024:获取从地1024个字节到最后的内容 |
| Referer | Request | 浏览器向web服务器表明自己是从那个URL获取的当前请求的URL | www.baidu.com |
| Server | Response | 指明服务器的软件类型及版本 | Nginx/1.14 |
| User-Agent | Request | 指明浏览器的软件类型以及版本 | Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36 |
| Via | both | 列出从客户端懂啊服务器或者相反方向的响应经过了哪些代理服务器,他用了什么协议、什么版本发送的请求 |
错误代码
1XX:信息;表明服务器已经收到Request但需要进一步处理,请客户端等待 2XX:成功;处理成功 3XX:重定向;请求地址已经被重定向,需要客户端重新发起请求 4XX:客户端错误;请求中提交的参数或者内容有错误 5XX:服务器错误;服务器处理请求时出错。
错误代码详情
100:继续 客户端应当继续发送请求。客户端应当继续发送请求的剩余部分,或者如果请求已经完成,忽略这个响应。
101: 转换协议 在发送完这个响应最后的空行后,将会切换到在Upgrade 消息头中定义的那些协议。只有在切换新的协议更有好处的时候才应该采取类似措施。
102:继续处理 由WebDAV(RFC 2518)扩展的状态码,代表处理将被继续执行。
200:请求成功 处理方式:获得响应的内容,进行处理
201:请求完成,结果是创建了新资源。新创建资源的URI可在响应的实体中得到 处理方式:爬虫中不会遇到
202:请求被接受,但处理尚未完成 处理方式:阻塞等待
204:服务器端已经实现了请求,但是没有返回新的信 息。如果客户是用户,则无须为此更新自身的文档视图。 处理方式:丢弃
300:该状态码不被HTTP/1.0的应用程序直接使用, 只是作为3XX类型回应的默认解释。存在多个可用的被请求资源。 处理方式:若程序中能够处理,则进行进一步处理,如果程序中不能处理,则丢弃
301:请求到的资源都会分配一个永久的URL,这样就可以在将来通过该URL来访问此资源 处理方式:重定向到分配的URL
302:请求到的资源在一个不同的URL处临时保存 处理方式:重定向到临时的URL
304:请求的资源未更新 处理方式:丢弃
400:非法请求 处理方式:丢弃
401:未授权 处理方式:丢弃
403:禁止 处理方式:丢弃
404:没有找到 处理方式:丢弃
500:服务器内部错误 服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理。一般来说,这个问题都会在的源代码出现错误时出现。
501:服务器无法识别 服务器不支持当前请求所需要的某个功能。当服务器无法识别请求的方法,并且无法支持其对任何资源的请求。
502:错误网关 作为网关或者工作的服务器尝试执行请求时,从上游服务器接收到无效的响应。
503:服务出错 由于临时的维护或者过载,服务器当前无法处理请求。这个状况是临时的,并且将在一段时间以后恢复。
HTTP请求方法
| 访问方式 | 意义 |
|---|---|
| DELETE | 从给定的地址中删除信息 |
| GET | 从访问的地址中获取信息(包括信息头和信息体)最主要的访问方法 |
| HEAD | 从访问的地址在获取信息,与GET区别之获取消息头不获取消息体 |
| OPTIONS | 为客户端提供一种查询,本URL地址中有哪些可用的访问方法 |
| POST | 一般是保存新信息,客户端通过POST方法向服务器提交新数据,服务器保存数据,服务器不允许出现重复的POST数据提交。 |
| PUT | 一般是修改信息,与POST访问方法类似,PUT允许客户端提交重复主键的数据,服务端会用新数据覆盖已有的相同主键的数据。 |
常见的处理HTTP请求的Web服务器
Apache:它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是最流行的Web服务器端软件之一。它快速、可靠并且可通过简单的API扩充,将Perl/Python等解释器编译到服务器中。
Nginx:是一款轻量级和高性能的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器。
IIS:微软的Web服务器产品,由于windows的影响,IIS是目前最流行的的web服务器产品之一,最大的优势是对微软ASP.net以及周围产品的支持。
Tomcat:是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache 服务器,可利用它响应HTML(标准通用标记语言下的一个应用)页面的访问请求。实际上Tomcat是Apache 服务器的扩展,但运行时它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的。
CGI:公共网关接口,是外部扩展应用程序与 Web 服务器交互的一个标准接口。据CGI标准,编写外部扩展应用程序,可以对客户端浏览器输入的数据进行处理,完成客户端与服务器的交互操作
ISAPI:可以被 HTTP 服务器加载和调用的 DLL。Internet 服务器扩展也称为 Internet 服务器应用程序 (ISA),用于增强符合 Internet 服务器 API (ISAPI) 的服务器的功能。ISA 通过浏览器应用程序调用,并且将相似的功能提供给通用网关接口 (CGI) 应用程序。
WSGI:Python Web服务器网关接口,是为Python语言定义的Web服务器和Web应用程序或框架之间的一种简单而通用的接口。自从WSGI被开发出来以后,许多其它语言中也出现了类似接口