HTTP协议 学习
首先 附上 官方解释 和 别人的总结
官方解释 打开后 第14 Header Field Definitions 将header说的很清楚
http protocol (超文本传输协议) 主要用于浏览器和web服务器之间的通信. 而且一般明文传输 如果需要加密传输 可以使用 https
http协议由三部分组成:
请求行 : 方法(post get等) [空格] 请求URI [空格] 版本号 [回车换行]
如: GET /index.html HTTP/1.1
或 POST http://192.168.2.217:8080/index.jsp HTTP/1.1
头信息(分为 通用消息头 | 请求头 | 实体头 | 响应头) 每个头域由一个域名,冒号(:)和域值三部分组成. 头信息结束时需要一个空行和实体数据部分分开
实体头包括Allow、Content- Base、Content-Encoding、Content-Language、 Content-Length、Content-Location、Content-MD5、Content-Range、Content-Type(这个很重要)、 Etag、Expires、Last-Modified、extension-header。
Accept-Encoding:浏览器能够进行解码的数据编码方式,比如gzip。Servlet能够向支持gzip的浏览器返回经gzip编码的HTML页面。许多情形下这可以减少5到10倍的下载时间;
Accept代表请求头 – specify certain media types which are acceptable for the response. 就是表名客户端希望接受的MIME类型.
比如:Accept:text/xml; 代表客户端希望接受的数据类型是xml类型
Content-Type代表发送端(客户端|服务器)发送的实体数据的数据类型。
比如:Content-Type:text/html; 代表发送端发送的数据格式是html。二者合起来,
Accept:text/xml;
Content-Type:text/html
即代表希望接受的数据类型是xml格式,本次请求发送的数据的数据格式是html。实体内容 实体数据在请求时,如果以post方式提交时存储参数,以get方式请求时为空。在响应时,存储服务器端反馈的HTML源代码的数据
Content-Type
类型速查表:http://www.runoob.com/http/http-content-type.html
常见的cotent-Type的值
application/x-www-form-urlencoded
这个在form表单提交的时候 不设置enctype属性 则会以这种方式提交 如:
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
首先,Content-Type 被指定为 application/x-www-form-urlencoded;
其次,提交的数据按照 key1=val1&key2=val2 的方式进行编码,key 和 val 都进行了 URL 转码。multipart/form-data
form上设置enctype=”multipart/form-data” 或 上传文件时也会 如在js中利用formData上传视频或图片 content-Type为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 用于分割不同的字段(这个在form-data后面一般都有的),为了避免与正文内容重复,boundary 很长很复杂.
然后 Content-Type 里指明了数据是以 mutipart/form-data 来编码,本次请求的 boundary 是什么内容。消息主体里按照字段个数又分为多个结构类似的部分,每部分都是以 –boundary 开始,紧接着内容描述信息,然后是回车,最后是字段具体内容(文本或二进制)。如果传输的是文件,还要包含文件名和文件类型信息。消息主体最后以 –boundary– 标示结束
application/json
用来告诉服务端消息主体是序列化后的 JSON 字符串.各大浏览器都原生支持 JSON.stringify,服务端语言也都有处理 JSON 的函数,使用 JSON 不会遇上什么麻烦。
以前在提交表单的时候 后台有的时候获取不到值 会认为是 后台问题 这个时候 可以看看在google浏览器F12 下的Network里查看前台是否有你发送的数据(在query parameters 或其他 地方)
常用的请求方式是GET和POST.
GET方式:是以实体的方式得到由请求URI所指定资源的信息,如果请求URI只是一个数据产生过程,那么最终要在响应实体中返回的是处理过程的结果所指向的资源,而不是处理过程的描述。
POST方式:用来向目的服务器发出请求,要求它接受被附在请求后的实体,并把它当作请求队列中请求URI所指定资源的附加新子项,Post被设计成用统一的方法实现下列功能:
1:对现有资源的解释;
2:向电子公告栏、新闻组、邮件列表或类似讨论组发信息;
3:提交数据块;
4:通过附加操作来扩展数据库 。
从上面描述可以看出,Get是向服务器发索取数据的一种请求;而Post是向服务器提交数据的一种请求,要提交的数据位于信息头后面的实体中。
GET与POST方法有以下区别:
(1) 在客户端,Get方式在通过URL提交数据,数据在URL中可以看到;POST方式,数据放置在HTML HEADER内提交。
(2) GET方式提交的数据最多只能有1024字节,而POST则没有此限制。
(3) 安全性问题。正如在(1)中提到,使用 Get 的时候,参数会显示在地址栏上,而 Post 不会。所以,如果这些数据是中文数据而且是非敏感数据,那么使用 get;如果用户输入的数据不是中文字符而且包含敏感数据,那么还是使用 post为好。
这个参考:http://www.blogjava.net/zjusuyong/articles/304788.html
http状态码
分为5类
分类 | 分类描述 |
---|---|
1** | 信息,服务器收到请求,需要请求者继续执行操作 |
2** | 成功,操作被成功接收并处理 |
3** | 重定向,需要进一步的操作以完成请求 |
4** | 客户端错误,请求包含语法错误或无法完成请求 |
5** | 服务器错误,服务器在处理请求的过程中发生了错误 |