在我的浏览器中,下面的其他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。
答案 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()