维基百科:HTTP
索引
1. 请求报文
一个 HTTP 请求报文由请求行(request line),请求头部(header),空行和请求数据 4 个部分组成.
大致结构是这样的:
<request-line> //请求行
<headers> //首部行
<blank line> //空行
<request-body> //请求体
一个简单的例子:
POST /user HTTP/1.1 //请求行
Host: www.user.com
Content-Type: application/x-www-form-urlencoded
Connection: Keep-Alive
User-agent: Mozilla/5.0. //以上是首部行
(此处必须有一空行) //空行分割header和请求内容
name=world 请求体
1.1 请求行
请求行由三部分组成:请求方法,请求 URL(不包括域名),HTTP 协议版本
请求方法比较多:GET,POST,HEAD,PUT,DELETE,OPTIONS,TRACE,CONNECT
最常用的是 GET 和 POST.
1.1.1 请求方法
1) GET
传递参数长度受限制,因为传递的参数是直接表示在地址栏中,而特定浏览器和服务器对 url 的长度是有限制的.
因此,GET 不适合用来传递私密数据,也不适合拿来传递大量数据.
一般的 HTTP 请求大多都是 GET.
2)POST
POST 把传递的数据封装在 HTTP 请求数据中,以名称 / 值的形式出现,可以传输大量数据,对数据量没有限制,也不会显示在 URL 中.
表单的提交用的是 POST.
3)HEAD
HEAD 跟 GET 相似,不过服务端接收到 HEAD 请求时只返回响应头,不发送响应内容.所以,如果只需要查看某个页面的状态时,用 HEAD 更高效,因为省去了传输页面内容的时间.
4)DELETE
删除某一个资源.
5)OPTIONS
用于获取当前 URL 所支持的方法.若请求成功,会在 HTTP 头中包含一个名为 "Allow" 的头,值是所支持的方法,如 "GET, POST".
6)PUT
把一个资源存放在指定的位置上.
本质上来讲, PUT 和 POST 极为相似,都是向服务器发送数据,但它们之间有一个重要区别,PUT 通常指定了资源的存放位置,而 POST 则没有,POST 的数据存放位置由服务器自己决定.
关于 POST 和 PUT 的区别以及请求方法的幂等性,请参考文章: http 的 7 种请求方法和幂等性
7)TRACE
回显服务器收到的请求,主要用于测试或诊断.
8)CONNECT
CONNECT 方法是 HTTP/1.1 协议预留的,能够将连接改为管道方式的代理服务器.通常用于 SSL 加密服务器的链接与非加密的 HTTP 代理服务器的通信.
1.1.2 HTTP 协议版本
1)HTTP/1.0
HTTP/1.0 支持:GET,POST,HEAD 三种 HTTP 请求方法.
2)HTTP/1.1
HTTP/1.1 是当前正在使用的版本.该版本默认采用持久连接,并能很好地配合代理服务器工作.还支持以管道方式同时发送多个请求,以便降低线路负载,提高传输速度.
HTTP/1.1 新增了:OPTIONS,PUT,DELETE,TRACE,CONNECT 五种 HTTP 请求方法.
1.2 请求头部
请求头部由关键字 / 值对组成,每行一对
User-Agent : 产生请求的浏览器类型
Accept : 客户端希望接受的数据类型,比如 Accept:text/xml(application/json)表示希望接受到的是 xml(json)类型
Content-Type:发送端发送的实体数据的数据类型.
比如,Content-Type:text/html(application/json)表示发送的是 html 类型.
Host : 请求的主机名,允许多个域名同处一个 IP 地址,即虚拟主机
1.2.1 Content-Type
常见的 Content-Type:
Content-Type | 解释 |
---|---|
text/html | html 格式 |
text/plain | 纯文本格式 |
text/CSS | CSS 格式 |
text/javascript | js 格式 |
image/gif | gif 图片格式 |
image/jpeg | jpg 图片格式 |
image/png | png 图片格式 |
application/x-www-form-urlencoded | POST 专用:普通的表单提交默认是通过这种方式。form 表单数据被编码为 key/value 格式发送到服务器。 |
application/json | POST 专用:用来告诉服务端消息主体是序列化后的 JSON 字符串 |
text/xml | POST 专用:发送 xml 数据 |
multipart/form-data | POST 专用:下面讲解 |
multipart/form-data
用以支持向服务器发送二进制数据,以便可以在 POST 请求中实现文件上传等功能
现在用 Postman 向百度发送一个请求方式为 multipart/form-data 的 POST 包,请求报文是这样的:
POST / HTTP/1.1
Host: www.baidu.com
Content-Type: multipart/form-data; boundary=----webKitFormBoundary7MA4YWxkTrZu0gW
Cache-Control: no-cache
Postman-Token: 033120fe-2185-15d4-e486-75e86e2baddd
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="url"
https://www.baidu.com/
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="name"
waffle
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="desk"; filename="桌子.jpg"
Content-Type: image/jpeg
------WebKitFormBoundary7MA4YWxkTrZu0gW--
其中, boundary 这个参数是分界线的意思,这个分界线参数具体是什么你可以随意自定义 ,建议定义复杂一点,因为这样子才不会跟请求体中其它字段重复.
上面的例子看出分界线 ="--"+boundary
每个参数都由分界线分隔开,参数名(二进制数据还需要指明文件类型)和参数值之间有一行空行,这个空行不能省略:
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="url"
https://www.baidu.com/
消息主体最后以 --boundary-- 标示结束.
更加详细的解释可以参考: Multipart/form-data
1.3 空行
请求头之后是一个空行,通知服务器以下不再有请求头
1.4 请求体
GET 没有请求数据,POST 有.
与请求数据相关的最常使用的请求头是 Content-Type 和 Content-Length .
2. 响应报文
HTTP 响应报文和请求报文的结构差不多,也是由四个部分组成:
<status-line> //状态行
<headers> //消息报头
<blank line> //空行
<response-body> //响应体
2.1 状态行
状态行也由三部分组成:服务器 HTTP 协议版本,响应状态码,状态码的文本描述
格式:HTTP-Version Status-Code Reason-Phrase CRLF
比如:HTTP/1.1 200 OK
状态码:由 3 位数字组成,第一个数字定义了响应的类别
1xx:指示信息,表示请求已接收,继续处理
2xx:成功,表示请求已被成功接受,处理.
200 OK:客户端请求成功
3xx:重定向
4xx:客户端错误
400 Bad Request:客户端请求有语法错误,服务器无法理解.
401 Unauthorized:请求未经授权,这个状态代码必须和 WWW-Authenticate 报头域一起使用.
403 Forbidden:服务器收到请求,但是拒绝提供服务
404 Not Found:请求资源不存在.比如,输入了错误的 url
5xx:服务器端错误,服务器未能实现合法的请求.
500 Internal Server Error:服务器发生不可预期的错误.
503 Server Unavailable:服务器当前不能处理客户端的请求,一段时间后可能恢复正常,
来源: http://www.jianshu.com/p/0015277c6575