使用Java和Apache HttpClient进行HTTP POST请求示例

在Java应用程序中,使用Apache HttpClient库进行HTTP POST请求是非常常见和有用的。本文将展示如何使用Apache HttpClient库发送带有JSON数据的POST请求,并处理返回的响应。

1. 引言

在现代软件开发中,与外部API进行通信是非常普遍的需求。本文将展示一个场景:如何使用Java编写代码,向一个API发送包含JSON数据的POST请求,并处理返回的响应数据。

2. 准备工作

确保你的开发环境中包含以下依赖:

Apache HttpClient库(版本4.5.7)
JSON处理库,例如阿里巴巴的FastJSON和Jackson ObjectMapper
在Maven项目中,可以通过以下方式引入Apache HttpClient库的依赖:

<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5.7</version>
</dependency>

3. 示例代码解析

以下是一个示例代码,演示了如何使用Apache HttpClient发送HTTP POST请求,并处理返回的响应数据。

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.http.Header;
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.message.BasicHeader;
import org.apache.http.util.EntityUtils;
import java.util.LinkedHashMap;
import java.util.Map;

public class HttpClientExample {

    public static void main(String[] args) {
        // 准备请求体数据
        Map<String, Object> body = new LinkedHashMap<>();
        body.put("id", "123456");
        body.put("code", "CODE123");
        body.put("total", 10); // 示例:设置请求体中的total字段为商品数量
        ArrayList<Object> goodsList = new ArrayList<>();
        body.put("goods", goodsList); 

        // 生成当前时间戳
        String timestamp = String.valueOf(System.currentTimeMillis());
        // 将请求体数据转换为JSON格式的字符串
        String bodyStr = JSON.toJSONString(body, SerializerFeature.WriteMapNullValue);
        // 获取访问令牌
        String accessToken = getAccessToken();

        // 检查访问令牌是否获取成功
        if (accessToken == null) {
            System.out.println("获取accessToken失败");
            return;
        }

        // 生成随机数
        String randomNumber = createRandomNumber();
        
        // 假设appSecret是从配置中获取的应用密钥
        String appSecret = "your_app_secret"; 

        // 生成签名
        String sign = getSign(bodyStr, timestamp, accessToken, randomNumber, appSecret);

        // 创建请求头
        Header[] headers = new Header[]{
                new BasicHeader("Content-Type", "application/json"), // 设置Content-Type为JSON格式
                new BasicHeader("sign", sign), // 设置签名字段
                new BasicHeader("timestamp", timestamp), // 设置时间戳字段
                new BasicHeader("token", accessToken), // 设置访问令牌字段
                new BasicHeader("randomNumber", randomNumber) // 设置随机数字段
        };

        // 创建请求体
        StringEntity requestBody = new StringEntity(bodyStr, "UTF-8");

        // 假设config是从配置文件中获取的API接口URL
        String url = "your_api_url";

        // 创建HTTP客户端
        try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
            // 创建POST请求对象,并指定URL
            HttpPost httpPost = new HttpPost(url);
            // 设置请求体
            httpPost.setEntity(requestBody);
            // 设置请求头
            httpPost.setHeaders(headers);

            // 打印日志信息方便调试
            System.out.println("请求头信息: " + JSON.toJSONString(headers));
            System.out.println("请求体信息: " + bodyStr);
            System.out.println("请求URL: " + url);

            // 执行HTTP POST请求
            try (CloseableHttpResponse response = httpClient.execute(httpPost)) {
                // 判断HTTP响应状态码是否为200
                if (response.getStatusLine().getStatusCode() == 200) {
                    // 获取响应实体
                    HttpEntity responseEntity = response.getEntity();
                    String responseBody = EntityUtils.toString(responseEntity);
                    System.out.println("响应体信息: " + responseBody);

                    // 解析响应JSON数据到Map
                    ObjectMapper mapper = new ObjectMapper();
                    Map<String, Object> responseData = mapper.readValue(responseBody, Map.class);
                    String msg = (String) responseData.get("msg");
                    Integer code = (Integer) responseData.get("code");
                    System.out.println("响应消息: " + msg + ", 状态码: " + code);
                } else {
                    // 处理HTTP请求失败的情况
                    String code = String.valueOf(response.getStatusLine().getStatusCode());
                    String msg = response.getStatusLine().getReasonPhrase();
                    System.out.println("请求失败, 状态码: " + code + ", 原因: " + msg);
                }
            } catch (Exception e) {
                // 记录异常情况
                System.err.println("HTTP POST请求异常: " + e.getMessage());
            }
        } catch (Exception e) {
            // 记录异常情况
            System.err.println("创建HTTP客户端异常: " + e.getMessage());
        }
    }

    // 示例方法:获取访问令牌
    private static String getAccessToken() {
        // 实际场景中的具体实现
        return "your_access_token";
    }

    // 示例方法:生成随机数
    private static String createRandomNumber() {
        // 实际场景中的具体实现
        return "random_number";
    }

    // 示例方法:生成签名
    private static String getSign(String body, String timestamp, String accessToken, String randomNumber, String appSecret) {
        // 实际场景中的具体实现
        return "generated_sign";
    }
}

