如何使用 Apache HTTP 客户端将复杂参数传递给 POST 请求?
How to pass complex parameter to POST request using Apache HTTP client?
我尝试用这样的正文发送 POST
请求
{
"method": "getAreas",
"methodProperties": {
"prop1" : "value1",
"prop2" : "value2",
}
}
这是我的代码
static final String HOST = "https://somehost.com";
public String sendPost(String method,
Map<String, String> methodProperties) throws ClientProtocolException, IOException {
HttpPost post = new HttpPost(HOST);
List<NameValuePair> urlParameters = new ArrayList<>();
urlParameters.add(new BasicNameValuePair("method", method));
List<NameValuePair> methodPropertiesList = methodProperties.entrySet().stream()
.map(entry -> new BasicNameValuePair(entry.getKey(), entry.getValue()))
.collect(Collectors.toList());
// ??? urlParameters.add(new BasicNameValuePair("methodProperties", methodPropertiesList));
post.setEntity(new UrlEncodedFormEntity(urlParameters));
try (CloseableHttpClient httpClient = HttpClients.createDefault();
CloseableHttpResponse response = httpClient.execute(post)) {
return EntityUtils.toString(response.getEntity());
}
}
但是 BasicNameValuePair
的构造函数适用 (String, String)
。所以我需要另一个 class 来代替。
有什么办法可以把methodPropertiesList
加到urlParameters
上吗?
您的请求看起来像一个 json 结构,所以 post 数据如下:
class pojo1{
String method;
Map<String,String> methodProperties;
}
String postUrl = "www.site.com";// put in your url
Gson gson = new Gson();
HttpClient httpClient = HttpClientBuilder.create().build();
HttpPost post = new HttpPost(postUrl);
StringEntity postingString = new StringEntity(gson.toJson(pojo1));//gson.tojson() converts your pojo to json
post.setEntity(postingString);
post.setHeader("Content-type", "application/json");
HttpResponse response = httpClient.execute(post);
参考:
这个问题有一个众所周知的方法。
在大多数情况下,您将创建自己的对象来描述您要在 HttpPost 中发送的内容。所以你会得到类似的东西:
static final String HOST = "https://somehost.com";
public String sendPost(String method,
Map<String, String> methodProperties) throws ClientProtocolException, IOException {
HttpPost post = new HttpPost(HOST);
MyResource resource = new MyResource();
resource.setMethod(method);
MyNestedResource nestedResource = new MyNestedResource();
nestedResource.setMethodProperties(methodProperties);
resource.setNestedResourceMethodProperties(nestedResource);
StringEntity strEntity = new StringEntity(gson.toJson(resource));
post.setEntity(strEntity);
try (CloseableHttpClient httpClient = HttpClients.createDefault();
CloseableHttpResponse response = httpClient.execute(post)) {
return EntityUtils.toString(response.getEntity());
}
}
这通常是您处理具有嵌套结构的更复杂 json 对象的方式。您必须为要发送的资源创建 classes(在您的示例中它可能是一个 class 并在其中使用 map,但通常您会为嵌套的资源创建一个 class如果它具有特定的结构,它也是对象)。为了更好地了解整个画面,请阅读本教程:https://www.baeldung.com/jackson-mapping-dynamic-object
使用 Sushil Mittal 答案是我的解决方案
static final String HOST = "https://somehost.com";
public String sendPost(String method, Map<String, String> methodProperties) throws ClientProtocolException, IOException {
HttpPost post = new HttpPost(HOST);
Gson gson = new Gson();
Params params = new Params(method, methodProperties);
StringEntity entity = new StringEntity(gson.toJson(params));
post.setEntity(entity);
try (CloseableHttpClient httpClient = HttpClients.createDefault();
CloseableHttpResponse response = httpClient.execute(post)) {
return EntityUtils.toString(response.getEntity());
}
}
class Params {
String method;
Map<String, String> methodProperties;
public Params(String method, Map<String, String> methodProperties) {
this.method = method;
this.methodProperties = methodProperties;
}
//getters
}
我尝试用这样的正文发送 POST
请求
{
"method": "getAreas",
"methodProperties": {
"prop1" : "value1",
"prop2" : "value2",
}
}
这是我的代码
static final String HOST = "https://somehost.com";
public String sendPost(String method,
Map<String, String> methodProperties) throws ClientProtocolException, IOException {
HttpPost post = new HttpPost(HOST);
List<NameValuePair> urlParameters = new ArrayList<>();
urlParameters.add(new BasicNameValuePair("method", method));
List<NameValuePair> methodPropertiesList = methodProperties.entrySet().stream()
.map(entry -> new BasicNameValuePair(entry.getKey(), entry.getValue()))
.collect(Collectors.toList());
// ??? urlParameters.add(new BasicNameValuePair("methodProperties", methodPropertiesList));
post.setEntity(new UrlEncodedFormEntity(urlParameters));
try (CloseableHttpClient httpClient = HttpClients.createDefault();
CloseableHttpResponse response = httpClient.execute(post)) {
return EntityUtils.toString(response.getEntity());
}
}
但是 BasicNameValuePair
的构造函数适用 (String, String)
。所以我需要另一个 class 来代替。
有什么办法可以把methodPropertiesList
加到urlParameters
上吗?
您的请求看起来像一个 json 结构,所以 post 数据如下:
class pojo1{
String method;
Map<String,String> methodProperties;
}
String postUrl = "www.site.com";// put in your url
Gson gson = new Gson();
HttpClient httpClient = HttpClientBuilder.create().build();
HttpPost post = new HttpPost(postUrl);
StringEntity postingString = new StringEntity(gson.toJson(pojo1));//gson.tojson() converts your pojo to json
post.setEntity(postingString);
post.setHeader("Content-type", "application/json");
HttpResponse response = httpClient.execute(post);
参考:
这个问题有一个众所周知的方法。 在大多数情况下,您将创建自己的对象来描述您要在 HttpPost 中发送的内容。所以你会得到类似的东西:
static final String HOST = "https://somehost.com";
public String sendPost(String method,
Map<String, String> methodProperties) throws ClientProtocolException, IOException {
HttpPost post = new HttpPost(HOST);
MyResource resource = new MyResource();
resource.setMethod(method);
MyNestedResource nestedResource = new MyNestedResource();
nestedResource.setMethodProperties(methodProperties);
resource.setNestedResourceMethodProperties(nestedResource);
StringEntity strEntity = new StringEntity(gson.toJson(resource));
post.setEntity(strEntity);
try (CloseableHttpClient httpClient = HttpClients.createDefault();
CloseableHttpResponse response = httpClient.execute(post)) {
return EntityUtils.toString(response.getEntity());
}
}
这通常是您处理具有嵌套结构的更复杂 json 对象的方式。您必须为要发送的资源创建 classes(在您的示例中它可能是一个 class 并在其中使用 map,但通常您会为嵌套的资源创建一个 class如果它具有特定的结构,它也是对象)。为了更好地了解整个画面,请阅读本教程:https://www.baeldung.com/jackson-mapping-dynamic-object
使用 Sushil Mittal 答案是我的解决方案
static final String HOST = "https://somehost.com";
public String sendPost(String method, Map<String, String> methodProperties) throws ClientProtocolException, IOException {
HttpPost post = new HttpPost(HOST);
Gson gson = new Gson();
Params params = new Params(method, methodProperties);
StringEntity entity = new StringEntity(gson.toJson(params));
post.setEntity(entity);
try (CloseableHttpClient httpClient = HttpClients.createDefault();
CloseableHttpResponse response = httpClient.execute(post)) {
return EntityUtils.toString(response.getEntity());
}
}
class Params {
String method;
Map<String, String> methodProperties;
public Params(String method, Map<String, String> methodProperties) {
this.method = method;
this.methodProperties = methodProperties;
}
//getters
}