Skip to main content
 首页 » 编程设计

rest之Spring RestTemplate调用Web服务时出现错误并分析状态代码

2024年09月07日56yxwkf

我设计了一个Web服务,以在请求参数确定时执行任务,或者在请求参数错误或为空时返回401未经授权的HTTP状态代码。

我正在使用RestTemplate进行测试,并且如果Web服务成功答复,则能够验证HTTP 200 OK状态。但是,我无法测试HTTP 401错误,因为RestTemplate本身会引发异常。

我的测试方法是

@Test 
public void testUnauthorized() 
{ 
    Map<String, Object> params = new HashMap<String, Object>(); 
    ResponseEntity response = restTemplate.postForEntity(url, params, Map.class); 
    Assert.assertEquals(HttpStatus.UNAUTHORIZED, response.getStatusCode()); 
    Assert.assertNotNull(response.getBody()); 
} 

异常日志为
org.springframework.web.client.HttpClientErrorException: 401 Unauthorized 
at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:88) 
at org.springframework.web.client.RestTemplate.handleResponseError(RestTemplate.java:533) 
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:489) 
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:447) 
at org.springframework.web.client.RestTemplate.postForEntity(RestTemplate.java:318) 

如何测试Web服务是否以HTTP状态码401答复?

请您参考如下方法:

您需要实现ResponseErrorHandler,以便在使用rest模板从服务获取非2xx响应代码时拦截响应代码,正文和 header 。复制所需的所有信息,将其附加到自定义异常中,然后将其抛出,以便您可以在测试中捕获它。

public class CustomResponseErrorHandler implements ResponseErrorHandler { 
 
    private ResponseErrorHandler errorHandler = new DefaultResponseErrorHandler(); 
 
    public boolean hasError(ClientHttpResponse response) throws IOException { 
        return errorHandler.hasError(response); 
    } 
 
    public void handleError(ClientHttpResponse response) throws IOException { 
        String theString = IOUtils.toString(response.getBody()); 
        CustomException exception = new CustomException(); 
        Map<String, Object> properties = new HashMap<String, Object>(); 
        properties.put("code", response.getStatusCode().toString()); 
        properties.put("body", theString); 
        properties.put("header", response.getHeaders()); 
        exception.setProperties(properties); 
        throw exception; 
    } 
} 

现在,您需要在测试中做的是,在RestTemplate中像下面这样设置ResponseErrorHandler,
RestTemplate restclient = new RestTemplate(); 
restclient.setErrorHandler(new CustomResponseErrorHandler()); 
try { 
    POJO pojo = restclient.getForObject(url, POJO.class);  
} catch (CustomException e) { 
    Assert.isTrue(e.getProperties().get("body") 
                    .equals("bad response")); 
    Assert.isTrue(e.getProperties().get("code").equals("400")); 
    Assert.isTrue(((HttpHeaders) e.getProperties().get("header")) 
                    .get("fancyheader").toString().equals("[nilesh]")); 
}