【问题标题】:Postman/Insomnia returns 200 but Java client returns 404 on re-submissionPostman/Insomnia 返回 200 但 Java 客户端在重新提交时返回 404
【发布时间】: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


    【解决方案1】:

    这是我的错误,不知何故不同的线程正在动态地提醒 URL,这导致了问题。

    我调试并修复了它。

    感谢所有参与的人。

    【讨论】:

      猜你喜欢
      • 2019-12-16
      • 1970-01-01
      • 2018-03-02
      • 2017-10-30
      • 1970-01-01
      • 2018-01-14
      • 2012-08-14
      • 2015-04-26
      • 1970-01-01
      相关资源
      最近更新 更多