【问题标题】:How do I read HTTP status code from RestTemplate?如何从 RestTemplate 读取 HTTP 状态代码?
【发布时间】:2017-03-28 11:09:20
【问题描述】:

我使用 RestTemplate 调用 Rest API。响应没有任何问题。我需要像这样获取 HTTP 状态码。

请求正常 - 200

未经授权 - 400

根据许多帖子,我遇到了下面的答案。

RestTemplate template = new RestTemplate();
HttpEntity<String> response = template.exchange(url, HttpMethod.POST, request, String.class);

String resultString = response.getBody();
HttpHeaders headers = response.getHeaders();

这里使用了交换方法来获取响应。(template.exchange....) 但是我用过

postForObject 方法

这是我的代码

public BalanceCheckResponse accountTotal(String counterAlias, String counterAuth, String subscriberType,
        String subscriberValue, String accessMode, String token) {
    
    BalanceCheckResponse objResponse = new BalanceCheckResponse();

    try {
        
        BalanceCheckRequest objRequest = new BalanceCheckRequest();
        objRequest.setCounterAlias(counterAlias);
        objRequest.setCounterAuth(counterAuth);
        objRequest.setSubscriberType(subscriberType);
        objRequest.setSubscriberValue(subscriberValue);
        objRequest.setAccessMode(accessMode);

        RestTemplate rstTemp = new RestTemplate();
        final String url = "https://ideabiz.lk/apicall/startpoint/v1/balanceCheck";
        List<HttpMessageConverter<?>> messageConverters = new ArrayList<HttpMessageConverter<?>>();
        MappingJackson2HttpMessageConverter map =new MappingJackson2HttpMessageConverter();
        messageConverters.add(map);
        //messageConverters.add(new StringHttpMessageConverter());
        rstTemp.setMessageConverters(messageConverters);

        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);
        headers.add("Authorization", "Bearer "+token);

        HttpEntity<BalanceCheckRequest> entity = new HttpEntity<BalanceCheckRequest>(objRequest,headers);
        objResponse = rstTemp.postForObject(url,entity, BalanceCheckResponse.class  );
        
        
    } catch (Exception e) {
        e.printStackTrace();
    }
    System.out.println(objResponse.getCurrentBalance());
    return objResponse;

}

在我的代码中

objResponse.getHeaders();

显示错误。我能在这里做什么。你有想法吗?

【问题讨论】:

  • 嗨,你在哪里打电话给objResponse.getHeaders();?看起来 objResponse 是一个 BalanceCheckRequest 对象?
  • 不是。 objResponseis 是一个 BalanceCheckResponse 对象。我在 objResponse = rstTemp.postForObject(url,entity, BalanceCheckResponse.class); 下调用它行。感谢您的评论 kkflf

标签: java spring


【解决方案1】:

默认情况下,RestTemplate 使用DefaultResponseErrorHandler,如果您没有收到被视为成功的响应之一,则会引发异常。这意味着如果发生错误,您的e.printStackTrace(); 语句将打印堆栈跟踪。 (这很可能会被忽视。)

如果这对您来说还不够好,那么有很多方法可以规避这种行为,其中之一是使用 setErrorHandler( ResponseErrorHandler errorHandler ) 提供您自己的错误处理程序。

【讨论】:

  • 谢谢 Mike Nakis。我已经使用了 e.printStackTrace();。但我需要用传出的方式来解决这个错误。
【解决方案2】:

postForObject 方法的返回值是从接收到的响应中反序列化到给定类的数据,在您的情况下为BalanceCheckResponse

如果您需要访问返回的数据和状态,请像这样使用postForEntity

ResponseEntity<BalanceCheckResponse> responseEntity = rstTemp.postForEntity(url, entity, BalanceCheckResponse.class);
objResponse = responseEntity.getBody();
HttpStatus status = responseEntity.getStatusCode();

【讨论】:

  • 只有调用成功时才这样
  • 谢谢 Bewusstsein。你节省了我的时间。我得到了答案。
  • 谢谢 RC。你的正确只有在通话成功时才是真的。你有个好主意吗。
猜你喜欢
  • 2014-06-05
  • 1970-01-01
  • 1970-01-01
  • 2011-12-02
  • 2023-03-28
  • 2011-10-05
  • 2010-11-06
  • 2010-11-21
相关资源
最近更新 更多