You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Apache HttpPost在Java中构建含JSON参数的请求?

解答你的HttpPost参数相关问题

我来一步步帮你理清这些问题:

1. 关于URL中构建参数结构(对应Firefox里的i(2)/i(3))

首先纠正一个关键理解:Firefox开发者工具里显示的i(2)、i(3)并不是参数名的一部分,只是浏览器为了区分多个同名参数自动加上的序号。实际后端接收的参数名就是i,多个i参数会被解析成数组/列表。

如果要在URL里构建这种结构,直接重复写参数即可:

http://your-api-url?i=value1&i=value2&i=value3

有些后端框架(比如PHP)也支持带方括号的写法:

http://your-api-url?i[]=value1&i[]=value2&i[]=value3

具体用哪种要看后端的解析规则,但第一种是通用的表单参数格式。

2. 在Java中用Apache HttpPost传递JSON参数

如果要把JSON作为请求体传递(而非URL参数),步骤很清晰:

  • 创建HttpPost对象并指定目标URL
  • 设置请求头Content-Type为application/json,告诉后端请求体是JSON格式
  • 把JSON字符串转换成StringEntity,作为请求体传入HttpPost

示例代码:

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;

public class JsonPostDemo {
    public static void main(String[] args) throws Exception {
        try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
            HttpPost httpPost = new HttpPost("http://your-api-endpoint");
            
            // 构造你的JSON请求体
            String jsonBody = "{\"name\":\"karl\",\"hobbies\":[\"coding\",\"reading\"]}";
            
            // 设置请求头和请求体
            httpPost.setHeader("Content-Type", "application/json");
            httpPost.setEntity(new StringEntity(jsonBody, "UTF-8"));
            
            // 执行请求并处理响应
            httpClient.execute(httpPost);
        }
    }
}

3. 用HttpPost添加Map参数(表单格式)

如果是传递表单格式的参数(对应Firefox里的表单数据),要注意:普通Map的键不能重复,所以如果有多个同名参数(比如多个i),不能直接用普通Map,得用List<NameValuePair>来存储。

情况1:参数键都是唯一的

可以把Map转成NameValuePair列表:

import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.message.BasicNameValuePair;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

// 构造参数Map
Map<String, String> paramMap = new HashMap<>();
paramMap.put("username", "karl");
paramMap.put("email", "karl@example.com");

// 转成NameValuePair列表
List<NameValuePair> params = new ArrayList<>();
for (Map.Entry<String, String> entry : paramMap.entrySet()) {
    params.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));
}

// 设置到HttpPost
httpPost.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));

情况2:有多个同名参数(比如多个i)

直接创建多个同名的BasicNameValuePair即可,这时候Firefox里就会显示i(1)、i(2)这类序号:

import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.message.BasicNameValuePair;
import java.util.ArrayList;
import java.util.List;

List<NameValuePair> params = new ArrayList<>();
params.add(new BasicNameValuePair("i", "first-value"));
params.add(new BasicNameValuePair("i", "second-value"));
params.add(new BasicNameValuePair("i", "third-value"));

httpPost.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));

内容的提问来源于stack exchange,提问作者karl person

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 07:35:56