首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Java神器HttpClient:轻松玩转HTTP请求

Java神器HttpClient:轻松玩转HTTP请求

作者头像
北极的代码
发布2026-04-22 17:27:31
发布2026-04-22 17:27:31
760
举报
前言:前面我们完成了苍穹外卖项目的一些基础业务功能,这一章节我们学习一个新的技能,用作项目的微信小程序开发,这时就需要调用微信的的API接口,那么我们如何调用呢,这时就需要学习下面的技能。

HttpClient 是Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持HTTP 协议的客户端编程工具包,并且它支持HTTP协议最新的版本和建议。 <dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.13</version> </dependency

HttpClient是干什么的?为什么之前没用过?

确实,写常规的增删改查项目时确实用不到HttpClient。我来给你讲清楚:


📦 什么是HttpClient?

HttpClient 是Apache提供的一个HTTP客户端工具包,用来发送HTTP请求接收HTTP响应

简单说:它是让Java程序自己充当"浏览器"去访问其他网站或接口的工具。


🎯 我们之前为什么没用?

因为我们之前写的项目都是:

text

代码语言:javascript
复制
浏览器 → 你的后端程序(Controller)→ 数据库
  • 浏览器负责发请求
  • 你的后端只负责接收请求、处理数据、返回响应
  • 不需要主动去请求别人

💡 什么时候需要HttpClient?

场景1:调用第三方API(最常用)
代码语言:javascript
复制
java

// 假设你的项目需要查天气预报
// 你不能自己预测天气,得调用第三方接口
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("https://api.weather.com/current?city=北京"))
    .build();

HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
String weatherData = response.body();

真实案例

  • 微信支付:你的后端要主动调微信的接口
  • 阿里云OSS:上传文件时调OSS接口
  • 短信验证码:调第三方短信平台

场景2:微服务调用
代码语言:javascript
复制
java

// 订单服务需要查用户信息
// 用户信息在另一个服务里
String userInfo = httpClient.get("http://user-service/users/123");

场景3:爬虫
代码语言:javascript
复制
java

// 爬取网页内容
String html = httpClient.get("https://www.csdn.net");

🎬 我们项目里其实"暗中"用了

虽然你没直接写HttpClient代码,但你用的很多依赖内部已经用了类似的东西

你在用的

内部其实用了

阿里云OSS SDK

封装了HTTP请求

微信支付SDK

封装了HTTP请求

RestTemplate

Spring封装的HTTP客户端

OpenFeign

微服务调用的HTTP客户端


📊 类比理解

角色

现实类比

代码中

浏览器

你去店里买东西

前端发请求

你的后端

你是店员

Controller接收请求

HttpClient

你打电话问供货商要货

后端主动请求其他服务


🎯 什么时候我们会用到?

在我们以后的开发中,遇到这些情况就要用:

  1. 集成第三方服务(支付、短信、地图)
  2. 微服务调用(服务A调服务B)
  3. 爬虫
  4. 网关转发
  5. 测试接口

✅ 总结

  • 之前没用 → 因为项目是独立的,不需要调别人
  • 以后会用 → 一旦需要调外部接口,就要用到HttpClient
  • 现在知道 → 它是一个让你后端程序也能发HTTP请求的工具

>

案例一:GET请求(查天气)

完整代码
代码语言:javascript
复制
java

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;

