HTTP协议


1.了解一下URL

概念:统一定位符URL:(Unifrom Resource Locator)
其实它就是我们所说的网址。
这里写图片描述
上面图片就是在开始的网络上的网址。一个需要登录信息的网站。

  • http代表协议,这是现在最常用的协议(超文本传输协议)还有就是ftp协议(文件传输协议)
  • 在协议后面必须写上的格式://,不能省略。
  • 然后就是登录信息,用户名:密码
  • @后面是服务器地址就是主机,你所要给谁发出请求的主机以及:服务器端口号(端口号并不是URL必须的,不写默认端口号80)
  • /后面接着文件路径,你所访问的网址所在的目录的路径
    就像你用浏览器在桌面打开一个文件,它所显示的目录
    file:///C:/Users/Administrator/Desktop/Linux%E9%AB%98%E6%80%A7%E8%83%BD%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%BC%96%E7%A8%8B.pdf
    这些就是文件的路径
  • 查询字符串:就是你在网页山所要查询的信息浏览器翻译出来的信息
    https://www.baidu.com/baidu?tn=monline_3_dg&ie=utf-8&wd=urlencode
    ?后面的信息就是查询字符串,urlencode就是你所要查询的内容,wd就相当于key一样,它前面信息是由许多键值对组成。

  • 最后一部分片段标识符表示你在有的网页上底部看到点击这里返回首部就是用来做这个的

    但是在网址中一些字符不能随意出现,已经被URL转义了,所以需要urlencode和urldecode规则
    urlencode转义规则如下:

    将需要转码的字符转为16进制,然后从右到左,取4位(不⾜足4位直接处理),每2位做⼀位,前⾯面加上%,编码成%XY格式
    就像将空格转换为%20,!转换为%21
    而urldecode就是urlencode的逆过程

    2.HTTP协议格式

2.1: HTTP请求消息Request

它包括四部分;请求行,请求头部,空行,请求数据
这里写图片描述

GET请求

GET /562f25980001b1b106000338.jpg HTTP/1.1
(此行是请求行使用的相对URL)
Host: img.mukewang.com
(此行是首部行的开始,这行给出主机的域名)
Connection:close
(告诉服务器发送完文档后可直接释放,还有的选项是keep-alive,
意思就是保持一段时间连接,在该时间内可以继续接收请求)
User-Agent:  Chrome/51.0.2704.106
(表示用户使用的是什么浏览器,这里是谷歌浏览器)
Accept: image/webp,image/*,*/*;q=0.8
Referer: http://www.imooc.com/
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8
(表示用户优先得到的文档是什么语言,这里是中文)

注意最后一行是空行
POST请求

POST / HTTP/1.1/:浏览器所默认的主目录)
Host: www.wrox.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
Gecko/20050225 Firefox/1.0.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 40
Connection: Keep-Alive

name=Professional%20Ajax&publisher=Wiley
  • 第一部分:首行是:[方法]+[url]+[版本]
  • 第二部分:Header: 请求的属性, 冒号分割的键值对;每组属性之间使⽤用换行分隔;遇到空⾏行表⽰示Header部分结束
  • 第三部分:空行,请求头部后面的空行是必须的
  • 第四部分:请求数据也叫主体,可以添加任意的其他数据。

那么GET和POST的区别是什么呢?

