HTTP 小结

1 HTTP1.0/1.1/2.0/3.0 区别

  • 1.0 默认一次请求-响应,建立一个连接,用完关闭;每一个请求都要建立一个连接。但浏览器都支持同时多个TCP的连接。Connection: close 默认关闭。
  • 1.1 支持持续连接,分为非pipelining和pipelining,非pipelining就是收到前一个响应后才能发出下一个请求,而pipelining则客户端不用等待上一次请求结果返回,就可以发出下一次请求,但服务器端必须按照接收到客户端请求的先后顺序依次返回响应结果,存在着队头阻塞的情况。Connection: Keep-Alive,默认开启的。
  • 2.0 支持多路复用,复用TCP连接,在一个连接里,客户端和浏览器都可以同时发送多个请求或回应,而且不用按照顺序一一对应,这样就避免了"队头堵塞"(但因为用的TCP协议,TCP使用确认机制,可能出现TCP的队头阻塞)。支持二进制分帧,将请求和响应数据分割为更小的帧。支持服务器推送,允许服务端推送资源给客户端。
  • 3.0 基于UDP协议,省去了三次握手的消耗。多路复用,彻底解决 TCP 中队头阻塞的问题。

2 GET/POST 区别

  • 1、语义来说,GET是获取数据,即从服务端客户端,POST是提交数据,从客户端到服务端。如果反过来用也是可以的,但这不符合惯例。
  • 2、GET请求参数是通过URL传递的,多个参数以&连接,POST请求通常放在request body中。
  • 3,GET会被缓存,被历史记录保留,而POST不会。
  • 4,编码方式:GET请求只能进行url编码,而POST支持多种编码方式( application/x-www-form-urlencoded 或 multipart/form-data)。
  • 5,GET的数据类型只允许ASCII,而POST没有限制。
  • 6,GET是一个TCP包,而POST可能是两个,当首个包返回100时,再提交第二个包。
  • 7,GET的URL长度有限制,POST无限制。
    最主要的区别就是1,其他的区别基本上都是浏览器实现的区别。

3 浏览器敲下回车后发生了什么

1、解析URI,区分出host、path、query。
2,检查缓存,如果存在且在有效期直接展示。
3、查询Host文件获取IP,如果查询不到,则由DNS进行解析获取IP地址。
4、根据IP和端口(80/443)进行三次握手,建立TCP连接。
5、发送请求报文,由请求行(GET/POST,path,HTTP/1.1)、首部行(见3常用字段)构成。
6,传输层增加TCP首部,网络层增加IP首部
7,判断是否同一个网络,是则根据MAC地址发送给,否则使用路由表查找下一跳地址,以及使用 ARP 协议查询它的 MAC 地址。
8,接受响应报文,由状态行(HTTP/1.1 200 OK),首部行我(见3常用字段)构成
9,浏览器通过解析HTML,生成DOM树,解析CSS,生成CSS规则树,然后通过DOM树和CSS规则树生成渲染树。绘制各个节点并展示。
要注意的是,浏览器的解析过程并非是串连进行的,比如在解析CSS的同时,可以继续加载解析HTML,但在解析执行JS脚本时,会停止解析后续HTML,这就会出现阻塞问题。
10,断开链接。

4 HTTP常用字段

request:
Host:域名
Accept:具体类型如applicaiton/json,text/html
Accept-encoding:压缩算法,如gzip
Accept-language:语言,如en-US,zh-CN
Cache-control:缓存控制
cookie:
User-agent:请求标识
Connection:长链接,如keep-alive

If-Modified-Since:之前response返回的last-modified
If-None-Match:之前response返回的Etag,优先于If-Modified-Since。
//以下仅POST使用
Content-length:文件长度

response:

date:时间
Server:
Etag:文件校验码
content-type:文件类型,如text/html
content-length:文件长度
content-encoding:压缩算法,如gzip
Last-modified:最后修改时间
Connection:长链接,如keep-alive
expires:过期时间,是一个绝对时间,如expires: Thu, 10 Nov 2015 08:45:11 GMT,和last-modified配合,这个时间是基于服务器的,在判断有效期时和客户端的时间做比对,当客户端时间不准确时,容易产生误差。
Cache-control:max-age=10 缓存时间(单位s),相对时间,优先于expires。

