深入 Web 请求过程
2020-04-12 16:06:52来源:博客园 阅读 ()
深入 Web 请求过程
前言
随着 Web 2.0 时代的到来,互联网的网络架构已经从传统的 C/S
架构转变为更加方便、快捷的 B/S
架构,B/S 架构大大简化了用户使用网络应用的难度,提高了用户体验。
B/S
架构带来了以下两方面的好处:
- 客户端使用统一的浏览器(
Browser
)。由于浏览器具有统一性,不需要特殊的配置和网络连接。另外浏览器的交互特性使得用户使用它非常简便,且用户行为的可继承性非常强,也就是用户只要学会了上网,不管使用哪个应用,一旦学会了,便具备了使用其它任何互联网服务的经验。 - 服务端(
Server
)基于统一的HTTP
。和传统的 C/S 架构使用自定义的应用层协议不同。使用统一的 HTTP 简化了开发模式,并且基于 HTTP 的服务器又很多,如Apache
、Nginx
、Tomcat
等,这些服务器可以直接拿来使用,不仅如此,连开发服务的通用框架也可以直接拿来使用,不需要单独开发,如Spring
、Spring MVC
、MyBatis
等,我们只需关注服务的业务逻辑,同样简化了我们的开发工作。
B/S 网络架构概述
B/S
基于统一的应用层协议 HTTP
来交互数据,与大多数 C/S
互联网应用程序采用的长连接的交互模式不同。HTTP
采用无状态的短连接的通信方式,通常情况下,一次请求就完成了一次数据交互,然后这次通信连接就断开了。采用这种方式可以有效应对更多的用户请求。
当在浏览器里输入 antoniopeng.com 这个 URL
并按下回车键时,会发生很多操作:
- 首先请求
DNS
把这个域名解析成对应的IP
地址。 - 然后根据这个
IP
地址在互联网上找到对应的服务器,向这个服务器发起一个(GET/POST/...)请求。由这个服务器返回默认的数据资源给访问的用户,在服务端也可能还有很复杂的业务逻辑。- 服务器可能有很多台,由一台负载均衡设备(如
Nginx
)来平均分配所有用户的请求。 - 还有请求的数据是存储在缓存里还是一个静态文件中,或是在数据库里。
- 服务器可能有很多台,由一台负载均衡设备(如
- 最后当数据返回浏览器时,解析到发现还有一些静态资源(如
CSS
、JS
、IMG
)时又会发起另外的HTTP
请求,而这些请求很可能会在CDN
上,那么CDN
服务器又会处理这些请求。
如何发起一个请求
这个问题简单又复杂,简单是指当我们在浏览器里数据一个 URL
时,按下回车键就发起了这个 HTTP
请求,很快就可以看到这个请求的返回结果。复杂是指不借助浏览器也能发起请求。
而一个 HTTP
连接本质上是一个 Socket
连接,那么我们可以完全模拟浏览器来发起 HTTP
请求。Apache HttpClient
就是一个开源的通过程序实现的处理 HTTP
请求的工具包。
下面是一个基于 HttpClient
的调用示例:
引入依赖
在 pom.xml
中添加 org.apache.httpcomponents:httpclient
依赖
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.5</version>
</dependency>
创建 Http Get 请求
实现代码如下
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import java.io.IOException;
public class MyTest {
public static void main(String[] args) {
get();
}
private static void get() {
// 创建 HttpClient 客户端
CloseableHttpClient httpClient = HttpClients.createDefault();
// 创建 HttpGet 请求
HttpGet httpGet = new HttpGet("http://www.baidu.com");
// 设置长连接
httpGet.setHeader("Connection", "keep-alive");
// 设置代理(模拟浏览器版本)
httpGet.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36");
// 设置 Cookie
httpGet.setHeader("Cookie", "UM_distinctid=34342706a09352-0376059833914f-3c604504-1fa400-16442706a0b345; CNZZDATA1262458286=1603637673-1530123020-%7C1530123020; JSESSIONID=805587506F1594AE02DC45845A7216A4");
CloseableHttpResponse httpResponse = null;
try {
// 请求并获得响应结果
httpResponse = httpClient.execute(httpGet);
HttpEntity httpEntity = httpResponse.getEntity();
// 输出请求结果
System.out.println(EntityUtils.toString(httpEntity));
} catch (IOException e) {
e.printStackTrace();
}
// 无论如何必须关闭连接
finally {
if (httpResponse != null) {
try {
httpResponse.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (httpClient != null) {
try {
httpClient.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
除了在 Java
中使用非常普遍的 HttpClient
工具,另外在命令行中的 curl
命令,通过 curl + URL 就可以简单地发起一个 HTTP
请求
- 输入命令
curl https://www.baidu.com
- 返回 HTML 数据结果
<!DOCTYPE html>
<!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer><link rel=stylesheet type=text/css href=https://ss1.bdstatic.com/5eN1bjq8AAUYm2zgoY3K/r/www/cache/bdorz/baidu.min.css><title>鐧惧害涓
原文链接:https://www.cnblogs.com/antoniopeng/p/12687733.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- Spring WebFlux 学习笔记 - (一) 前传:学习Java 8 Stream Ap 2020-06-11
- eclipse下创建Maven项目(包含webapp目录结构) 2020-06-09
- SpringBoot通过web页面动态控制定时任务的启动、停止、创建 2020-06-09
- 深入解析ThreadLocal和ThreadLocalMap 2020-06-08
- 深入理解:设计模式中的七大设计原则 2020-06-07
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash