请求
最后更新于:2022-04-02 04:28:17
## 请求
web应用给我们的感知都是以请求的方式呈现和运行的。
比如浏览器的表单提交,ajax请求,socket请求,服务端php的curl从一个服务器对另一个服务器的请求。
请求无处不在,请求支撑着我们日常的所有网络应用,不论是app还是网站的,这些都是网络应用,想要运行都离不开请求。
* * * * *
### TODO
ajax相应一定要等到服务器完全响应断开连接才可以吗,如果服务器不断开连接,一直flush()推送呢,客户端能源源不断的收到信心吗?
[php死循环代码一直在运行? - 知乎](https://www.zhihu.com/question/46275054/answer/136984342)
[0714/2013 作业及预习+代码+视频 - 历史视频及代码 自学it网-公益PHP培训!](http://www.zixue.it/forum.php?mod=viewthread&tid=7820&extra=page%3D2%26filter%3Dtypeid%26typeid%3D35%26typeid%3D35)
[实现Comet(服务器推送)的两种方式:长轮询和http流_蔡武坤的博客-CSDN博客](https://blog.csdn.net/weixin_39181833/article/details/79723745)
> XMLHttpRequest 可以不断监听使用 xhr.readyState == 3
[xiasf - comet - Coding.net](https://coding.net/u/xiasf/p/comet/git)
> 原来ajax是服务端推送一次就断开了,得再重新发起一次ajax,但是其阻塞了请求也是有意义的,而不是客户端一个定时器每隔一个固定的时间去请求,这样效率是最低的(不能预知,什么时候到达,请求什么时候返回,有可能同时,无法控制顺序)。(**这样也实现了【单例请求】,不会造成并发请求,“并发”更新UI的问题**)
[ajax、反向ajax、jsonp详解 - CSDN博客](http://blog.csdn.net/kabulore/article/details/51910978)
[反向AJAX - CSDN博客](http://blog.csdn.net/lccone/article/details/7743886)
> Comet 这些技术不能大规模使用,因为占用了用于处理响应的进程(php-fpm),最终会导致并发能力越来越低,服务不可用的。
~~~
**实时信息很难从技术上解决。**
……
Comet(服务器推)
第二种主动式反向Ajax方法是Comet,这是一种基于HTTP长连接的服务器推动方式。客户端向服务器发送请求后,服务器将数据通过response发送给客户端,但并不会将此response关闭,而是一直通过response将最新的数据发送给客户端浏览器,直到客户端浏览器关闭。
~~~
>[danger] 服务器会阻塞请求,而不马上断开连接,而客户端也能源源不断的收到信息。
[30分钟学会反向Ajax - 冷豪 - 博客园](http://blog.csdn.net/kabulore/article/details/51910978)
[网页实时聊天之js和jQuery实现ajax长轮询 - 枕边书 - 博客园](https://www.cnblogs.com/zhenbianshu/p/4964095.html)
![](http://cdn.aipin100.cn/18-7-2/22155054.jpg)
> #### 长轮询的思想:
>
> 如图:用AJAX发送询问信息,服务器在没有信息要返回的时候进入无限等待。由于AJAX异步的特性,PHP在服务器端执行等待不会影响到页面的正常处理。一旦服务器查询到返回信息,服务器返回信息,AJAX用回调函数处理这条信息,同时迅速再次发送一个请求等待服务器处理。
>
> 与 **传统轮询(简易轮询)** 相比,长轮询在服务器没的返回信息的时候进入等待,减少了普通轮询服务器无数次的空回复。**可以这样认为,长轮询 使服务器每次的返回更有目的性,而不是盲目返回。**
[Comet技术详解:基于HTTP长连接的Web端实时通信技术 - helloJackJiang - 博客园](https://www.cnblogs.com/imstudy/p/5696033.html)
~~~
“服务器推”是一种很早就存在的技术,以前在实现上主要是通过客户端的套接口,或是服务器端的远程调用。因为浏览器技术的发展比较缓慢,没有为“服务器推”的实现提供很好的支持,在纯浏览器的应用中很难有一个完善的方案去实现“服务器推”并用于商业程序。最近几年,因为 AJAX 技术的普及,以及把 IFrame 嵌在“htmlfile“的 ActiveX 组件中可以解决 IE 的加载显示问题,一些受欢迎的应用如 meebo,gmail+gtalk 在实现中使用了这些新技术;同时“服务器推”在现实应用中确实存在很多需求。因为这些原因,基于纯浏览器的“服务器推”技术开始受到较多关注,Alex Russell(Dojo Toolkit 的项目 Lead)称这种 **基于 HTTP 长连接、无须在浏览器端安装插件的“服务器推”技术为“Comet”。**
使用 AJAX 实现“服务器推”与传统的 AJAX 应用不同之处在于:
服务器端会阻塞请求直到有数据传递或超时才返回。
客户端 JavaScript 响应处理函数会在处理完服务器返回的信息后,再次发出请求,重新建立连接。
当客户端处理接收的数据、重新建立连接时,服务器端可能有新的数据到达;这些信息会被服务器端保存直到客户端重新建立连接,客户端会一次把当前服务器端所有的信息取回。
~~~
[feed留,单聊群聊,系统通知,状态同步,到底是推还是拉?](https://mp.weixin.qq.com/s/54yEWWet9mFztv1fO_GTqQ)
> 大部分webim(特别是同时在线量大的)是http轮询请求,后续撰文
[WEB即时通信最佳实践](https://mp.weixin.qq.com/s/t1YkuDxUessq5bfials4gw)
* * * * *
### 实现单例请求
要用自循环/自调用方式来发出请求,而不能用定时器,这样就能保证请求的顺序性,保证每一时刻只有一个请求,请求中或等待响应。
伪代码:
```javascript
function get(cb) {
$.ajax(data, function() {
cb(get);
});
}
get(get);
```
[为什么尽量别用 setInterval](https://mp.weixin.qq.com/s/8An8mfJQaursg4lDdoPayg)
> 无视网络延迟:它仍然会按定时持续不断地触发请求,最终你的客户端网络队列会塞满Ajax调用。
* * * * *
### 夯住!
[http如何像tcp一样实时的收消息?](https://mp.weixin.qq.com/s?__biz=MjM5ODYxMDA5OQ==&mid=2651959605&idx=1&sn=21f25087bef3c3a966ef03b824365621&scene=4&rd2werd=1#wechat_redirect)
> 没有消息到达的时候,**这个http消息连接将被夯住,不返回,由于http是短连接,这个http消息连接最多被夯住90秒**,就会被断开(这是浏览器或者webserver的行为)
>
> webim通过http长轮询可以保证消息的绝对实时性。这种实时性的保证不是通过增加轮询频率来保证的,而是通过夯住http消息连接来保证的
[网页端收消息,究竟是推还是拉?](https://mp.weixin.qq.com/s?__biz=MjM5ODYxMDA5OQ==&mid=2651961175&idx=1&sn=4e74348e9e6c20aa11bf55949b24e20a&scene=0#wechat_redirect&rd2werd=1#wechat_redirect)
> 不像普通的“请求-响应”式HTTP请求,这个HTTP会被服务端夯住,直到有推送通知到达,或者超过约定的时间
[秒杀系统架构优化思路](https://mp.weixin.qq.com/s?__biz=MjM5ODYxMDA5OQ==&mid=2651959391&idx=1&sn=fb28fd5e5f0895ddb167406d8a735548&scene=4&rd2werd=1#wechat_redirect)
> 用户层面肯定是同步的(用户的http请求是夯住的),服务层面可以同步可以异步。
[webim如何用轮询保证消息绝对实时](https://mp.weixin.qq.com/s/VOSQLXBb7f1CZHj1dPRi3A)
> 没有消息到达的时候,这个http消息连接将被夯住,不返回,由于http是短连接,这个http消息连接最多被夯住90秒,就会被断开(这是浏览器或者webserver的行为)
[58到家数据库30条军规解读](https://mp.weixin.qq.com/s?__biz=MjM5ODYxMDA5OQ==&mid=2651959906&idx=1&sn=2cbdc66cfb5b53cf4327a1e0d18d9b4a&chksm=bd2d07be8a5a8ea86dc3c04eced3f411ee5ec207f73d317245e1fefea1628feb037ad71531bc&scene=4&rd2werd=1#wechat_redirect)
> 无主键的表删除,在row模式的主从架构,会导致备库夯住
* * * * *
### http
常见的就是http请求了,这是应用层的协议,之上链路层就是TCP、IP了。
我们用浏览器打开网页就是http请求。
ajax也是http请求。
常用的curl也是http请求。
关于请求,我们需要知道的,请求包含哪些重要的信息:
- 请求地址
- 请求头(协议头信息,包含 Query String Parameters)
- body(Form Data)
- 数据编码(发送数据的数据编码,默认表单为 `Content-Type:application/x-www-form-urlencoded`)
- 数据格式(发送数据的数据格式)
- 期望返回的数据格式(Accept)
注意:要分开理解数据编码和字符编码的概念。
Content-type: application/x-www-form-urlencoded; charset=UTF-8 (数据类型,数据编码)
**Accept: \*/\*:** 客户端可以使用Accept字段声明自己可以接受哪些数据格式,也表示客户端期望接受到什么类型的数据格式。
* * * * *
>[danger] 服务器端想要实现“异步”(返回数据给浏览器,并断开与浏览器的连接,但是后端服务不停止,继续运行),如果想实现这样,服务端必须做一些处理才行,参见参考资料。
>[danger] 服务端完全响应完,浏览器才能收到200的状态(只有浏览器和后端断开连接了,ajax才能算是响应完成,不然一直加载的状态,即使是有数据不断flush输送过来了)
* * * * *
### socket
待续
* * * * *
### 参考
[HTTP 协议超详细讲解](https://www.toutiao.com/a6506706975080841732/?tt_from=weixin&utm_campaign=client_share×tamp=1514976679&app=news_article&utm_source=weixin&iid=22069500288&utm_medium=toutiao_android&wxshare_count=1)
[HTTP,HTTP2.0,SPDY,HTTPS你应该知道的一些事 - WEB前端 - 伯乐在线](http://web.jobbole.com/87695/)
[专题 | JerryQu 的小站](https://imququ.com/post/series.html)
[Http协议的详细总结](https://www.toutiao.com/a6516479528183792131/?tt_from=weixin&utm_campaign=client_share×tamp=1517277124&app=news_article&utm_source=weixin&iid=22069500288&utm_medium=toutiao_android&wxshare_count=1)
[http简介](https://segmentfault.com/a/1190000009744707#articleHeader3)
[理解HTTP之Content-Type](https://segmentfault.com/a/1190000003002851)
[一文带你了解 HTTP 黑科技](https://mp.weixin.qq.com/s/UWYe_3hcnClvsLvFJRBztA)
[jQuery Ajax 操作函数](http://www.w3school.com.cn/jquery/jquery_ref_ajax.asp)
[jQuery ajax - ajax() 方法](http://www.w3school.com.cn/jquery/ajax_ajax.asp)
[HTML \