【Java 进阶篇】Java HTTP 概述

news2025/1/11 10:03:53

在这里插入图片描述

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();
        }
    }
}

这个示例中,我们创建了一个 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();
        }
    }
}

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

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();
        }
    }
}

这个示例中,我们使用 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("<h1>Hello, World!</h1>");
    }
}

在这个示例中,我们创建了一个名为 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1137712.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

专业成就信赖-南大通用在分布式数据库的创新实践

在第二十五届中国国际软件博览会中国数据库产业峰会上&#xff0c;GBASE南大通用8c产品部总经理分享了题为“分布式数据库的创新实践”的演讲&#xff0c;全面解析了分布式数据库的发展和演进&#xff0c;以及GBASE南大通用分布式数据库的发展历程&#xff0c;详细介绍了第三代…

springboot + redis实现签到与统计功能

在很多项目中都会有签到与统计功能&#xff0c;最容易想到的方案是创建一个签到表来记录每个用户的签到记录&#xff0c;比如设计一个mysql数据库表&#xff1a; CREATE TABLE tb_sign id bigint(20) unsigned NOT NULL AUTOINCREMENT COMMENT 主键, user_id bigint(20) unsig…

作为一名程序员面临哪些挑战?应该如何应对?

在现今互联网失业潮的大环境下&#xff0c;每一位程序员都面临着被淘汰的风险&#xff0c;但逃避没有用&#xff0c;今天我们就来总结这些挑战与风险&#xff0c;找准自己的方向与定位&#xff0c;做好职业规划&#xff0c;希望这些信息能对大家有所帮助。 一、面临的挑战 老…

菱形(曼哈顿距离) C++实现

题目 代码 #include<iostream> using namespace std;int main(){int n;scanf("%d",&n);int cxn/2,cyn/2;for(int i0;i<n;i){for(int j0;j<n;j){if(abs(i-cx) abs(j-cy) < n/2) printf("*");else printf(" ");}puts("&…

Redis | 数据结构(01)

这里写自定义目录标题 Redis 速度快的原因除了它是内存数据库&#xff0c;使得所有的操作都在内存上进行之外&#xff0c;还有一个重要因素&#xff0c;它实现的数据结构&#xff0c;使得我们对数据进行增删查改操作时&#xff0c;Redis 能高效的处理。 因此&#xff0c;这次我…

【Ubuntu系统如何添加多个python版本并且切换】

ubuntu切换默认的python版本 当你安装 Debian Linux 时&#xff0c;安装过程有可能同时为你提供多个可用的 Python 版本&#xff0c;因此系统中会存在多个 Python 的可执行二进制文件。一般Ubuntu默认的Python版本都为2.x, 如何改变Python的默认版本。 你可以按照以下方法使用…

纯C语言实现解析单色位图文件获取颜色值

在绘制单色位图时&#xff0c;需要考虑字节对齐问题。字节对齐是指数据存储在内存中时按照多字节对齐的原则进行存放&#xff0c;以提高访问效率。 为了实现这个函数&#xff0c;可以按照以下步骤进行&#xff1a; 计算每行像素数据的实际占用字节数&#xff1a;每个像素占用1…

Shellcode——绕过31

遇到了一道ctf题目&#xff0c;要求shellcode的每一个字节都必须大于31。 如果没有这个限制的话&#xff1a; 这是最方便的了。 但是必须大于31. 所以我想&#xff0c;那就吧所有小于31的加上31&#xff0c;然后运行的时候这部分代码自己修改自己。 也就是SMC,&#xff0…

(二开)Flink 修改源码拓展 SQL 语法

1、Flink 扩展 calcite 中的语法解析 1&#xff09;定义需要的 SqlNode 节点类-以 SqlShowCatalogs 为例 a&#xff09;类位置 flink/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowCatalogs.java 核心方法&#xff1a; Override pu…

redis缓存击穿 穿透

