Http请求 - 计算机网络复习笔记

Http请求 - 计算机网络复习笔记

Http请求是客户端放在Http协议请求报文头起始行中用来向服务器进行对应请求操作的方式。

Http请求报文的组成

一个HTTP请求报文由请求行(request line)请求头部(headers)空行(blank line)请求数据/消息正文(request body/entity) 4个部分组成。

在这里插入图片描述

Http请求报文-请求行

Method–空格–URL–空格–Version–换行

请求行分为三个部分:请求方法、请求地址URL和HTTP协议版本,它们之间用空格分割。例如,GET /index.html HTTP/1.1。

请求方法:表示对资源的操作和请求
URL:表示要请求和操作的资源的URL
版本:表示当前的Http版本

Http请求方法

HTTP/1.1 定义的请求方法有8种:

  • GET(完整请求一个资源)
  • POST(提交表单)
  • PUT(上传文件)
  • DELETE(删除)
  • PATCH、HEAD(仅请求响应首部)
  • OPTIONS(返回请求的资源所支持的方法)
  • TRACE(追求一个资源请求中间所经过的代理)

最常的两种GET和POST,如果是RESTful接口的话一般会用到GET、POST、DELETE、PUT。


在这里插入图片描述

GET

当客户端要从服务器中读取文档时,当点击网页上的连接或者是在浏览器的地址栏中输入网址来浏览网页时,用到的都是GET请求。
GET请求会要求服务器将URL中定位的资源放在响应报文的数据部分,并返回给客户端。使用GET时请求参数和对应的值将会放在URL后面并用一盒?问号隔开,所以GET方式的请求报文一般不包括“请求数据”部分,但是使用GET方法请求数据时参数的长度会受到限制。

缺点:由于请求参数和对应的值直接附加到URL后,显然这种方式不适合传送私密数据。此外,由于不同浏览器对地址的字符限制不同,一般最多只能识别1024个字符,有时也不适合用GET方式夹带大量请求参数和数据。用GET方式传递参数时,如果数据时英文字母/数字,则原样发送;如果是空格,转换为+;如果是中文/其他字符,则用BASE64加密,如%E4%BD%A0%E5%A5%BD,其中%XX中的XX对应该符号的16进制的ASCII码

POST

当客户端向服务器提供的信息或者参数较多时,就用到POST请求方法向服务器提交数据。与GET相比,POST可以提供大量数据,因为POST方式对传送的数据大小没有限制,而且也不会显示在URL中。所以POST请求行中不包含数据字符串,这些数据将保存在Http请求报文中的请求数据部分,个数据之间同样使用&隔开。POST方式一般应用于客户端向服务器提交表单。

GET和POST的区别

数据位置不同:GET请求的请求参数和数据会附加到URL之后,以?隔开URL和数据部分,多个参数之间也用&隔开,URL的编码格式采用的是ASCII编码,而不是unicode,对于一些非ASCII码的字符如:中文字符等,都要转换成16进制的ASCII码才能传输,空格转换成+; POST请求则把数据部分放置在HTTP请求报文的包体(消息正文)中。

传输数据的能力:由于GET请求的数据和请求参数等是直接放在起始行的URL后的,对于一般的浏览器和服务器来说,能识别的字符只有1024个,所以GET方式并不适用与传递大量请求参数和数据;而对于POST来说,由于POST方式对传送的大小没有限制,所以POST可以用来向浏览器提交大量数据如表单等,但是实际上各个服务器会规定对POST提交数据大小进行限制,Apache、IIS都有各自的配置。

安全性:由于GET请求参数和数据放在URL之后,GET请求的数据是直接暴露在起始行的URL中的,是对于传输数据来说非常不安全的一种请求方式。

传输方式上 GET产生一个TCP数据包,浏览器会把http header和data一并发送出去,服务器响应200(返回数据); 而POST产生两个TCP数据包,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据),但并不是所有的POST都会产生两个TCP数据包,具体要看浏览器配置如firefoxPOST方法就只会上传一个TCP包。

后退页面的反应:GET请求页面后退时,不产生影响,当POST请求被服务器后退是,浏览器会重新提交POST请求。

缓存性
GET请求是可以缓存的,GET请求会被浏览器主动cache
POST请求不可以缓存,而POST不会,除非手动设置

POST不能进行管道化传输
对于HTTP协议来说,为了避免头部阻塞问题,提高系统的效率,在http/1.1中,用管道通信的方式进行速度优化:把需要发送到服务器上的所有请求放到输出队列中,在第一个请求发送出去后,不等到收到服务器的应答,第二个请求紧接着就发送出去,但是这样的方式有一个问题:不安全,如果一个管道中有10个连接,在发送出9个后,突然服务器告诉你,连接关闭了,此时客户端即使收到了前9个请求的答复,也会将这9个请求的内容清空,也就是说,白忙活了……此时,客户端的这9个请求需要重新发送。这对于幂等请求还好(比如get,多发送几次都没关系,每次都是相同的结果),如果是post这样的非幂等请求(比如支付的时候,多发送几次就惨了),肯定是行不通的。所以POST不能进行管道化传输。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值