超文本传输协议(http)是一个基于应用层的协议
Uniform Resource Locator(统一资源定位符), 格式:
schema://host[:port#]/path/[?query-string][#anchor]
一般http请求的格式如下:
METHOD URL HTTP-VERSION
Request Header
空行
Request Body
例如:
GET http://www.cnblogs.com/ HTTP/1.1
Host:www.cnblogs.com
name: zhangsan
相应格式:
HTTP-VERSION status-code message
Response Header
空行
Response Body
参考MDN
以下三个组合可以告诉浏览器不要缓存:
Expires: 0 服务器通过这个头,告诉浏览器把会送的资源缓存多长时间,-1或0,则是不缓存
Cache-Control: no-cache
Pragma: no-cache
*/
—————————–195362999817818974031690194806 // 头部boundary Content-Disposition: form-data; name=”userfile”; filename=”vcpg” // 内容属性,form-data; name=”服务器用于接收文件的参数名”: filename=”文件被发送给服务器时所使用的名称” Content-Type: application/octet-stream // 万能文件类型 // 空行 // 文件内容开始 //… // 文件内容结束 —————————–195362999817818974031690194806– // 尾部boundary,其紧贴文件内容的结尾
- 多文件上传
—————————–418888951815204591197893077 // 文件1的头部boundary Content-Disposition: form-data; name=”userfile[]”; filename=”文件1.md” Content-Type: text/markdown // 空行 // 文件1内容开始 // … // 文件1内容结束 —————————–418888951815204591197893077 // 文件2的头部boundary Content-Disposition: form-data; name=”userfile[]”; filename=”文件2” Content-Type: application/octet-stream // 空行 // 文件2内容开始 // … // 文件2内容结束 —————————–418888951815204591197893077 // 文件3的头部boundary Content-Disposition: form-data; name=”userfile[]”; filename=”文件3” Content-Type: application/octet-stream // 空行 // 文件3内容开始 // … // 文件3内容结束 —————————–418888951815204591197893077 // 参数username的头部boundary Content-Disposition: form-data; name=”username”
zhangsan —————————–418888951815204591197893077 // 参数password的头部boundary Content-Disposition: form-data; name=”password”
zhangxx —————————–418888951815204591197893077– // 尾部boundary,表示结束
### 常见的POST提交数据
#### application/x-www-form-urlencoded
这应该是最常见的 POST 提交数据的方式了。浏览器的原生 <form> 表单,如果不设置 enctype 属性,那么最终就会以 application/x-www-form-urlencoded 方式提交数据。请求类似于下面这样(无关的请求头在本文中都省略掉了):
POST http://www.example.com HTTP/1.1 Content-Type: application/x-www-form-urlencoded;charset=utf-8
title=test&sub%5B%5D=1&sub%5B%5D=2&sub%5B%5D=3
在chrome的network里面显示的是form-data,可用getParameter获取
#### multipart/form-data
我们使用表单上传文件时,必须让 <form> 表单的 enctype 等于 multipart/form-data。示例:
POST http://www.example.com HTTP/1.1 Content-Type:multipart/form-data; boundary=—-WebKitFormBoundaryrGKCBY7qhFd3TrwA
——WebKitFormBoundaryrGKCBY7qhFd3TrwA Content-Disposition: form-data; name=”text”
title ——WebKitFormBoundaryrGKCBY7qhFd3TrwA Content-Disposition: form-data; name=”file”; filename=”chrome.png” Content-Type: image/png
PNG … content of chrome.png … ——WebKitFormBoundaryrGKCBY7qhFd3TrwA–
首先生成了一个 boundary 用于分割不同的字段,为了避免与正文内容重复,boundary 很长很复杂。然后 Content-Type 里指明了数据是以 multipart/form-data 来编码,本次请求的 boundary 是什么内容。消息主体里按照字段个数又分为多个结构类似的部分,每部分都是以 --boundary 开始,紧接着是内容描述信息,然后是回车,最后是字段具体内容(文本或二进制)。如果传输的是文件,还要包含文件名和文件类型信息。消息主体最后以 --boundary-- 标示结束。
#### application/json
例如AngularJS中Ajax请求,默认提交JSon
// http post var data = {‘title’:’test’, ‘sub’ : [1,2,3]}; $http.post(url, data).success(function(result) { … });
// http request POST http://www.example.com HTTP/1.1 Content-Type: application/json;charset=utf-8
{“title”:”test”,”sub”:[1,2,3]}
这个时候就不是form-data,而是Request-payLoad,如果要接受,需要用InputStream从body里面获取
#### application/xml
用的很少,是一种XML-RPC
### http常见知识点
#### 301和302的区别
- 301 redirect: 301 代表永久性转移(Permanently Moved)
- 302 redirect: 302 代表暂时性转移(Temporarily Moved )
301和302都代表重定向,也就是说浏览器拿到这个状态码后会自动跳转到一个新地址,这个地址可以从`Location`中获取。
不同点在于301表示旧地址A的资源已经被永久地移除了(这个资源不可访问了),搜索引擎在抓取新内容的同时也将旧的网址交换为重定向之后的网址;302表示旧地址A的资源还在(仍然可以访问),这个重定向只是临时地从旧地址A跳转到地址B,搜索引擎会抓取新的内容而保存旧的网址