深入 Web 请求过程

2020-04-12 16:06:52来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

深入 Web 请求过程

前言

随着 Web 2.0 时代的到来,互联网的网络架构已经从传统的 C/S 架构转变为更加方便、快捷的 B/S 架构,B/S 架构大大简化了用户使用网络应用的难度,提高了用户体验。

B/S 架构带来了以下两方面的好处:

  • 客户端使用统一的浏览器(Browser)。由于浏览器具有统一性,不需要特殊的配置和网络连接。另外浏览器的交互特性使得用户使用它非常简便,且用户行为的可继承性非常强,也就是用户只要学会了上网,不管使用哪个应用,一旦学会了,便具备了使用其它任何互联网服务的经验。
  • 服务端(Server)基于统一的 HTTP。和传统的 C/S 架构使用自定义的应用层协议不同。使用统一的 HTTP 简化了开发模式,并且基于 HTTP 的服务器又很多,如 ApacheNginxTomcat 等,这些服务器可以直接拿来使用,不仅如此,连开发服务的通用框架也可以直接拿来使用,不需要单独开发,如 SpringSpring MVCMyBatis 等,我们只需关注服务的业务逻辑,同样简化了我们的开发工作。

B/S 网络架构概述

B/S 基于统一的应用层协议 HTTP 来交互数据,与大多数 C/S 互联网应用程序采用的长连接的交互模式不同。HTTP 采用无状态的短连接的通信方式,通常情况下,一次请求就完成了一次数据交互,然后这次通信连接就断开了。采用这种方式可以有效应对更多的用户请求。

当在浏览器里输入 antoniopeng.com 这个 URL 并按下回车键时,会发生很多操作:

B/S 架构网络请求概念图

  1. 首先请求 DNS 把这个域名解析成对应的 IP 地址。
  2. 然后根据这个 IP 地址在互联网上找到对应的服务器,向这个服务器发起一个(GET/POST/...)请求。由这个服务器返回默认的数据资源给访问的用户,在服务端也可能还有很复杂的业务逻辑。
    • 服务器可能有很多台,由一台负载均衡设备(如 Nginx)来平均分配所有用户的请求。
    • 还有请求的数据是存储在缓存里还是一个静态文件中,或是在数据库里。
  3. 最后当数据返回浏览器时,解析到发现还有一些静态资源(如 CSSJSIMG)时又会发起另外的 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 Cloud Eureka 服务注册与发现中心

下一篇:Spring Cloud Hystrix 熔断器及仪表盘监控