HTTP GET_POST
Http(HyperText Transfer Protocol)超文本传输协议,属应用层协议。其下运输层采用TCP。
Web中,我们经常用它向服务器发送请求,并从服务器处获取信息。例如一次页面的点击加载,浏览器先向指定服务器发送请求,服务器处理请求获得数据后,再次返回。浏览器接受解释完,一个网页就呈现在了我们面前。
请求的方式有很多种,HTTP1.0中只定义了三种GET,POST和HEAD。HTTP1.1中新加入了六种,PUT,DELETE,CONNECT,OPTIONS,TRACE,PATCH。但我们经常使用的还是GET和POST。协议1.0和1.1的区别是什么呢?个人认为主要的区别是是否提供持续连接。
我们知道,http是一种无状态协议,什么是无状态?就是不会保留上次操作。每次发送请求,服务器返回数据后,连接断开,下次请求需要重新建立连接。http1.1中,允许发送完数据后,保留此连接,以供下次请求。往下一层说,可以在一个TCP连接上传送多个HTTP请求。
TCP采用“三握手”的原则建立连接,采用http1.1后,只需第一个http请求建立连接,其后请求时间都节约了一个RTT(往返时间)。
一般在请求头中有Connection参数的就是1.1了,其值为keep-alive时,表示持久连接。相应的为close时,表示完事后关闭连接。如今HTTP2.0也已出世,相较于1.1,2.0采用了新的二进制格式的协议解析,多路复用等等。总之,我们拭目以待吧。
我随意抓了个包,作为参数解释。
我们可以看到这是一个GET请求,第一行称为“请求行”,用来说明请求方式,协议及请求地址。之后的东西叫做请求头,包含一些说明性数据,挑几个常用重要的看下。
Host参数为请求主机的地址,connection解释过了,User-Agent用户代理,这里具体说是浏览器类型。话题发散一下,如果你有写过爬虫,可能经常会遇到请求发送过去,但是返回为空的情况。可能的原因就是UA设置问题,当你用浏览器向服务器发送请求时,请求头里的UA会自动的被设置成浏览器类型,像图中那样。当你编程语言发送请求时,头部里的UA就不再是浏览器了。如果你用过python的requests库的话,你可以尝试将头部输出,它的UA值为python。
换而言之,服务器会根据此字段,分析出这个请求是从哪来的。如果是浏览器,ok没问题正常返回。如果是别的,就认为你可能在搞些什么不可告人的事情,返回空,甚至是不返回。爬虫的伪装原理也是如此,在发送请求前,改掉header,让服务器误以为发送请求的就是浏览器。
拉回来,看下一个参数accept,它指明浏览器能够接收的文件类型,还可以用通配符指明所有类型的文件。后面的encoding和language不需要过多解释了,这是个英语问题,不懂得要回去背单词。
后一个cookie,小甜点(对不起,或许我不应该直接翻译......)。我们好好聊下,前面说到http协议是无状态的,那问题来了,网购的时候,商品会一件件的加入购物车,但我在买下一件商品的时候肯定要换网页,由于协议无状态的特性,回来后发现前一件的数据没了!那可咋整?cookie就是为了解决这个问题出现的。你可以将它简单理解为用户标识,它就是一个标记,你的ID。
打个比方,你在网页上登录某个账号,向服务器发送了请求,服务器在本地生成一个ID并存储起来,给你返回数据的时候,同时将这个ID给你。这之后你在此网站上的所有请求发送时都会加上服务器给你的ID,服务器得到请求后。拿这个ID去比对,如果在数据库里找到了,他就知道和这个ID绑定的操作有哪些。通过这种方式,也就实现了用户的识别。
事物是辩证统一的,有利就有害。试想,你的cookie泄露了,被我截获了。那我只需要修改我的请求数据,就能冒充你进行登录。也因此,cookie的使用与否用户是可以控制的,不同浏览器有不同的设置方式,对应即可。
我们说了请求行,请求头,这之后还有个请求数据的部分。因为是GET请求,即使有用户提交的参数,也是在URL中体现。但当用POST请求时,请求数据部分就要注意了。
GET和POST请求传递参数有什么区别呢?See,当我们用搜索引擎搜索一个关键词时,你会发现URL中的一个参数就是搜索的关键字。例:
其中wd=web,“web”就是我搜索的关键字。GET方式通过将参数写进URL发送出去。URL中“?”之后全部是参数,每个参数之间用&隔开。
试想,在登录的时候采用GET方式请求,用户名和密码全写进去,那就摆明了喊“朝我开炮”。怎么办?这就是POST解决的问题,为了数据的安全性,不将参数写进URL中,而是放进请求数据部分。
从人家那里扣的图,模糊一下。我们来看POST请求,除了请求行,请求头部分。在空行之后还有东西,就是我们说的请求数据部分。图中传递了是哪个参数name,password和realName。如此这般,数据就不用放到URL里面了。
头部与数据部分之间的换行一定不能缺少,它是用来区分开两部分的。空行的意思就是,头部消息结束了,接下来的是数据。
除此之外,在图中标框的部分,这是一般在GET请求头中没有的,如果你抓包是GET方式的请求,想换成POST请求发送。除了请求行改为POST,数据参数写在末端之外。图中那两个参数也需要写入,不然是伪装不成功的。length一般会根据你发送的数据自动写入,重要的是,不要忘记Content-Type,表示具体请求中的媒体类型信息。
说完了request请求,简单说下response响应。请求分为请求行,请求头,请求数据三部分。相应同样的也分为三部分,状态码,响应头,响应数据。我们抛开响应头和响应数据不说(和请求一样),聊聊状态码。
我们最常见的状态码是404,找不到网页。是不是一下就知道状态码是干什么用的了。
状态码有很多,大致分为五类,简单了解下即可。