Spring RestTemplate +基本身份验证+带有请求正文的帖子:500内部服务器错误

时间:2018-07-09 18:00:03

标签: spring http-post basic-authentication resttemplate

我正在寻找使用带有基本身份验证的Spring(5.x)RestTemplate +将请求主体作为HTTP Post传递的Rest Client的可行方法。

注意:如果我使用邮递员/其他其他客户端而不是Java客户端/测试类命中请求,则该服务可以正常工作。

我收到500个内部服务器错误

org.springframework.web.client.HttpClientErrorException: 500 Internal Server Error
    at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:94)
    at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:79)
    at org.springframework.web.client.ResponseErrorHandler.handleError(ResponseErrorHandler.java:63)
    at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:777)
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:730)
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:704)
    at org.springframework.web.client.RestTemplate.postForObject(RestTemplate.java:459)
    at com.xxx.xxx.xxx.utils.Util.updateFlag(Util.java:125)
    at com.xxx.xxx.xxx.utils.UtilsImplTest.testUpdateFlag(UtilsImplTest.java:122)

我的测试班:

@Test
public void testUpdateFlag() {
    Request request = new Request();
    request.setUserId("aa");
    request.setFlag("Y");
    request.setValue("D");
    Response response = null;
    try {
        response = util.updateFlag(request);
    } catch (JsonProcessingException e) {
        e.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
    }
    assertNotNull(response);
}

我的实现实用程序类:我在头文件中设置基本授权。

@Autowired private RestTemplate restTemplate;

private HttpHeaders getHeaders(){
    HttpHeaders headers = new HttpHeaders();
    headers.add("Authorization", "Basic " + <base64_encrypted_password>);//500
//  headers.setContentType(MediaType.APPLICATION_JSON); //401
    return headers;
}

public Response updateFlag(Request request) throws JsonProcessingException, URISyntaxException {
    restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
    HttpEntity<Request> requestEntity = new HttpEntity<>(request, getHeaders());
    Response response = restTemplate.postForObject(url, requestEntity, Response.class);
    return response;
}

如果我在getHeaders()方法中注释掉基本授权行,那么它将抛出401 Unauthorized,这是很合逻辑的。

org.springframework.web.client.HttpClientErrorException: 401 Unauthorized
    at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:94)
    at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:79)
    at org.springframework.web.client.ResponseErrorHandler.handleError(ResponseErrorHandler.java:63)
    at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:777)
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:730)
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:704)
    at org.springframework.web.client.RestTemplate.postForObject(RestTemplate.java:459)
    at com.xxx.xxx.xxx.utils.Util.updateFlag(Util.java:125)
    at com.xxx.xxx.xxx.utils.UtilsImplTest.testUpdateFlag(UtilsImplTest.java:122)

我已经尝试过类似内容中关于stackoverflow的几乎所有建议选项,无法确定导致在标头中设置授权无法验证并引发500 Internal Server Error的确切原因。

我花了很多时间进行调查,但没有运气。感谢任何指针。

0 个答案:

没有答案