4. 结论

本文展示了如何使用Java和Apache HttpClient库进行HTTP POST请求,发送包含JSON数据的请求体,并处理返回的响应数据。这种方法可以适用于各种需要与外部API进行通信的场景,如数据推送、订单处理等。通过合理设置请求头和请求体,并进行异常处理,可以保证通信的可靠性和安全性。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

18.动态规划之斐波那契数列模型1

1.第N个斐波那契数 1137. 第 N 个泰波那契数 - 力扣&#xff08;LeetCode&#xff09; 做题流程 1. 状态表示&#xff1a; 这道题可以【根据题目的要求】直接定义出状态表示&#xff1a; dp[i] 表示&#xff1a;第 i 个泰波那契数的值。 2. 状态转移方程&#xff1a; …

Social to Sales全链路,数说故事专享会开启出海新视角

————瞎出海&#xff0c;必出局 TikTok&#xff0c;这个充满活力的短视频平台&#xff0c;已经成为全球范围内不可忽视的电商巨头。就在6月8日&#xff0c;TikTok美区带货直播诞生了首个“百万大场”。在此之前&#xff0c;百万GMV被视为一道难以逾越的高墙。以TikTok为首的…

Zabbix分布式监控

目录 分布式监控架构 实现分布式监控的步骤 优点和应用场景 安装Zabbix_Proxy Server端Web页面配置 测试 Zabbix 的分布式监控架构允许在大规模和地理上分散的环境中进行高效的监控。通过分布式监控&#xff0c;Zabbix 可以扩展其监控能力&#xff0c;支持大量主机和设备…

Android - 云游戏本地悬浮输入框实现

一、简述 云游戏输入法分两种情况,以云化原神为例,分为 云端输入法 和 本地输入法,运行效果如下: 云端输入法本地输入法云端输入法 就是运行在云端设备上的输入法,对于不同客户端来说(Android、iPhone),运行效果一致。 本地输入法 则是运行在用户侧设备上的输入法,对…

WordPress开发进群V2主题源码,多种引流方法,引私域二次变现

WordPress开发进群V2主题源码&#xff0c;多种引流方法&#xff0c;引私域二次变现 全新前端UI界面&#xff0c;多种前端交互特效让页面不再单调&#xff0c;进群页面群成员数&#xff0c;群成员头像名称&#xff0c;每次刷新页面随机更新不重复&#xff0c;最下面评论和点赞也…

C语言编程3:运算符,运算符的基本用法

C语言3&#x1f525;&#xff1a;运算符&#xff0c;运算符的基本用法 一、运算符&#x1f33f; &#x1f387;1.1 定义 运算符是指进行运算的动作&#xff0c;比如加法运算符"“&#xff0c;减法运算符”-" 算子是指参与运算的值&#xff0c;这个值可能是常数&a…

4.动态SQL(if,choose,where,set,trim,foreach遍历)的使用+$和#的区别

文章目录 动态sql一、动态sql1.if条件判断2、choose、when、otherwise3、where标签4、set标签5、trim标签1)替代where标签效果2) 生成set标签效果 6、foreach迭代遍历1)属性 7.SQL标签-提取重用的SQL代码片段8、bind标签9.MyBatis中${}和#{}的区别: 动态sql 一、动态sql 常见…

React -- useState状态更新异步特性——导致获取值为旧值的问题