2.1.2:GET和POST的区别

  • 直观的区别就是GET把参数包含在URL中,POST通过请求主体(request body)中传递参数
  • 但是你要知道GET和POST是HTTP协议中发送的两种方法,那么HTTP是基于TCP/IP实现的通信协议
  • 所以说GET、POST底层也是TCP/IP协议,都是TCP链接,所以他俩做的事情一样的,你要给GET加上request body,给POST带上url参数,技术上是完全行的通的。
  • 更形象的说,在万维网世界中,TCP就像汽车,我们用它来传输数据,它挺可靠的,一般不会发生丢件少见的现象,但是如果交通路上都是一模一样的汽车,然后汽车都在瞎跑,那肯定就乱套了,所以交通规则HTTP就诞生了,有了GET、POST、PUT、等等,就好像我们世界城市中有公交车道,自行车道,小汽车道一样,都是为了使交通运行更加顺畅。
  • GET就像把数据放在汽车车顶上(URL中)暴露在外面的方便查看和记录,而POST就像把数据放在车厢里(request body中),当然你也可以在GET时在车厢里偷偷藏带点东西,但这是不光彩的,也可以在POST的车顶放点数据,但这看起来有点傻,没有必要。所以HTTP只是个行为准则,而TCP才是GET和POST怎么实现的基本。
  • 在数据传输中,对于GET中的URL是有长度限制的,但是POST不是URL传输,所以理论上不受限制

    • 为什么URL是有限制的呢,因为不同的浏览器和服务器装货和卸货是有成本的,他们会限制单次运输量来控制风险,数据量太大对浏览器和服务器都是很大负担,大多数浏览器通常都会限制url长度在2K个字节,而大多数服务器最多处理64K大小的url。超过的部分,不会处理。如果你用GET服务,在request body偷偷藏了数据,不同服务器的处理方式也是不同的,有些服务器会帮你卸货,读出数据,有些服务器直接忽略,所以,虽然GET可以带request body,也不能保证一定能被接收到
  • GET和POST的最大区别:GET产生一个数据包,POST产生两个数据包

    • 对于GET请求,浏览器会把HTTP报头和和数据一块发送过去,服务器响应200(成功,并返回数据)
    • 对于POSt请求,浏览器先发报头过去,服务器响应100(continue继续发送),浏览器再次发送数据,服务器再响应200(成功,并返回数据)
    • 因为POST需要两步,时间消耗多一点,那么就说明GET比POST更有效吗?其实不是的

      • GET 和POST都有自己的语义,不能随便交叉乱用
      • 在有人研究下,在网络好的情况下发送一次包的时间和两次包的时间差别不大,在网络差的情况下,发两次包对于验证数据包的完整性上更有优点。
      • 还有不是所有浏览器上POST都会发送两次包,Firefox就只发一次

2.2:HTTP响应消息Response

HTTP响应由四个部分组成分别是:状态行、消息报头(也叫首部行)、空行和响应正文。
这里写图片描述

HTTP/1.1 200 OK
Date: Fri, 22 May 2009 06:07:21 GMT
Content-Type: text/html; charset=UTF-8

<html>
      <head></head>
      <body>
            <!--body goes here-->
      </body>
</html>
  • 第一部分:首行:[版本号]+[状态码]+[状态码解释]
  • 第二部分:和请求一样消息报头
    • Date:生成响应的日期和时间;Content-Type:指定了MIME类型的HTML(text/html),编码类型是UTF-8
  • 第三部分:空行,请求头部后面的空行是必须的
  • 第四部分:响应正文,服务器返回给客户端的文本信息,如果服务器返回了一个html页面, 那么html页⾯面内容就是在正文中

    2.3:状态码

    状态码都是三位数字组成,分为5大类,共三十三种

  • 1XX:表示通知信息的,如请求收到或者正文正在进行处理

  • 2XX:表示成功,接收请求或者知道了
  • 3XX:表示重定向,如果要完成请求还必须采取进一步的行动
  • 4XX:表示客户的差错,如果请求中有错误语法或请求不能完成
  • 5XX:表示服务器出错,如服务器失效无法完成请求

    下面是最常见的状态码

常见状态码:

200 OK               //客户端请求成功
302                 //重定向(资源临时移动到别的地方)
400 Bad Request        //客户端请求有语法错误,不能被服务器所理解
403 Forbidden          //服务器收到请求,但是拒绝提供服务
404 Not Found          //请求资源不存在,eg:输入了错误的URL
500 Internal Server Error //服务器发生不可预期的错误

2.4:HTTP常见的头部

  • Content-Type: 数据类型(text/html等)
  • Content-Length: Body的长度
  • Host: 客户端告知服务器, 所请求的资源是在哪个主机的哪个端⼝口上;
  • User-Agent: 声明⽤用户的操作系统和浏览器版本信息;
  • referer: 当前页⾯面是从哪个页⾯面跳转过来的;
  • location: 搭配3xx状态码使⽤, 告诉客户端接下来要去哪⾥里访问;
  • Cookie: ⽤用于在客户端存储少量信息. 通常⽤用于实现会话(session)的功能;

    2.5:HTTP的请求方法

方法说明支持的HTTP版本号
GET获取资源1.0、1.1
POST传输实体主体1.0、1.1
PUT传输文件1.0、1.1
HEAD获取头部1.0、1.1
DELETE删除文件1.0、1.1
OPTIONS询问支持的方法1.1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值