📜  Java 建立 TCP 连接后如何处理 HTTP GET 请求 - Java (1)

📅  最后修改于: 2023-12-03 15:31:33.750000             🧑  作者: Mango

Java 建立 TCP 连接后如何处理 HTTP GET 请求

在Java中,我们可以使用Socket和ServerSocket类来实现TCP连接,并使用InputStream和OutputStream来读取和写入数据。而要处理HTTP GET请求,我们需要发送一个符合HTTP协议规定的请求报文,并读取服务器返回的响应报文。

发送请求报文

HTTP请求报文的格式如下:

GET /path/to/resource HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding: gzip, deflate, br
Connection: keep-alive

其中,第一行是请求行,包括请求方式、请求路径和HTTP协议版本;第二行是Host头,指定要访问的服务器域名或IP地址;后面的几行是请求头,包括User-Agent、Accept等。

下面是一个示例代码,使用Socket建立TCP连接,发送HTTP GET请求,读取服务器响应:

import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

public class HttpRequest {
    public static void main(String[] args) throws Exception {
        // 建立TCP连接
        Socket socket = new Socket("example.com", 80);
        InputStream in = socket.getInputStream();
        OutputStream out = socket.getOutputStream();

        // 发送HTTP GET请求
        String request = "GET /path/to/resource HTTP/1.1\r\n" +
                         "Host: example.com\r\n" +
                         "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3\r\n" +
                         "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\r\n" +
                         "Accept-Encoding: gzip, deflate, br\r\n" +
                         "Connection: keep-alive\r\n\r\n";
        out.write(request.getBytes());

        // 读取服务器响应
        byte[] buffer = new byte[1024];
        int len = in.read(buffer);
        String response = new String(buffer, 0, len);
        System.out.println(response);

        // 关闭连接
        socket.close();
    }
}
解析响应报文

HTTP响应报文的格式如下:

HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
Content-Length: 1234
Connection: keep-alive

<!DOCTYPE html>
<html>
<head>
    <title>Example Domain</title>
</head>
<body>
<div>
    <h1>Example Domain</h1>
    <p>This domain is established to be used for illustrative examples in documents. You may use this domain in examples without prior coordination or asking for permission.</p>
</div>
</body>
</html>

其中,第一行是响应行,包括HTTP协议版本、状态码和状态描述;后面的几行是响应头,包括Content-Type、Content-Length等;响应报文的主体部分是HTML代码。

我们可以使用Java内置的URLConnection类或第三方库如OkHttp、HttpClient来发送HTTP请求并解析响应,这里不再赘述。

使用第三方库

如果你不想手动构造HTTP报文,可以使用一些第三方库,在Java中,常用的HTTP客户端库有OkHttp和HttpClient。

OkHttp

OkHttp是一个高性能的HTTP客户端库,可以发送HTTP/1.1请求,支持HTTP/2,支持多个并发请求,支持GZIP压缩。它的API简洁易用,可以适应各种HTTP场景。

使用OkHttp发送HTTP GET请求的代码如下:

import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

public class OkHttpRequest {
    public static void main(String[] args) throws Exception {
        // 创建OkHttpClient实例
        OkHttpClient client = new OkHttpClient();

        // 构造HTTP请求
        Request request = new Request.Builder()
                .url("http://example.com/path/to/resource")
                .build();

        // 发送HTTP请求并获取响应
        Response response = client.newCall(request).execute();

        // 解析响应
        String body = response.body().string();
        System.out.println(body);
    }
}
HttpClient

HttpClient是Apache Software Foundation下的一个开源项目,是一个强大的、灵活的、完整的HTTP客户端库,可以模拟浏览器行为,同时支持各种HTTP请求方式和代理访问。与OkHttp不同的是,HttpClient需要手动配置ConnectionManager、HttpContext等参数,更适合复杂的HTTP场景。

使用HttpClient发送HTTP GET请求的代码如下:

import java.io.InputStream;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

public class HttpClientRequest {
    public static void main(String[] args) throws Exception {
        // 创建HttpClient实例
        HttpClient client = HttpClients.createDefault();

        // 构造HTTP请求
        HttpGet request = new HttpGet("http://example.com/path/to/resource");

        // 发送HTTP请求并获取响应
        HttpResponse response = client.execute(request);

        // 解析响应
        String body = EntityUtils.toString(response.getEntity());
        System.out.println(body);
    }
}

以上两个库都需要下载相应的jar包并添加到classpath中。

总结

在Java中处理HTTP GET请求,我们可以手动构造HTTP报文,也可以使用第三方库如OkHttp、HttpClient来发送HTTP请求和解析响应。不同的库有不同的特点和用法,选择合适的库可以提高开发效率和代码质量。