【发布时间】:2020-04-30 13:47:06
【问题描述】:
我需要在 java/spring boot 中发送一个带有 json 正文的 GET 请求。我知道反对它的建议,但是我必须这样做有几个原因: 1. 我使用的第 3 方 API 只允许 GET 请求,所以 POST 不是一个选项。 2. 我需要在正文中传递一个非常大的参数(大约 8-10k 个字符的逗号分隔列表),因此也不可以将查询参数附加到 url。
我尝试了几种不同的方法:
apache HttpClient 来自这里:Send content body with HTTP GET Request in Java。这直接从 API 本身给出了一些关于错误密钥的错误。
URIComponentsBuilder 来自此处:Spring RestTemplate GET with parameters。这只是将参数添加到 url 上,正如我之前解释的那样,这不是一个选项。
restTemplate.exchange。这似乎是最直接的,但对象不会通过:https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/client/RestTemplate.html#exchange-java.lang.String-org.springframework.http.HttpMethod-org.springframework.http.HttpEntity-java.lang.Class-java.util.Map-
可能还有一两件事我已经忘记了。
Here is what I'm talking about in Postman。我需要能够传递这里给出的两个参数。如果通过 Postman 运行它可以正常工作,但我无法在 Java/Spring Boot 中解决。
这是来自 restTemplate.exchange 尝试的代码 sn-p:
public String makeMMSICall(String uri, List<String> MMSIBatchList, HashMap<String, String> headersList) {
ResponseEntity<String> result = null;
try {
RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
for (String key : headersList.keySet()) {
headers.add(key, headersList.get(key));
}
Map<String, String> params = new HashMap<String, String>();
params.put("mmsi", String.join(",", MMSIBatchList));
params.put("limit", mmsiBatchSize);
HttpEntity<?> entity = new HttpEntity<>(headers);
result = restTemplate.exchange(uri, HttpMethod.GET, entity, String.class, params);
System.out.println(result.getBody());
} catch (RestClientException e) {
LOGGER.error("Exception in makeGetHTTPCall :" + e.getMessage());
throw e;
} catch (Exception e) {
LOGGER.error("Exception in makeGetHTTPCall :" + e.getMessage());
throw e;
}
return result.getBody();
}
感谢您的帮助!
【问题讨论】:
-
如您所说,不建议发送带有 GET 操作的请求正文。但是当您尝试 restTemplate.exchange 时,日志说了什么?你确定你使用了正确的语法吗?如果你能提供一些日志和代码,那会更有帮助。
-
我在尝试使用 restTemplate.exchange 时添加了一个代码 sn-p。日志没有显示任何异常,除了人们期望在不带参数的情况下对 API 的默认调用所获得的 API 结果。
-
GET 请求不包含正文。你不能做你想做的事。使用 POST、PUT 或其他接受正文的方法。
-
正如我在问题正文中所述,由于 API 限制,POST/PUT 不是一个选项。我知道这是可能的,因为 Postman 能够做到这一点,并且还有许多其他问题承认这是可能的,但只要你喜欢这里就建议不要这样做:stackoverflow.com/questions/978061/…。在这一点上我无法避免它。
标签: java spring spring-boot