我设计了一个Web服务,在请求参数正常时执行任务,或者在请求参数错误或为空时返回401个未经授权的HTTP状态码。
我使用RestTem板
来执行测试,如果webservice成功回复,我可以验证HTTP 200 OK状态。然而,我无法测试HTTP 401错误,因为RestTem板
本身会抛出异常。
我的测试方法是
@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)
如何测试webservice是否使用HTTP状态代码401进行回复?
在rest服务中,我捕获HttpStatusCodeException
而不是Exception
,因为HttpStatusCodeException
有一个获取状态代码的方法
catch(HttpStatusCodeException e) {
log.debug("Status Code", e.getStatusCode());
}
作为nilesh提供的解决方案的替代方案,您还可以使用spring类DefaultResponseErrorHandler。您还需要验证它的hasError(HttpStatus)方法,这样它就不会对不成功的结果抛出异常。
restTemplate.setErrorHandler(new DefaultResponseErrorHandler(){
protected boolean hasError(HttpStatus statusCode) {
return false;
}});
您需要实现ResponseErrorHandler
,以便在使用rest模板从服务获取非2xx响应代码时拦截响应代码、正文和标题。复制所有需要的信息,将其附加到自定义异常并抛出,以便在测试中捕获它。
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;
}
}
现在你需要在测试中做的是,在RestTem板中设置这个响应错误处理程序,
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]"));
}
问题内容: 我试图按照此链接中的建议将错误返回到对控制器的调用,以便客户端可以采取适当的措施。javascript通过jqueryAJAX调用控制器。仅在不将状态设置为error的情况下,我才可以重新获得Json对象。这是示例代码 如果没有设置状态码,我会得到Json。如果设置状态代码,则会返回状态代码,但不会返回Json错误对象。 更新 我想将Error对象作为JSON发送,以便可以处理ajax
我的angular 2组件有以下模板,但它抛出了一个模板解析错误。 这是错误消息-我的
我开发了带有jar包装的小型spring boot应用程序。应用程序用例是,用户将登录到应用程序,它将显示欢迎页面。下面是我的代码。 主类 登录控制器类 登录。jsp welcome.jsp application.properties xml 现在,当我通过eclipse执行这个应用程序时,它工作得很好。我使用在目标文件夹中创建的maven工具构建了一个jar应用程序。我已经使用命令行从目标文件
本文向大家介绍动态webservice调用接口并读取解析返回结果,包括了动态webservice调用接口并读取解析返回结果的使用技巧和注意事项,需要的朋友参考一下 这里给大家带来的是动态webservice调用接口并读取解析返回结果的具体示例,非常的简单,注释也很详细,小伙伴们可以参考下。 以上所述就是本文的全部内容了,希望大家能够喜欢。
我在路径“/test”中有一个无用的endpoint: 我这样测试: 但我得到一个断言错误: 预期状态代码 这发生在更多的代码中:400,500...除了200。 我用的是Spring靴。如果在运行测试时在endpoint方法中放置断点,则执行将停止,因此测试中的请求将正确完成。如果我将状态代码(在资源和测试中也是)更改为200,则测试通过。 到底发生了什么?
问题内容: 我正在使用jQuery AJAX对Web服务进行查询。我的查询如下所示: 执行此操作时,我收到状态错误403。我不明白为什么我的通话导致状态代码为403。我控制着服务的安全性,并将其标记为完全开放。我知道密钥是有效的,因为我在另一个可以使用的电话中使用了它。这是有效的呼叫: 我知道这是两个不同的端点。但是我100%确信这不是服务器端身份验证或权限错误。再一次,一切在服务器端都是开放的。