JAVA和Nginx 教程大全

网站首页 > 精选教程 正文

Java基础进阶一之Http请求模拟 http请求模拟器

wys521 2024-11-05 12:49:27 精选教程 22 ℃ 0 评论

HTTP协议

HTTP(HTTP协议是什么)是一种用于在Web浏览器和Web服务器之间交换数据的应用层协议。通过HTTP,Web浏览器可以向Web服务器发送请求并获取响应,从而实现Web页面的访问和传输。HTTP使用TCP作为传输层协议,并采用请求-响应模型来进行通信。在HTTP中,请求消息由请求行、请求头和请求正文组成,响应消息由状态行、响应头和响应正文组成。HTTP协议的设计旨在使其简单易用、可扩展性强,并具有高度的互操作性。

HTTP - Requests

HTTP客户端以请求消息的形式向服务器发送HTTP请求,该请求消息包括以下格式:

请求行

多个消息头

空行(即CRLF之前没有任何内容的行)

消息正文(可选)

请求行

请求方式有:post、get、options、delete、trace、put

常用的有:post、get

post 与 get区别:

GET使用URL或Cookie传参。而POST将数据放在BODY中。

GET的URL会有长度上的限制,而POST的数据则可以非常大。

POST比GET安全,因为数据在地址栏上不可见。

HTTP 请求消息头

Accept :告诉服务器我可以接受的 文件类型 浏览器可接受的MIME类型

Accept-Charset:浏览器可接受的字符集编码

Accept-Encoding:可以接受 以某种 格式 压缩后的数据 例如:gzip 、compress。浏览器能够进行解码的数据编码方式

Accept-Langage:浏览器支持的语言

Host:表示我所要找的 主机 是谁

User-Agent:告诉服务器,浏览器内核。

GET 请求例子

GET /hello.htm HTTP/1.1
User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)
Host: www.tutorialspoint.com
Accept-Language: en-us
Accept-Encoding: gzip, deflate
Connection: Keep-Alive

POST 请求例子

POST /cgi-bin/process.cgi HTTP/1.1
User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)
Host: www.tutorialspoint.com
Content-Type: application/x-www-form-urlencoded
Content-Length: length
Accept-Language: en-us
Accept-Encoding: gzip, deflate
Connection: Keep-Alive

licenseID=string&content=string&/paramsXML=string

HTTP - Responses

在接收并解释请求消息后,服务器使用HTTP响应消息进行响应:

HTTP 响应的基本结构

状态行

多个消息头

一个空行

实体内容

状态行

格式: http版本号 状态码 原因叙述<CRLF>

举例:HTTP/1.1 200 OK

状态码用于表示服务器对请求的处理结果,它是一个三维的十进制数。响应状态码分为5类。

状态码

含义

100~199

表示成功接收请求,要求客户端继续提交下一次请求才能完成整个处理过程

200~299

表示成功接收请求并已完成整个处理过程 。 常用200

300~399

为完成请求,客户端需进一步细化请求,例如:请求的资源已经移动一个新地址,常用302、307

400~499

客户端的请求有错误。常用 404

500~599

服务器端出现错误, 常用 500

POST响应例子

HTTP/1.1 200 OK
Date: Mon, 27 Jul 2009 12:28:53 GMT
Server: Apache/2.2.14 (Win32)
Last-Modified: Wed, 22 Jul 2009 19:15:56 GMT
Content-Length: 88
Content-Type: text/html
Connection: Closed

<html>

<body>

<h1>Hello, World!</h1>

</body>

</html>

客户端与服务端HTTP协议交互过程

如图所示,Web浏览器与Web服务器之间的一次Http请求和响应过程,需要完成如下几个步骤。

首先,用户在浏览器地址栏中输入 http://www.google.com/index.html ,如果不指定端口,浏览器会默认为80端口。

操作系统通过查找DNS服务器进行域名解析,得到 www.google.com 对应的IP地址 74.125.31.147。

浏览器发起并建立到IP地址74.125.31.147的服务器80端口的连接,并向其发送HTTP GET请求。

服务端收到客户端发送的HTTP GET请求后,会响应一段HTML代码,浏览器根据接收到的HTML代码,下载响应的资源,样式文件,脚本文件等,并进行网友的渲染。这样,服务端的HTML文件便以图像化的形式展现在用户面前。

Socket编程实现HTTP请求发送(模拟浏览器)

下面我们使用Socket模拟HTTP向谷歌服务器发送请求,代码如下:

import java.io.*;
import java.net.Socket;
import java.nio.charset.StandardCharsets;

public class UUIDTest {
    public static void main(String[] args) throws Exception {
        Socket client = new Socket("www.google.com", 80);
        String request = "GET /index.html HTTP/1.1\r\n" +
                "Host: www.google.com\r\n" +
                "Connection: keep-alive\r\n" +
                "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7\r\n" +
                "Upgrade-Insecure-Requests: 1\r\n";

        PrintWriter pWriter = new PrintWriter(client.getOutputStream(), true);
        // 这里使用println()方法是因为 HTTP 协议在报头和报文之间,有一行空行
        // 如果少了这一行空行,服务器是无法解析报文的,会出现 400 错误
        pWriter.println(request);

        InputStream in = client.getInputStream();
        BufferedInputStream bis = new BufferedInputStream(in);
        // 临时区
        byte[] buffer = new byte[1024];

        // 分次读取数据,每次最多读取1024个字节,将数据读取到临时区之中,同时返回读取的字节个数,如果遇到文件末尾,会返回-1
        int len;
        while ((len = bis.read(buffer)) != -1) {
            System.out.println("-------" + len);
            // 字节转为字符串
            String msg = new String(buffer, 0, len, StandardCharsets.UTF_8);
            System.out.println(msg);
        }
        in.close();
        // 数据读取完毕之后,关闭输入流
        client.close();
    }
}

HttpClient发送HTTP请求

随着HTTP协议的广泛应用,它已经不仅仅局限于原来的浏览器/服务器模式。很多情况下,我们需要自己实现向服务端发送请求,以及解析服务器响应这个过程。但是像之前一样通过Socket API来实现这一切,会带来相当大的工作量,并且这种工作是重复且没有价值的,还可能导致一些不可预估的风险,比如底层的流处理,并发控制等。HttpClient的出现,为这一系列问题提供一个成熟的解决方案。

HttpClient是著名的开源软件组织Apache基金会下的一个子项目,它对HTTP协议通信的过程进行了封装,提供高效且功能丰富的客户端编程工具包。

下面的例子是一段通过HttpClient实现发送HTTP GET请求的代码:

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.util.EntityUtils;

import java.io.*;
public class Test {

    public static void main(String[] args) throws Exception, IOException, SecurityException {
       try( CloseableHttpClient httpClient = HttpClientBuilder.create().build()) {
           String url = "http://www.google.com/index.html";
           HttpGet httpGet = new HttpGet(url);
           HttpResponse httpResponse = httpClient.execute(httpGet);
           HttpEntity httpEntity = httpResponse.getEntity();
           String result = EntityUtils.toString(httpEntity, "utf-8");
           System.out.println(result);
       }
    }
}

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表