public class HttpClientGetExample {
    public static void main(String[] args) {
        // 1. 创建HttpClient对象(相当于打开浏览器)
        try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
            
            // 2. 创建HttpGet请求(相当于输入网址)
            HttpGet httpGet = new HttpGet("https://api.github.com/users/octocat");
            
            // 3. 添加请求头(可选,模拟浏览器)
            httpGet.setHeader("User-Agent", "Mozilla/5.0");
            
            // 4. 发送请求,获取响应(相当于按回车)
            try (CloseableHttpResponse response = httpClient.execute(httpGet)) {
                
                // 5. 获取响应状态码
                int statusCode = response.getStatusLine().getStatusCode();
                System.out.println("状态码:" + statusCode);
                
                // 6. 获取响应内容
                HttpEntity entity = response.getEntity();
                String result = EntityUtils.toString(entity, "UTF-8");
                
                System.out.println("响应内容:");
                System.out.println(result);
            }
            
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
运行结果

text

代码语言:javascript
复制
状态码:200
响应内容:
{
  "login": "octocat",
  "id": 583231,
  "name": "The Octocat",
  ...
}

案例二:POST请求(提交JSON数据)

代码语言:javascript
复制
java

import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

public class HttpClientPostExample {
    public static void main(String[] args) {
        // 1. 创建HttpClient
        try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
            
            // 2. 创建HttpPost请求
            HttpPost httpPost = new HttpPost("https://jsonplaceholder.typicode.com/posts");
            
            // 3. 设置请求头(告诉服务器发送的是JSON)
            httpPost.setHeader("Content-Type", "application/json");
            httpPost.setHeader("Accept", "application/json");
            
            // 4. 构建要发送的JSON数据
            String json = "{\"title\":\"HttpClient教程\",\"body\":\"这是一个测试\",\"userId\":1}";
            
            // 5. 把JSON数据放到请求体里
            StringEntity entity = new StringEntity(json, "UTF-8");
            httpPost.setEntity(entity);
            
            // 6. 发送请求
            try (CloseableHttpResponse response = httpClient.execute(httpPost)) {
                
                // 7. 获取响应状态码
                int statusCode = response.getStatusLine().getStatusCode();
                System.out.println("状态码:" + statusCode);
                
                // 8. 获取响应内容
                String result = EntityUtils.toString(response.getEntity(), "UTF-8");
                System.out.println("响应内容:");
                System.out.println(result);
            }
            
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
运行结果

text

代码语言:javascript
复制
状态码:201
响应内容:
{
  "title": "HttpClient教程",
  "body": "这是一个测试",
  "userId": 1,
  "id": 101
}

我们已经在项目中把httpcliant封装成了工具包,可以直接使用。


🎨 案例三:带参数的POST(表单提交)

代码语言:javascript
复制
java

import org.apache.http.HttpEntity;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;

import java.util.ArrayList;
import java.util.List;

public class HttpClientPostFormExample {
    public static void main(String[] args) {
        try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
            
            HttpPost httpPost = new HttpPost("https://httpbin.org/post");
            
            // 创建表单参数
            List<BasicNameValuePair> params = new ArrayList<>();
            params.add(new BasicNameValuePair("username", "张三"));
            params.add(new BasicNameValuePair("age", "25"));
            params.add(new BasicNameValuePair("city", "北京"));
            
            // 设置表单格式
            httpPost.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));
            
            try (CloseableHttpResponse response = httpClient.execute(httpPost)) {
                String result = EntityUtils.toString(response.getEntity(), "UTF-8");
                System.out.println("状态码:" + response.getStatusLine().getStatusCode());
                System.out.println("响应内容:");
                System.out.println(result);
            }
            
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

📋 工具类封装(推荐)

代码语言:javascript
复制
java

import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

public class HttpClientUtil {
    
    private static final CloseableHttpClient httpClient = HttpClients.createDefault();
    
    // GET请求
    public static String doGet(String url) throws Exception {
        HttpGet httpGet = new HttpGet(url);
        try (CloseableHttpResponse response = httpClient.execute(httpGet)) {
            return EntityUtils.toString(response.getEntity(), "UTF-8");
        }
    }
    
    // POST请求(JSON)
    public static String doPostJson(String url, String json) throws Exception {
        HttpPost httpPost = new HttpPost(url);
        httpPost.setHeader("Content-Type", "application/json");
        httpPost.setEntity(new StringEntity(json, "UTF-8"));
        
        try (CloseableHttpResponse response = httpClient.execute(httpPost)) {
            return EntityUtils.toString(response.getEntity(), "UTF-8");
        }
    }
    
    // 使用示例
    public static void main(String[] args) {
        try {
            String result = doGet("https://api.github.com/users/octocat");
            System.out.println(result);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

⚠️ 常见问题

1. 中文乱码
代码语言:javascript
复制
java

// 一定要指定UTF-8
EntityUtils.toString(entity, "UTF-8");
new StringEntity(json, "UTF-8");
2. 连接超时设置
代码语言:javascript
复制
java

RequestConfig config = RequestConfig.custom()
    .setConnectTimeout(5000)      // 连接超时 5秒
    .setSocketTimeout(5000)       // 读取超时 5秒
    .build();
httpGet.setConfig(config);
3. 关闭连接
代码语言:javascript
复制
java

// 用try-with-resources自动关闭
try (CloseableHttpResponse response = httpClient.execute(httpGet)) {
    // ...
}

🎯 总结

请求类型

核心代码

适用场景

GET

new HttpGet(url)

查询数据

POST(JSON)

setEntity(new StringEntity(json))

提交JSON数据

POST(表单)

new UrlEncodedFormEntity(params)

提交表单

结语:如果对你有帮助,请点赞,关注,收藏

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2026-04-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • HttpClient是干什么的?为什么之前没用过?
  • 📦 什么是HttpClient?
  • 🎯 我们之前为什么没用?
  • 💡 什么时候需要HttpClient?
    • 场景1:调用第三方API(最常用)
    • 场景2:微服务调用
    • 场景3:爬虫
  • 🎬 我们项目里其实"暗中"用了
  • 📊 类比理解
  • 🎯 什么时候我们会用到?
  • ✅ 总结
  • 案例一:GET请求(查天气)
    • 完整代码
    • 运行结果
  • 案例二:POST请求(提交JSON数据)
    • 运行结果
  • 🎨 案例三:带参数的POST(表单提交)
  • 📋 工具类封装(推荐)
  • ⚠️ 常见问题
    • 1. 中文乱码
    • 2. 连接超时设置
    • 3. 关闭连接
  • 🎯 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档