http协议
[TOC]
Http Definition
HTTP(Hypertext Transfer Protocol)就是超文本传输协议,它是现代互联网最重要也是最基本的协议。Http协议是无状态的、应用层协议,它是web开发的基础。
URL
- URL(Uniform Resource Locator) 地址用于描述一个网络上的资源。基本格式如下:
schema://login@host[:port#]/path/..../[?query-string][#anchor]
/*
scheme: 协议名(如http,https,ftp)
login: 登陆信息
host: 服务器IP/域名
port#:HTTP服务的默认端口是80,这种情况下端口号可以省略。如果使用了别的端口,必须指明,例如http://www.cnblogs.com:8080
path: 资源路径
query-string: 发送给web服务器的数据
anchor: 锚
*/
- 举个例子:
http://www.mywebsite.com/sj/test/test.aspx?name=sivergn&x=true#stuff
/*
schema: http
host: www.mywebsite.com
path: /sj/test/test.aspx
Query String: name=sviergn&x=true
Anchor: stuff
*/
URL的请求过程
- 当你在浏览器输入URL
http://www.website.com
的时候,浏览器发送一个Request去获取http://www.website.com
的html。 - 服务器把Response发送回给浏览器。浏览器分析Response中的 HTML,发现其中引用了很多其他文件,比如图片,CSS文件,JS文件。
- 浏览器会自动再次发送Request去获取图片,CSS文件,或者JS文件。当所有的文件都下载成功后, 网页就被显示出来了。
Request Method
我们通过URL访问服务端获得资源,具体的操作由 http 协议的 request method 来定义。http/1.1 一共有八种操作:
- GET:向服务端发起获得资源的请求。GET 也是可以传递参数给服务端的,是将参数放在URL中携带到服务端,暴露在整篇网络环境中,很不安全。
- POST:向指定的主机资源提交数据。一般都是向服务端提交表单数据进行处理。POST 提交的数据保存在http协议的body中。
- PUT:向指定的主机资源上传最新的内容
- DELETE:请求服务端删除Request-URL标识的资源
上面四种是用的最多的四种Method,有时候,我们将 PUT 和 DELETE 看作是POST的特殊实现。
- HEAD:与GET方法类似,区别是只请求头部。用于测试和获得头部中的元数据
- TRACE:回显请求
- CONNECT:HTTP/1.1预留给一些代理服务器用,用于改变连接方式。
- OPTIONS:测试服务端能支持的HTTP Method
对于Method常见的错误码:
-
405(Method Not Allowed)
是客户端的错误 -
501(Not Implemented)
是服务端的错误
GET实例:
GET /test/?id=11101&name=Professional HTTP/1.1
Host: www.test.com
User-Agent: Mozilla/5.0 (Windows; U;) Firefox/1.0.1
Connection: Keep-Alive
POST实例:
POST / HTTP/1.1
Host: www.test.com
User-Agent: Mozilla/5.0 (Windows; U) Firefox/1.0.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 40
Connection: Keep-Alive
name=Professional&id=11101
状态码
通过URL和Method,客户端就可以发送一个完整的请求给服务端。当然服务端也会做出响应。状态码就是非常重要的一种响应,客户端通过状态码就可以了解服务端做出何种响应。HTTP/1.1
中定义了5类状态码, 状态码由三位数字组成,第一个数字定义了响应的类别:
- 1XX 提示信息; 表示请求已被成功接收,告诉客户端可以继续发送下一个请求了,若如果已发送完毕可以忽略它。
- 2XX 成功
- 3XX 重定向; 要完成请求必须进行更进一步的处理
- 4XX 客户端错误;请求有语法错误或请求无法实现
- 5XX 服务器端错误;服务器未能实现合法的请求
常见的状态码
1xx:Informational Messages
这是 http/1.1 才支持的状态码,服务端可以发送一个 100-continue
告诉客户端继续发送消息,客户端如果已发送可以忽略。
2xx:成功
告诉 client 接收到 Request 并成功处理,最常见的是 200 OK
- 202 Accepted: the request was accepted but may not include the resource in the response. This is useful for async processing on the server side. The server may choose to send information for monitoring.
- 204 No Content: there is no message body in the response.
- 205 Reset Content: indicates to the client to reset its document view.
- 206 Partial Content: indicates that the response only contains partial content. Additional headers indicate the exact range and content expiration information.
3xx:Redirection
这个状态代表客户端需要重定向到其他URL获取资源,新的URL在Response中,浏览器会自动向新的URL发起Request
- 301 请永久到新的URL获取资源
-
303 资源暂时位于新的URL,新的URL记在
Location
Response Header 中 - 304 告诉client请求的资源没有更新,可以直接使用client缓存中的备份。(当然有没有更新是靠头部中的标识进行hash计算的)
4xx:Client Error
当客户端发出一个 bad request 或者请求无效资源时,server端会认为时client出错了。最常见的是 404 Not Found
。404 表示资源无效,在服务端上不存在。
- 400 Bad Request:请求语法错误
-
401 Unauthorized: 未经授权。可以通过带有
Unauthorized
的头部再次发起请求。还是401错误应该可以推断是没有证书。 - 403 Forbidden:服务器收到请求,但是拒绝提供服务
- 405 Method Not Allowed:request line中的method不合法
- 409 Conflict:冲突了。通常出现在多人协作时。
5xx:Server Error
用于来表示server端出现了故障。最常见的是 500 Internal Server Error
服务器发生不可预期的错误。
- 501 Not Implemented:服务器不支持此方法
- 503 Server Unavailable:服务器当前不能处理客户端的请求,一段时间后可能恢复正常
Http消息结构
消息格式
http协议对 Request 和 Response 两种消息定义了下面的格式:
message = <start-line>
*(<message-header>)
CRLF
[<message-body>]
<start-line> = Request-Line | Status-Line
<message-header> = Field-Name ':' Field-Value
从上面定义我们可以看到,Http的Request和Response消息都是由三部分组成:
1. start-line 开始行
2. header 消息头
3. body 消息体
对于start-line,又分为:
1. Request-Line : 'METHOD/path-to-resource http-version'
2. Response-Line : 'http-version status-code message'
对于Headers则有如下几种:
1. general headers
2. entity headers
3. request or response headers
a. request specific headers.
b. response specific headers.
Request
GET http://www.google.com/ HTTP/1.1
Host:www.google.com
用表格来表示:
Request Line | METHOD/path-to-resource HTTP/version-number |
---|---|
Request Header | Field1 : Value |
Request Header | Field2 : Value |
空行 | 空行 |
Request Body | data(optional) |
-
Request Line/请求行
- Method :请求方法,如GET/POST
- path-to-resource :所请求的资源在web服务器上的位置
- HTTP/version-number:HTTP协议版本号。
-
Request Header
,记录请求行以外的重要信息。 -
Request Body
,携带提交给web服务器的数据。使用GET方法时,为空。 - 注意,Body和Header之间空一行。
Response
Response Line | HTTP/version-number status-code message |
---|---|
Response Header | Field1 : Value |
Response Header | Field2 : Value |
空行 | 空行 |
Response Body | data(optional) |
-
Response Line/响应行
- HTTP/version-number :HTTP协议版本号
- status-code :状态码,反应服务器处理是否正常,告知出现的错误
- message :状态消息,同状态码对应。
-
Response Header / 响应头
:记录响应体数据的相关信息。 -
Response Body / 响应体
:携带需要向web服务器发送的数据。使用GET方法时,为空。
TIPs
- 对于GET方法,例如
Http://localhost/login.php?username=aa&password=1234
,很明显能辩认出?
后就是query-string
,易被网络爬虫爬取信息。 - 对于POST ,则会将提交的数据保存到HTTP的BODY中,比如上面的
username=aa&password=1234