useState状态异步更新 问题导致的原因解决办法进一步分析后续遇到的新问题 问题 const [isSelecting, setIsSelecting] useState(false);useEffect(() > {const handleKeyDown (event) > {if (event.key Escape) {if(isSelectingRef){//.......setIsSelecting(!isSele…

js使用proxy代理监听控制事件

本文为proxy代理的实例应用&#xff0c;有关代理的内容可以参考&#xff1a; js语法---理解反射Reflect对象和代理Proxy对象 监听事件 要监听dom元素的事件&#xff0c;我们会采用回调触发的方式来执行操作&#xff0c; 而触发事件的过程很明显是一个异步操作&#xff0c;异…

Oracle中EXIT Statement用于终止循环语句的关键字

Oracle的EXIT Statement是PL/SQL编程语言中用于终止循环语句的关键字。它有两种主要形式&#xff1a;无条件EXIT和条件EXIT WHEN。以下是对Oracle EXIT Statement的详细解释&#xff1a; 1. 无条件EXIT 语法&#xff1a;EXIT; 作用&#xff1a;无条件地终止当前循环。当程序执…

【咨询】企业数字档案馆(室)建设方案-模版范例

导读&#xff1a;本模版来源某国有大型医药行业集团企业数字档案馆&#xff08;室&#xff09;建设方案&#xff08;一期300W、二期250W&#xff09;&#xff0c;本人作为方案的主要参与者&#xff0c;总结其中要点给大家参考。 目录 1、一级提纲总览 2、项目概述 3、总体规…

办公必备——ONLYOFFICE8.1版本桌面编辑器

一、介绍ONLYOFFICE ONLYOFFICE是一款免费的开源办公软件&#xff0c;它可以让你创建、编辑和分享文档、表格和演示文稿。就像微软的Office一样&#xff0c;但它是完全免费的&#xff0c;而且可以在多种设备上使用&#xff0c;包括电脑和手机。它还支持多人同时在线编辑文档&am…

SpringCloud 负载均衡

目录 一、负载均衡 1、问题 2、什么是负载均衡 服务端负载均衡 客户端负载均衡 二、Spring Cloud LoadBalance 1、使用 Spring Cloud LoadBalance 2、负载均衡策略 3、LoadBalancer 原理 一、负载均衡 1、问题 我们来看一下前面写的代码&#xff1a; List<Serv…

抖音矩阵云剪系统saas源码 短视频矩阵获客管理系统

2024抖音矩阵云混剪系统是一款专业的短视频营销管理工具。该系统支持多平台多账号的集中式管理&#xff0c;并实现一键式作品发布功能。它配备了智能标题生成和关键词优化工具&#xff0c;以及排名查询机制&#xff0c;帮助用户提升内容在平台上更好的矩阵管理. 智能剪辑 托管发…

java中 使用数组实现需求小案例

Date: 2024.04.08 18:32:57 author: lijianzhan 需求实现&#xff1a; 设计一个java类&#xff0c;java方法&#xff0c;根据用户手动输入的绩点&#xff0c;从而获取到绩点最高的成绩。 实现业务逻辑的代码块 import java.util.Scanner;public class PointDemo {/*** 需求&…

Python 如何实现数据驱动的接口自动化测试

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 大家在接口测试的过程中&#xff0c;很多时候会用到对CSV的读取操作&#xff0c;本文主要说明Pyt…

【Java]认识泛型

包装类 在Java中&#xff0c;由于基本类型不是继承自Object&#xff0c;为了在泛型代码中可以支持基本类型&#xff0c;Java给每个基本类型都对应了一个包装类型。 除了 Integer 和 Character&#xff0c; 其余基本类型的包装类都是首字母大写。 泛型 泛型是在JDK1.5引入的…

spring boot 3.x版本中集成spring security 6.x版本进行实现动态权限控制解决方案

一、背景 最近在进行项目从jdk8和spring boot 2.7.x版本技术架构向jdk17和spring boot 3.3.x版本的代码迁移&#xff0c;在迁移过程中&#xff0c;发现spring boot 3.3.x版本依赖的spring security版本已经升级6.x版本了&#xff0c;语法上和spring security 5.x版本有很多地方…

AntV X6 图编辑引擎速通

前言&#xff1a;参考 [AntV X6 官网](https://x6.antv.antgroup.com/) 一、简介 X6 可以快速搭建 DAG 图、ER 图、流程图、血缘图等应用。 二、快速上手 1. 安装 npm install antv/x6 --save# oryarn add antv/x6# orpnpm add antv/x6 2. 使用 2.1 初始画布 在页面中创…

【Linux进阶】文件系统3——目录树,挂载

前言 在Windows 系统重新安装之前&#xff0c;你可能会事先考虑&#xff0c;到底系统盘C盘要有多大容量&#xff1f;而数据盘D盘又要给多大容量等&#xff0c;然后实际安装的时候&#xff0c;你会发现其实C盘之前会有个100MB的分区被独立出来&#xff0c;所以实际上你就会有三个…