Spring RestTemplate getForObject()给出了401个未经授权的异常

时间:2013-11-03 11:59:15

标签: java spring rest prestashop resttemplate

在我的浏览器中,下面的其他API网址正常工作,我可以看到XML结果。

"http://V7846EKZZJ1OJAW486D66IS7GO24XKUZ@localhost:8090/prestashop/api/products/1"

我想从Java客户端调用此url并获得结果。为此,我使用的是RestTemplate。

String result = restTemplate.getForObject("http://V7846EKZZJ1OJAW486D66IS7GO24XKUZ@localhost:8090/prestashop/api/products/1"
    , String.class);

这会产生以下错误,

WARNING: GET request for       http://V7846EKZZJ1OJAW486D66IS7GO24XKUZ@localhost:8090/prestashop/api/products/1 resulted in 401 (Unauthorized); invoking error handler
Disconnected from the target VM, address: '127.0.0.1:49533', transport: 'socket'

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:537)

不确定为什么会这样。 我们不能使用RestTemplate在表单username @ host / appplication中调用URL吗? 或者我使用RestTemplate调用此URL的方式是不正确的?

的问候, -Lasith。

2 个答案:

答案 0 :(得分:3)

我遇到了类似的问题,并使用 resttemplate.exchange 方法解决了这个问题。这些步骤将您的身份验证详细信息放在RestRequestHeaderInfo(应该在HttpEntity<MultiValueMap<String, String>>内)将此实体传递到交换方法中,如下所示:

response = restTemplate.exchange(url, HttpMethod.GET, request, Response.class);

如果响应是json格式,就像我的情况一样,Response是相应数据的持有者类,它将由我的类路径中的Jackson库填充:它有效。

答案 1 :(得分:0)

您还可以使用 restTemplete 拦截器来添加令牌标头。这比交换方法更好,因为您不必每次都添加令牌。 Lambda 表达式如下

RestTemplate restTemplate = new RestTemplateBuilder().interceptors((HttpRequest request, byte[] body, ClientHttpRequestExecution execution) -> {
  request.getHeaders().set(AUTHORIZATION, token);
  return execution.execute(request, body);}).build()