我有以下 curl 表达式:
curl --data 'api_key=API_Key' --data-urlencode 'event=[{"user_id":"12345", "event_type":"buy_song"}]' https://someapi
应将其转换为 RestTemplate.postForEntity 调用。我这样进行转换:
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
params.add("api_key", "API_Key");
params.add("event", URLEncoder.encode(objectMapper.writeValueAsString(Collections.singletonList(e)), "UTF-8"));
// send
HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<>(params, headers);
ResponseEntity<String> response = restTemplate.postForEntity("https://someapi", request, String.class);
服务器返回400错误请求
我确认 Jackson 的 objectmapper 正确序列化了对象 objectMapper.writeValueAsString(Collections.singletonList(e))
我怀疑我无法正确处理 RestTemplate 中示例curl 中的 --data
和 --data-urlencode
的混合。
你能建议我做错了什么吗?
最佳答案
// org.apache.commons.collections.map.HashedMap
HashedMap requestBody = new HashedMap();
requestBody.put("api_key", "API_Key");
requestBody.put("event", URLEncoder.encode(objectMapper.writeValueAsString(Collections.singletonList(e)), "UTF-8"));
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
String jsonBody = new ObjectMapper().writeValueAsString(requestBody);
HttpEntity<String> entity = new HttpEntity<>(jsonBody, headers);
ResponseEntity<String> response = restTemplate.postForEntity("https://someapi", entity, String.class);
关于java - 将curl命令转换为RestTemplate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56391225/