【发布时间】:2020-02-04 13:00:21
【问题描述】:
我正在 Spring Boot 中开发一个客户端,它 POST 一些数据到远程 REST 服务并检索结果。我能够将其提交到远程服务并在第一次尝试时获得SUCCESS响应。
但在随后的尝试中,我在向远程提交相同的请求时收到 404 错误。我可以使用 Postman 或 Insomnia Tools 实现相同的效果,但无法理解 Java 缺少的不同元素是什么。
如果我重新启动服务器,这个 sn-p 可以正常工作,这意味着我的应用程序错误地卡住了,这阻止了它 POSTed 到远程服务。
这里是sn-p
public static ApiResponse postRequest(String url, String apiId, Token token, Product product, String data, Object type)
throws JsonParseException, JsonMappingException, UnsupportedOperationException, IOException {
ObjectMapper mapper = new ObjectMapper();
PolicyResponse mResponse = null;
apiError apiError = null;
ApiResponse apiResponse = new ApiResponse();
InputStream responseStream = null;
try {
HttpHeaders headers = new HttpHeaders();
headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
headers.set("User-Agent", "MY Framework"+new Date() + new Random().nextDouble());
headers.set("Content-Type", "application/json");
if(token != null) {
headers.set(HttpHeaders.AUTHORIZATION, "Bearer " + token.getAccessToken());
}
headers.set("Accept", MediaType.APPLICATION_JSON_VALUE);
headers.setCacheControl("no-cache");
HttpEntity request = new HttpEntity<>(data,headers);
logger.info("Headers " + headers);
if(token != null) {
logger.info("Token " + token.getAccessToken());
}
logger.info("PolicyURL :: " + url);
logger.info("API ID :: " + apiId);
logger.info("Request Data :: " + data);
RestTemplate restTemplate = new RestTemplate();
ResponseEntity <JsonNode>response = restTemplate.exchange(url,
HttpMethod.POST,
request,
JsonNode.class);
logger.debug("Response Data :: " + response.getBody());
mapper.configure(Feature.AUTO_CLOSE_SOURCE, true);
if (null != response) {
apiResponse.setApiId(apiId);
if (response.getStatusCode() == HttpStatus.OK || response.getStatusCode() == HttpStatus.CREATED) {
apiResponse.setHttpResponse(response.getBody().toString());
apiResponse.setJsonNode(response.getBody());
logger.debug(response.getBody().toString());
} else {
logger.debug("Error Response " + response.getBody());
apiError apiError = mapper.readValue(response.getBody().toString(), new TypeReference<apiError>() {
});
apiResponse.setHttpResponse(response.getBody().toString());
apiResponse.setHttpResponseMessage(apiError.getMessage());
}
}
apiResponse.setHttpStatusCode(String.valueOf(response.getStatusCode()));
}
catch(HttpClientErrorException hcee) {
logger.error(hcee.getCause());
logger.error(hcee.getResponseBodyAsString());
apiResponse.setHttpStatusCode(String.valueOf(hcee.getRawStatusCode()));
apiResponse.setHttpResponse(hcee.getResponseBodyAsString());
apiResponse.setHttpResponseMessage(hcee.getMessage());
}
finally {
if(responseStream != null) {
responseStream.close();
}
}
return apiResponse;
}
提前致谢。
【问题讨论】:
标签: spring-boot postman