Java的HttpClient中使用POST请求传递参数两种常见方式

 更新时间:2025年06月10日 09:11:59   作者:+720  
Apache HttpClient为开发者提供了丰富的接口,用于管理HTTP连接并执行请求,下面这篇文章主要介绍了Java的HttpClient中使用POST请求传递参数两种常见方式,文中通过代码介绍的非常详细,需要的朋友可以参考下

在 Java 的 HttpClient 中,如果使用 POST 请求传递参数,有两种常见方式:

  • 通过请求体传递(通常是 JSON 或 XML 格式,适用于 RPC)。
  • 通过表单参数传递(类似于 HTML 表单提交,使用键值对)。

由于你提到的是 RPC POST 请求,我假设你想知道如何在 POST 请求中传递参数,尤其是结合 RPC 的场景。下面我将分别讲解这两种方式,并提供示例代码。

方法 1:通过请求体传递参数(JSON 格式,推荐用于 RPC)

这是 RPC 中最常见的方式,参数以 JSON 格式放在请求体中发送。

示例代码

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;

import java.io.IOException;

public class RpcPostWithJsonParams {
    public static void main(String[] args) {
        // 目标 RPC 服务的 URL
        String url = "http://example.com/api/rpc";

        // 定义要传递的参数(JSON 格式)
        String jsonParams = "{\"method\":\"sayHello\",\"params\":{\"name\":\"张三\",\"age\":25},\"id\":1}";

        try {
            // 创建 HttpClient 实例
            CloseableHttpClient httpClient = HttpClients.createDefault();

            // 创建 POST 请求
            HttpPost httpPost = new HttpPost(url);

            // 设置请求头
            httpPost.setHeader("Content-Type", "application/json");
            httpPost.setHeader("Accept", "application/json");

            // 设置请求体(JSON 参数)
            StringEntity entity = new StringEntity(jsonParams, "UTF-8");
            httpPost.setEntity(entity);

            // 执行请求并获取响应
            try (CloseableHttpResponse response = httpClient.execute(httpPost)) {
                int statusCode = response.getStatusLine().getStatusCode();
                System.out.println("状态码: " + statusCode);

                String responseBody = EntityUtils.toString(response.getEntity(), "UTF-8");
                System.out.println("响应内容: " + responseBody);
            }

            // 关闭 HttpClient
            httpClient.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

说明

  • 参数构造jsonParams 是 JSON 字符串,包含 RPC 的方法名(method)、参数(params)和 ID(id)。你可以根据需要调整 params 中的内容,比如添加更多键值对。
  • 请求体:使用 StringEntity 将 JSON 字符串设置为请求体。
  • 适用场景:这种方式适合复杂的参数结构,尤其是在 RPC 中需要传递嵌套对象时。

方法 2:通过表单参数传递(键值对形式)

如果你的 RPC 服务支持表单参数(类似于 application/x-www-form-urlencoded),可以用键值对的方式传递参数。

示例代码

import org.apache.http.NameValuePair;
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.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class RpcPostWithFormParams {
    public static void main(String[] args) {
        // 目标 RPC 服务的 URL
        String url = "http://example.com/api/rpc";

        try {
            // 创建 HttpClient 实例
            CloseableHttpClient httpClient = HttpClients.createDefault();

            // 创建 POST 请求
            HttpPost httpPost = new HttpPost(url);

            // 定义表单参数
            List<NameValuePair> params = new ArrayList<>();
            params.add(new BasicNameValuePair("method", "sayHello"));
            params.add(new BasicNameValuePair("name", "张三"));
            params.add(new BasicNameValuePair("age", "25"));
            params.add(new BasicNameValuePair("id", "1"));

            // 设置请求体(表单参数)
            UrlEncodedFormEntity entity = new UrlEncodedFormEntity(params, "UTF-8");
            httpPost.setEntity(entity);

            // 设置请求头(可选)
            httpPost.setHeader("Content-Type", "application/x-www-form-urlencoded");

            // 执行请求并获取响应
            try (CloseableHttpResponse response = httpClient.execute(httpPost)) {
                int statusCode = response.getStatusLine().getStatusCode();
                System.out.println("状态码: " + statusCode);

                String responseBody = EntityUtils.toString(response.getEntity(), "UTF-8");
                System.out.println("响应内容: " + responseBody);
            }

            // 关闭 HttpClient
            httpClient.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

说明

  • 参数构造:使用 List<NameValuePair> 定义键值对形式的参数。
  • 请求体:通过 UrlEncodedFormEntity 将参数编码为表单格式。
  • 适用场景:适合简单的键值对参数,不支持复杂的嵌套结构。

两种方法的对比

特性JSON 请求体表单参数
数据格式JSON(如 {"key":"value"}键值对(如 key=value
复杂性支持嵌套对象、数组等仅支持简单键值对
Content-Typeapplication/jsonapplication/x-www-form-urlencoded
RPC 适用性更常用,灵活性高较少用,适合简单场景

注意事项

  • 服务端要求:确认你的 RPC 服务接受哪种参数格式(JSON 或表单),并相应调整代码。
  • 参数动态化:在实际应用中,参数可能是动态生成的,可以从方法参数或对象中构建 JSON/表单数据。
    • 例如,使用 JSONObject(如 Jackson 或 Gson)生成 JSON:
      import com.fasterxml.jackson.databind.ObjectMapper;
      ObjectMapper mapper = new ObjectMapper();
      String jsonParams = mapper.writeValueAsString(new MyRpcRequest("sayHello", Map.of("name", "张三"), 1));
      
  • 调试:可以用工具(如 Postman)先测试服务端接口,确保参数格式正确。

如果你有具体的参数结构或服务端要求,可以告诉我,我帮你进一步优化代码!有什么问题吗?

总结

到此这篇关于Java的HttpClient中使用POST请求传递参数两种常见方式的文章就介绍到这了,更多相关Java HttpClient用POST请求传递参数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot 整合 Spring-Session 实现分布式会话项目实战

    SpringBoot 整合 Spring-Session 实现分布式会话项目实战

    本文主要介绍了SpringBoot 整合 Spring-Session 实现分布式会话项目实战,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • Java修改Integer变量值遇到的问题及解决

    Java修改Integer变量值遇到的问题及解决

    这篇文章主要介绍了Java修改Integer变量值遇到的问题及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • Java Stream 流中 Collectors.toMap 的用法详解

    Java Stream 流中 Collectors.toMap 的用法详解

    这篇文章主要介绍了Stream 流中 Collectors.toMap 的用法,Collectors.toMap()方法是把List转Map的操作,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2024-01-01
  • 详解Spark Sql在UDF中如何引用外部数据

    详解Spark Sql在UDF中如何引用外部数据

    这篇文章主要为大家介绍了详解Spark Sql在UDF中如何引用外部数据示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • Spring Cache手动清理Redis缓存

    Spring Cache手动清理Redis缓存

    这篇文章主要介绍了Spring Cache手动清理Redis缓存,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • 详解SpringMVC中拦截器的概念及入门案例

    详解SpringMVC中拦截器的概念及入门案例

    拦截器(Interceptor)是一种动态拦截方法调用的机制,在SpringMVC中动态拦截控制器方法的执行。本文将详细讲讲SpringMVC中拦截器的概念及入门案例,感兴趣的可以尝试一下
    2022-07-07
  • spring boot 项目利用Jenkins实现自动化部署的教程详解

    spring boot 项目利用Jenkins实现自动化部署的教程详解

    这篇文章主要介绍了spring boot 项目利用Jenkins实现自动化部署的方法,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-07-07
  • Java中断一个线程操作示例

    Java中断一个线程操作示例

    这篇文章主要介绍了Java中断一个线程操作,结合实例形式分析了java中断线程相关的interrupt()、isInterrupted()及interrupted()函数使用技巧,需要的朋友可以参考下
    2019-10-10
  • IDEA使用入门小白操作教程

    IDEA使用入门小白操作教程

    IntelliJ IDEA,就是Java语言开发工具 (IDE) 功能与Eclipse同类!本文通过图文并茂的形式给大家介绍IntelliJ IDEA使用入门教程,非常适合新手小白操作,感兴趣的朋友一起看看吧
    2020-10-10
  • Java 抽象类与接口的对比

    Java 抽象类与接口的对比

    这篇文章主要介绍了Java 抽象类与接口的对比,帮助大家更好的理解和学习Java,感兴趣的朋友可以了解下
    2020-08-08

最新评论