使用RestTemplate发送POST请求时,我一直收到400 BAD请求。这是我的代码:
MultiValueMap<String, Object> requestBody = new LinkedMultiValueMap<String, Object>();
requestBody.add("message_id", "msgid");
requestBody.add("message", "qwerty");
requestBody.add("client_id", "111");
requestBody.add("secret_key", "222");
MultiValueMap<String, String> headers = new LinkedMultiValueMap<String, String>();
headers.add("Accept", "application/json");
headers.add("Content-Type", "application/json");
HttpEntity<MultiValueMap<String, String>> httpEntity = new HttpEntity<MultiValueMap<String, String>>(requestBody, headers);
RestTemplate restTemplate = new RestTemplate();
String response = restTemplate.postForObject("https://abc.com/api/request", httpEntity, String.class);
JSONParser parser = new JSONParser();
try {
JSONObject jsonObject = (JSONObject) parser.parse(response);
System.out.println(jsonObject.get("status"));
} catch (ParseException e) {
e.printStackTrace();
}
我想要实现的是转换ff。 php代码到春天:
<?php
$arr_post_body = array(
"message_id" => "qwerty",
"message" => "Welcome to My life!",
"client_id" => "111",
"secret_key" => "222"
);
$query_string = "";
foreach($arr_post_body as $key => $frow)
{
$query_string .= '&'.$key.'='.$frow;
}
$URL = "https://abc.com/api/request";
$curl_handler = curl_init();
curl_setopt($curl_handler, CURLOPT_URL, $URL);
curl_setopt($curl_handler, CURLOPT_POST, count($arr_post_body));
curl_setopt($curl_handler, CURLOPT_POSTFIELDS, $query_string);
curl_setopt($curl_handler, CURLOPT_RETURNTRANSFER, TRUE);
$response = curl_exec($curl_handler);
curl_close($curl_handler);
exit(0);
?>
有什么问题吗?请注意我正在POST到外部链接(API),它是HTTPS。
答案 0 :(得分:2)
在您的HTTP标头中添加接受和内容类型后,您是否对其进行了测试?
MultiValueMap<String, Object> headers = new LinkedMultiValueMap<String, Object>();
headers.add("Accept", "application/json");
headers.add("Content-Type", "application/json");
然后添加您的请求正文并使用 RestTemplate 进行 postForObject 调用。
答案 1 :(得分:1)
只要您在使用Spring的REST模板发出POST请求后期待/获取数据,最好使用的方法是restTemplate.exchange()
,而不是restTemplate.postForObject()
。
所以你的代码应该是这样的:
HttpHeader headers = new HttpHeaders();
headers.add("Content-Type", MediaType.APPLICATION_JSON.toString());
headers.add("Accept", MediaType.APPLICATION_JSON.toString());
MultiValueMap<String, String> requestBody = new LinkedMultiValueMap<String, String>();
requestBody.add("message_id", "msgid");
requestBody.add("message", "qwerty");
requestBody.add("client_id", "111");
requestBody.add("secret_key", "222");
HttpEntity formEntity = new HttpEntity<MultiValueMap<String, String>>(requestBody, headers);
ResponseEntity<AccessToken> response =
restTemplate.exchange("https://abc.com/api/request", HttpMethod.POST,
formEntity, YourPojoThatMapsToJsonResponse.class);
最后请注意YourPojoThatMapsToJsonResponse.class。 exchange()方法将自动查看您的JSON响应并尝试将其转换为已定义映射到该JSON结构的POJO。换句话说,您应该已经创建了该类。如果你还没有,JSONParser.class可能适合你的情况,但是没有保证。
尝试一下,让我知道它是怎么回事。
答案 2 :(得分:1)
正如The Saint和RE350所解释的,这很可能是HTTP头问题。以下是我解决它的方法。
使用Postman(chrome)进行HTTP调用(与使用RestTemplate执行的调用相同)。它应该是成功的。打开Network tab of the Inspect Element tool以检查HTTP请求的标头。
配置TCP/IP Monitor of your Eclipse以监控localhost:8081,并在您的代码中,用localhost:8081替换restTemplate的目标网址。
restTemplate.exchange("http://localhost:8081", HttpMethod.POST, httpEntity, String.class);
运行你的应用;您将能够看到TCP / IP监视器中使用了哪些HTTP标头。