• 【Java 进阶篇】Java HTTP 概述


    在这里插入图片描述

    HTTP(Hypertext Transfer Protocol)是一种用于传输超文本的应用层协议。它是构建互联网的基础之一,用于在客户端和服务器之间传递数据和请求资源。本文将为初学者提供关于 Java 中 HTTP 的概述,从 HTTP 请求和响应的基础知识到 Java 中如何处理 HTTP 请求和构建 HTTP 响应。

    什么是 HTTP?

    HTTP 是一种无状态协议,意味着每个请求与响应之间都是独立的,服务器不会保存任何关于之前请求的信息。它使用客户端-服务器模型,其中客户端发出请求,服务器提供响应。

    HTTP 的基本操作包括:

    • GET:从服务器获取资源。
    • POST:向服务器提交数据以进行处理。
    • PUT:将资源存储在服务器上。
    • DELETE:从服务器删除资源。

    HTTP 使用 URL(Uniform Resource Locator)来标识资源的位置,并使用 HTTP 方法来定义操作。例如,浏览器通常使用 GET 请求来获取网页内容,而通过 HTML 表单提交的数据将使用 POST 请求来处理。

    Java 中的 HTTP 请求

    Java 提供了多种方法来发出 HTTP 请求,最常见的是使用 java.net 包中的 HttpURLConnection 类。以下是一个简单的示例,演示如何使用 Java 发出 GET 请求:

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.net.HttpURLConnection;
    import java.net.URL;
    
    public class HttpExample {
        public static void main(String[] args) {
            try {
                // 创建 URL 对象
                URL url = new URL("https://www.example.com");
    
                // 打开连接
                HttpURLConnection connection = (HttpURLConnection) url.openConnection();
    
                // 设置请求方法
                connection.setRequestMethod("GET");
    
                // 获取响应代码
                int responseCode = connection.getResponseCode();
                System.out.println("Response Code: " + responseCode);
    
                // 读取响应内容
                BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
                String inputLine;
                StringBuilder response = new StringBuilder();
    
                while ((inputLine = reader.readLine()) != null) {
                    response.append(inputLine);
                }
                reader.close();
    
                // 打印响应内容
                System.out.println("Response Content:\n" + response.toString());
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    这个示例中,我们创建了一个 HttpURLConnection 对象,打开连接,设置请求方法为 GET,并读取来自服务器的响应。

    HTTP 请求的组成部分

    HTTP 请求通常由以下几个主要部分组成:

    • 请求行:包括请求方法(GET、POST 等)、请求的 URL 和协议版本(通常是 HTTP/1.1)。

    • 请求头:包括关于请求的附加信息,如用户代理、接受的媒体类型、cookie 等。

    • 请求体:对于 POST 请求,包括要发送给服务器的数据。对于 GET 请求,通常为空。

    • 请求方法:请求方法指定了客户端希望服务器执行的操作。常见的 HTTP 方法包括 GET、POST、PUT 和 DELETE。例如,GET 用于请求资源,POST 用于提交数据,PUT 用于存储资源,DELETE 用于删除资源。

    • 请求 URL:请求 URL 标识了服务器上的资源的位置。它包括协议(通常是 http:// 或 https://)、主机名和端口号,以及资源的路径。例如,https://www.example.com/page 中的 https 是协议,www.example.com 是主机名,/page 是资源的路径。

    • 协议版本:HTTP 请求通常使用 HTTP/1.1 协议版本。这部分指定了客户端使用的 HTTP 协议版本。

    • 请求头:请求头包含附加信息,通常以键值对的形式表示。常见的请求头包括 User-Agent(标识客户端的用户代理)、Accept(指示客户端接受的媒体类型)、Cookie(包含客户端的 cookie 数据)等。

    • 请求体:对于某些请求,如 POST 请求,请求体包含要发送到服务器的数据。请求体通常用于提交表单数据、JSON 数据等。在示例中,我们的 GET 请求没有请求体,因此为空。

    Java 中的 HTTP 响应

    与 HTTP 请求类似,Java 也提供了处理 HTTP 响应的方式。您可以使用 HttpURLConnection 来获取服务器的响应数据。以下是一个示例,演示如何获取并处理来自服务器的 HTTP 响应:

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.net.HttpURLConnection;
    import java.net.URL;
    
    public class HttpResponseExample {
        public static void main(String[] args) {
            try {
                URL url = new URL("https://www.example.com");
                HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                connection.setRequestMethod("GET");
    
                int responseCode = connection.getResponseCode();
                System.out.println("Response Code: " + responseCode);
    
                BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
                String inputLine;
                StringBuilder response = new StringBuilder();
    
                while ((inputLine = reader.readLine()) != null) {
                    response.append(inputLine);
                }
                reader.close();
    
                System.out.println("Response Content:\n" + response.toString());
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    这个示例中,我们使用与之前示例相同的代码来获取服务器的响应,然后读取响应内容。

    HTTP 响应的组成部分

    HTTP 响应通常由以下几个主要部分组成:

    • 状态行:包括协议版本、状态代码和状态消息。例如,HTTP/1.1 200 OK 表示请求成功。

    • 响应头:包括有关响应的信息,如服务器、日期、内容类型、内容长度等。

    • 响应体:包含来自服务器的实际数据,如 HTML 页面、JSON 数据等。

    在示例中,我们已经演示了如何获取状态行、响应头和响应体的内容。

    Java 中的 HTTP 客户端库

    除了使用 HttpURLConnection,Java 中还有一些第三方库可以用于处理 HTTP 请求和响应。其中最常用的包括 Apache HttpClient 和 OkHttp。这些库提供了更高级的功能,使 HTTP 请求和响应的处理变得更加方便。

    下面是一个使用 Apache HttpClient 发出 GET 请求的示例:

    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 HttpClientExample {
        public static void main(String[] args) {
            try {
                HttpClient httpClient = HttpClients.createDefault();
                HttpGet httpGet = new HttpGet("https://www.example.com");
                
                HttpResponse response = httpClient.execute(httpGet);
                int statusCode = response.getStatusLine().getStatusCode;
                System.out.println("Response Code: " + statusCode);
                
                String responseContent = EntityUtils.toString(response.getEntity());
                System.out.println("Response Content:\n" + responseContent);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    这个示例中,我们使用 Apache HttpClient 来发送 GET 请求,并获取响应的状态码和内容。

    Java 中的 HTTP 服务器

    除了作为 HTTP 客户端,Java 也可以用于构建 HTTP 服务器。最常见的方式是使用 Java EE(Java Platform, Enterprise Edition)规范中的 Servlet 和 JSP(JavaServer Pages)。Servlet 允许开发者构建基于 HTTP 的 Web 应用程序,而 JSP 允许开发者将 Java 代码嵌入到 HTML 页面中。

    以下是一个简单的 Java Servlet 示例,用于处理 HTTP 请求并发送 HTTP 响应:

    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    @WebServlet("/hello")
    public class HelloWorldServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
            response.setContentType("text/html");
            response.getWriter().write("

    Hello, World!

    "
    ); } }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    在这个示例中,我们创建了一个名为 HelloWorldServlet 的 Servlet,它响应 /hello URL 的 GET 请求,并返回一个简单的 “Hello, World!” 消息。

    要部署这个 Servlet,您需要使用 Java EE 兼容的应用服务器,如 Apache Tomcat 或 Jetty。

    结语

    HTTP 是构建互联网的核心协议之一,它使客户端和服务器之间的通信变得可能。在 Java 中,您可以使用标准的 HttpURLConnection 类来发出 HTTP 请求和处理 HTTP 响应,也可以使用第三方库如 Apache HttpClient 或 OkHttp 来提供更高级的功能。

    此外,Java 也提供了构建 HTTP 服务器的能力,使用 Servlet 和 JSP 技术可以创建强大的 Web 应用程序。希望这篇文章能够帮助初学者更好地理解 Java 中的 HTTP 概念和处理方式。无论是构建 HTTP 客户端还是 HTTP 服务器,Java 都提供了强大的工具和库,用于简化开发过程。

    作者信息

    作者 : 繁依Fanyi
    CSDN: https://techfanyi.blog.csdn.net
    掘金:https://juejin.cn/user/4154386571867191
  • 相关阅读:
    未来科技中的云计算之路
    系列四、FileReader和FileWriter
    关联分析——apprior算法
    java图书推荐协同过滤算法网站
    在SIP 语音呼叫中出现单通时要怎么解决?
    【节能学院】浅谈中低压母线装设弧光保护的必要性
    贪心——122. 买卖股票的最佳时机 II
    每日五问(java)
    Vue扩展组件mixins,extends,composition api,slots
    MySQL中的存储过程(详细篇)
  • 原文地址:https://blog.csdn.net/qq_21484461/article/details/134066501