HTTP的缓存策略是,当请求时,判断本地(磁盘/内存)是否有缓存,以及是否在有效期,如果在有效期则直接使用。否则发起请求时,带上If-Modified-Since、If-None-Match,由服务端判断缓存是否过期,当返回304(未修改)则继续使用本地缓存,否则会返回新的数据。

4 iOS 中请求缓存

NSURLRequest有个属性cachePolicy,用来配置缓存策略

typedef NS_ENUM(NSUInteger, NSURLRequestCachePolicy)
{
    NSURLRequestUseProtocolCachePolicy = 0,
    NSURLRequestReloadIgnoringLocalCacheData = 1,
    NSURLRequestReloadIgnoringLocalAndRemoteCacheData = 4,
    NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData,

    NSURLRequestReturnCacheDataElseLoad = 2,
    NSURLRequestReturnCacheDataDontLoad = 3,
    NSURLRequestReloadRevalidatingCacheData = 5,
};

1,NSURLRequestUseProtocolCachePolicy表示使用HTTP的缓存策略,这也是默认的策略。
2,NSURLRequestReloadIgnoringLocalCacheData表示忽略本地缓存,即直接发起请求,请求头中没有if none match, if modified since参数。
3,NSURLRequestReloadIgnoringLocalAndRemoteCacheData
4,NSURLRequestReturnCacheDataElseLoad,优先使用本地缓存,没有再去发起请求,注意使用本地缓存时,并不会校验时间是否过期。
5,NSURLRequestReturnCacheDataDontLoad,只使用本地缓存,不会校验时间是否过期,当有缓存时,效果和NSURLRequestReturnCacheDataElseLoad一样。
6,NSURLRequestReloadRevalidatingCacheData,
忽略本地缓存,直接发起请求,但请求头会带上中if none match, if modified since参数,由服务端来进行有效性校验。iOS 13之前无效。

当指定使用缓存的策略,且本地有缓存,则不会发起请求,但URLSession的一些代理方法还会执行的。但如didReceiveChallenge之类的就不会执行,最终的statusCode是200。

其他内容

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是我给出的 Android Http请求实验小结: Android Http请求实验小结 在Android中进行网络请求,可以使用HttpURLConnection或HttpClient等方式。其中,HttpURLConnection是Android SDK提供的基于HTTP协议的网络请求API,HttpClient则是Apache提供的开源网络请求API,但在Android 6.0及以上版本中已被标记为过时,推荐使用HttpURLConnection。 HttpURLConnection的使用步骤: 1.创建URL对象,指定请求的URL地址。 2.调用URL对象的openConnection()方法,获取HttpURLConnection对象。 3.设置HttpURLConnection的请求方法、连接超时时间、读取超时时间等属性。 4.如果需要向服务器发送参数,可以通过HttpURLConnection对象的输出流将参数写入请求体中。 5.调用HttpURLConnection对象的connect()方法,建立与服务器的连接。 6.读取服务器返回的数据,可以通过HttpURLConnection对象的输入流获取服务器返回的数据。 7.关闭HttpURLConnection对象和输入流、输出流等资源。 HttpClient的使用步骤: 1.创建HttpClient对象。 2.创建HttpGet或HttpPost等请求对象,指定请求的URL地址和请求参数等信息。 3.执行请求,获取服务器返回的HttpResponse对象。 4.解析HttpResponse对象,获取服务器返回的数据。 5.关闭HttpClient对象和HttpResponse等资源。 需要注意的是,在Android 9.0及以上版本中,默认禁止应用程序使用非加密的流量进行网络请求,需要在AndroidManifest.xml文件中添加以下代码: ``` <application android:usesCleartextTraffic="true"> ... </application> ``` 以上是Android Http请求实验小结,希望对您有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值