一、HTTP协议-Request

HTTP报文是面向文本的,报文中的每一个字段都是一些ASCII码串,各个字段的长度是不确定的。HTTP有两类报文:请求报文和响应报文。

1.1 HTTP请求报文

- 一个HTTP请求报文由请求行(request line)、请求头部(header)、空行和请求数据4个部分组成
![](https://img2018.cnblogs.com/blog/1226829/201810/1226829-20181008175726181-1924115506.png)

<request-line>

<headers>

<blank line>

[<request-body>

 

1.1.2 求情头-Request Header

- 第一行:三个字段,中间用空格隔开
请求方法 URL HTTP版本
 
如:GET /home.html HTTP/1.1。
 
常用的请求方法:
HTTP协议的请求方法有GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT。

1.1.3 GET方法

GET方法要求服务器将URL定位的资源放在响应报文的数据部分,回送给客户端。
意思是:GET方法会把请求数据附在URL后面一并提交到后台
URL与请求数据之间用? 问号分割,(?)之后表示URL结束,请求数据开始,多个请求数据之间使用 & and符号连接

如百度:我在百度一下输入-> 博客园 c_G-17

地址栏请求信息为:https://www.baidu.com/s?wd=博客园 c_G-17&rsv_spt=1&.........

后面省略了cookie信息:?问号分割了URL 和我的请求数据,& 符号把我的搜索内容(博客园 c_G-17)和cookie信息连接到一起了

如下图:我省略了关键信息的请求头

GET /s?wd=博客园%20c_G-17&rsv_spt=1&...省略部分请求数据... HTTP/1.1
Host: www.baidu.com
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Referer: https://www.baidu.com/
Accept-Encoding: gzip, deflate, sdch, br
Accept-Language: zh-CN,zh;q=0.8
Cookie: xxxxx;
BDUSS=xxxx

可以看到,GET方式的请求一般不包含”请求内容”部分,请求数据以地址的形式表现在请求行。

地址中”?”之后的部分就是通过GET发送的请求数据,我们可以在地址栏中清楚的看到,各个数据之间用”&”符号隔开。显然,这种方式不适合传送私密数据。另外,由于不同的浏览器对地址的字符限制也有所不同,一般最多只能识别1024个字符,所以如果需要传送大量数据的时候,也不适合使用GET方式。

 

1.1.4 POST 方法

POST方法将请求参数封装在HTTP请求数据中,以名称/值的形式出现,可以传输大量数据,这样POST方式对传送的数据大小没有限制,而且也不会显示在URL中

  • 以登录百度为例:发送POST请求-> 数据不会跟在URL后面,而是在 Body 请求内容里

    下面为请求:请求内容Form表单中有很多内容,太长了,我就省略了,留下了部分关键的

    请求内容与请求头之间用空行隔开如下
POST /v2/api/?login HTTP/1.1
Host: passport.baidu.com
Connection: keep-alive
Content-Length: 1415
Cache-Control: max-age=0
Origin: https://www.baidu.com
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36
Content-Type: application/x-www-form-urlencoded
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Referer: https://www.baidu.com/
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.8
Cookie:xxxx staticpage=https://www.baidu.com/xxxx.html&charset=UTF-8&token=省略&tpl=省略&apiver=省略&tt=省略&isPhone=false&detect=1&gid=不给看&logintype=dialogLogin&logLoginType=pc_loginDialog&username=这儿是我的用户名&password=这儿是登录密码&mem_pass=on&rsakey=省略&dv=省略&callback=parent.bd__pcbs__9cgwpx

可以看到,POST方式请求行中不包含数据字符串,这些数据保存在”请求内容”部分,各数据之间也是使用”&”符号隔开。POST方式大多用于页面的表单中。因为POST也能完成GET的功能,因此多数人在设计表单的时候一律都使用POST方式,其实这是一个误区。GET方式也有自己的特点和优势,我们应该根据不同的情况来选择是使用GET还是使用POST。

 

1.2 POST 中内容解释

- 以下为 POST 中的内容解释:从上而下顺序排列
1. HEAD
2. 请求头
3. 空行
4. 请求数据

 

1.2.1 HEAD

HEAD就像GET,只不过服务端接受到HEAD请求后只返回响应头,而不会发送响应内容。当我们只需要查看某个页面的状态的时候,使用HEAD是非常高效的,因为在传输的过程中省去了页面内容。

 

1.2.2 请求头

- 请求头部由关键字/值对组成,每行一对,关键字和值用英文冒号“:”分隔。请求头部通知服务器有关于客户端请求的信息,典型的请求头有:

  1. User-Agent:产生请求的浏览器类型。

  2. Accept:客户端可识别的内容类型列表。

  3. Host:请求的主机名,允许多个域名同处一个IP地址,即虚拟主机。

 

1.2.3 空行

最后一个请求头之后是一个空行,发送回车符和换行符,通知服务器以下不再有请求头。

 

1.2.4 请求数据

请求数据不在GET方法中使用,而是在POST方法中使用。POST方法适用于需要客户填写表单的场合。与请求数据相关的最常使用的请求头是Content-Type和Content-Length。

 

1.3 HTTP请求报文

HTTP响应也由三个部分组成,分别是:状态行、消息报头、响应正文。

如下所示,HTTP响应的格式与请求的格式十分类似:

<status-line>

<headers>

<blank line>

[<response-body>]

列如:刚才登录百度给我返回的HTTP报文如下

HTTP/1.1 200 OK
Access-Control-Expose-Headers: Trace-ID
Cache-Control: public
Connection: keep-alive
Content-Encoding: gzip
Content-Type: text/html
Date: Mon, 08 Oct 2018 10:41:47 GMT
Expires: 0
Last-Modified: Mon, 08 Oct 2018 10:41:46 10OctGMT
P3p:省略
Pragma: public
Server: Apache
Strict-Transport-Security: max-age=31536000
Trace-Id: C6633601
Tracecode: 省略
Tracecode: 省略
Vary: Accept-Encoding
Transfer-Encoding: chunked

 

1.4HTTP请求GET和POST的区别
  1. GET提交,请求的数据会附在URL之后(就是把数据放置在HTTP协议头<request-line>中),以?分割URL和传输数据,多个参数用&连接;例如:login.action?name=hyddd&password=idontknow&verify=%E4%BD%A0 %E5%A5%BD。如果数据是英文字母/数字,原样发送,如果是空格,转换为+,如果是中文/其他字符,则直接把字符串用BASE64加密,得出如: %E4%BD%A0%E5%A5%BD,其中%XX中的XX为该符号以16进制表示的ASCII。

     

    POST提交:把提交的数据放置在是HTTP包的包体<request-body>中。上面我登录百度的事例,请求体就是实际的传输部分数据(嫌烦我省略了部分,还剩部分)

     

    因此,GET提交的数据会在地址栏中显示出来,而POST提交,地址栏不会改变

  2. 传输数据的大小:

     

    首先声明,HTTP协议没有对传输的数据大小进行限制,HTTP协议规范也没有对URL长度进行限制。 而在实际开发中存在的限制主要有:

     

    GET:特定浏览器和服务器对URL长度有限制,例如IE对URL长度的限制是2083字节(2K+35)。对于其他浏览器,如Netscape、FireFox等,理论上没有长度限制,其限制取决于操作系统的支持。

     

    因此对于GET提交时,传输数据就会受到URL长度的限制。

     

    POST:由于不是通过URL传值,理论上数据不受限。但实际各个WEB服务器会规定对post提交数据大小进行限制,Apache、IIS6都有各自的配置。

  3. 安全性:

     

    POST的安全性要比GET的安全性高。注意:这里所说的安全性和上面GET提到的“安全”不是同个概念。上面“安全”的含义仅仅是不作数据修改,而这里安全的含义是真正的Security的含义,比如:通过GET提交数据,用户名和密码将明文出现在URL上,因为(1)登录页面有可能被浏览器缓存, (2)其他人查看浏览器的历史纪录,那么别人就可以拿到你的账号和密码了,

 

二、HTTP常用状态码

楼主参考的Django restful 规范

 

  1. 1xx: 系列表示请求已接收,继续处理

    100

  2. 2xx:成功--表示请求已被成功接收、理解、接受

    200 ok 表示请求成功返回网页

    201 CREATED - [POST/PUT/PATCH]:用户新建或修改数据成功。

    202 Accepted - [*]:表示一个请求已经进入后台排队(异步任务)

    204 NO CONTENT - [DELETE]:用户删除数据成功

  3. 3xx:表示重定向,要完成请求必须进行更进一步的操作

    301 永久跳转

    302 临时跳转,请求的网页已临时跳转到新位置。

  4. 4xx:客户端错误--请求有语法错误或请求无法实现

    400 INVALID REQUEST - [POST/PUT/PATCH]:用户发出的请求有错误,服务器没有进行新建或修改数据的操作,该操作是幂等的

    401 Bad Request 表示用户没有权限(令牌、用户名、密码错误)。这个状态代码必须和WWW-Authenticate报头域一起使用。配合身份验证

    403 Forbiddent 表示用户得到授权(与401错误相对),但是访问是被禁止的,服务器收到请求但是拒绝提供服务

    404 Not Found

    406 Not Acceptable - [GET]:用户请求的格式不可得(比如用户请求JSON格式,但是只有XML格式)。

    410 Gone -[GET]:用户请求的资源被永久删除,且不会再得到的。

    422 Unprocesable entity - [POST/PUT/PATCH] 当创建一个对象时,发生一个验证错误。

  5. 5xx:服务器端错误--服务器未能实现合法的请求

    500 - Internal Server Error(内部服务器错误)

    502 - Bad Gateway(坏的网关), 一般是网关服务器请求后端服务时,后端服务没有按照 http 协议正确返回结果。

    503 - Service Unavailable(服务当前不可用), 可能因为超载或停机维护。

    504 - Gateway Timeout(网关超时), 一般是网关服务器请求后端服务时,后端服务没有在特定的时间内完成服务。

HTTP协议,Http 常用状态码的更多相关文章

  1. Java Web学习总结(21)——http协议响应状态码大全以及常用状态码

    http协议响应状态码大全以及常用状态码 当我们在浏览网页或是在查看服务器日志时,常会遇到3位数字的状态码,这3位数字是什么意思呢?其实,这3位数字是HTTP状态码,用来表示网页服务器HTTP响应状态 ...

  2. HTTP协议常用状态码

    HTTP协议常用状态码   <?php    send_http_status(404);   /**  * HTTP Protocol defined status codes * HTTP协 ...

  3. HTTP协议6之状态码--转

    HTTP状态码,我都是现查现用. 我以前记得几个常用的状态码,比如200,302,304,404, 503. 一般来说我也只需要了解这些常用的状态码就可以了.  如果是做AJAX,REST,网络爬虫, ...

  4. HTTP协议 -- 认清协议常用状态码

    HTTP协议作为web服务的基础,理所应当受到重视,但是周围的同事能够讲清楚HTTP协议的凤毛麟角.既然是基础,就应该早一点掌握,所以近半年(2016-2月——2016年6月),不准备学习新技术了.首 ...

  5. http协议(四)http常用状态码

    一:http状态码 表示客户端http请求的返回结果.标记服务器端的处理是否正常.通知出现的错误等工作 状态码的类别如下: http状态码种类繁多,大概有60多种,实际上经常使用的只有14种,下面为一 ...

  6. http协议与常见状态码

    什么是http: http是属于应用层(基于tcp的连接方式)的面向对象的协议,是计算机通过网络通信的规则,使得浏览器向web服务器请求信息和服务 http协议特点: http是一种无状态协议(对食物 ...

  7. http协议中的状态码(status code),超文本传输协议状态码

    HTTP协议,又叫超文本传输协议. 在项目的开发过程中,前后端交互,这个用的是最多的,在后端给我的的接口调用时,我们往往先查看这个协议的状态码,状态码正常了,才进一步去看我们从后太拿的数据,是否为我们 ...

  8. 关于HTTP协议与HTTP状态码的简要介绍

    在互联网时代HTTP协议的重要性无需多言,对于技术岗位的同学们来说理解掌握HTTP协议是必须的.本篇博客就从HTTP协议的演进.特性.重要知识点和工作中常见问题的总结等方面进行简单的介绍.理解掌握了这 ...

  9. HTTP常用状态码分析

    不管是面试还是工作中,经常会碰到需要通过HTTP状态码去判断问题的情况,比如对于后台RD,给到前端FE的一个接口,出现502或者504 error错误,FE就会说接口存在问题,如果没有知识储备,那就只 ...

随机推荐

  1. {windows故障}关于WIN7故障模块StackHash_0a9e解决方法

    问题背景:我给同事重装好系统后,想用驱动精灵(网卡版)给新系统安装驱动,但是在安装驱动精灵的过程中老是出现标题的问题,windows停止工作,导致无法安装,最后看到这两个方法后,把网络适配器禁用,然后 ...

  2. php函数long2ip与ip2long()

    long2ip - Converts an long integer address into a string in (IPv4) Internet standard dotted format s ...

  3. Git Extensions 使用小结

    1.查看仓库 2.创建分支 然后会自动创建一个 Commit ,推送到远端分支即可. 3.合并分支 注意1.自动提交需要没有无法自动合并的冲突才行. 注意2.快进线指的是将别人的提交原封不动附加到自己 ...

  4. March 05th, 2018 Week 10th Monday

    Fortune favors the bold. 勇者天佑. It has been increasingly apparent that courage is the main quality we ...

  5. C语言 汉诺塔问题

    //凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 汉诺塔是由三根杆子A,B,C组成的.A杆上有n个(n>1)穿孔圆盘,盘的尺寸由下到上依次变小.要求按 ...

  6. 记录参加QCon2017北京站的心得

    如有侵权,请告知作者删除.scottzg@126.com 很荣幸参加QCon全球软件开发大会,这里特别感谢我们部门的总经理,也是<互联网广告算法和系统实践>此书的作者王勇睿.因为他我才有这 ...

  7. 超简单的gif图制作工具

    测试成功了: 软件灵者Gif录制1.0 使用方法注意: 扩展: 安卓端想要制作gif可参考此方法(还没测试):https://blog.csdn.net/u012604745/article/deta ...

  8. CAS适用场景

    转载:http://www.jb51.net/article/86192.htm 下面小编就为大家带来一篇Java并发编程总结——慎用CAS详解.小编觉得挺不错的, 现在就分享给大家,也给大家做个参考 ...

  9. centos7下kubernetes(3。部署kubernetes)

    环境:三个centos7 K8s2是Master;K8s1是node1:K8s3是node2 官方文档:https://kubernetes.io/docs/setup/independent/ins ...

  10. 【转】AJAX请求和普通HTTP请求区别

    两者本质区别: AJAX通xmlHttpRequest象请求服务器服务器接受请求返数据实现刷新交互 普通http请求通httpRequest象请求服务器接受请求返数据需要页面刷新 AJAX请求 普通请 ...