我们之前写了一把分布式锁 并且用redis写的, redis内部实现是比较完善的&#xff0c;但是我们公司用的时候 redis 至少都是主从&#xff0c;哨兵,cluster 很少有单机的 呢么我们分布式锁基于集群问题下会有什么问题 比如说当第一个线程设置一个key过来进行加锁&#xff0c;加锁…

html/css/javascript/js实现的简易打飞机游戏

源码下载地址 支持&#xff1a;远程部署/安装/调试、讲解、二次开发/修改/定制 视频浏览地址

Maven项目转为SpringBoot项目

Maven项目转为SpringBoot项目 前言创建一个maven项目前的软件的一些通用设置Maven仓库的设置其他的设置字符编码编译器注解支持 创建的Maven项目修改为Spring Boot项目修改pom.xml文件修改启动类-Main新建WAR包所需的类 添加核心配置文件 测试的控制器最后整个项目的目录结构![…

Bayes决策:身高与体重特征进行性别分类

代码与文件请从这里下载&#xff1a;Auorui/Pattern-recognition-programming: 模式识别编程 (github.com) 简述 分别依照身高、体重数据作为特征&#xff0c;在正态分布假设下利用最大似然法估计分布密度参数&#xff0c;建立最小错误率Bayes分类器&#xff0c;写出得到的决…

@AutoConfigurationPackage注解类

包名package org.springframework.boot.autoconfigure 方法 String[] basePackages() 向AutoConfigurationPackages中注册的基本包&#xff0c;使用basePackageClasses作为基于字符串的包的类型安全替代方案 Class<?>[] basePackageClasses() 键入basePackage…

VL10F后台生成发货单时报错:物料 XXXXX 状态被锁定/未激活(不允许发货)

错误原因&#xff1a;物料主数据&#xff1a;销售视图1中&#xff0c;物料的发货状态没有激活。MM02修改物料的发货状态后正常生成单据。

双十一值得买的数码产品、这几款都不容错过

一年一度的双11终于来了&#xff0c;相信很多朋友都打算在此次的双11入手自己想要的产品&#xff0c;作为一个数码爱好者&#xff0c;我也是在此次的双11入手了下面4款数码产品&#xff0c;一起来看看吧&#xff01; 1、不用入耳佩戴的开放式耳机 -官方售价&#xff1a;199 …

WebSocket协议:5分钟从入门到精通

一、内容概览 WebSocket的出现&#xff0c;使得浏览器具备了实时双向通信的能力。本文由浅入深&#xff0c;介绍了WebSocket如何建立连接、交换数据的细节&#xff0c;以及数据帧的格式。此外&#xff0c;还简要介绍了针对WebSocket的安全攻击&#xff0c;以及协议是如何抵御类…

互联网产品说明书指南,附撰写流程与方法

产品说明书&#xff0c;对于普通产品而言&#xff0c;再常见不过。药物、电器、电子产品等产品在正式出售时&#xff0c;往往都会附带一份产品说明书&#xff0c;以此告诉用户这个产品的功能与特性&#xff0c;并指导用户如何来使用这个产品。 产品说明书 那么&#xff0c;对于…

洗衣行业在线预约小程序+前后端完整搭建教程

大家好哇&#xff0c;好久不见&#xff01;今天源码师父来给大家推荐一款洗衣行业在线预约的小程序&#xff0c;带有前后端的完整搭建教程。 目前&#xff0c;人们对生活品质的追求不断提高&#xff0c;但生活节奏却也不断加快。对品质的追求遇到了忙碌的生活节奏&#xff0c;…

天锐绿盾终端安全管理系统

所谓透明&#xff0c;是指对使用者来说是未知的。当使用者在打开或编辑指定文件时&#xff0c;系统将自动对未加密的文件进行加密&#xff0c;对已加密的文件自动解密。文件在硬盘上是密文&#xff0c;在内存中是明文。一旦离开使用环境&#xff0c;由于应用程序无法得到自动解…