【问题标题】:Spring RestTemplate getForObject() giving 401 unauthorized exceptionSpring RestTemplate getForObject() 给出 401 未经授权的异常
【发布时间】:2013-11-03 11:59:15
【问题描述】:

在我的浏览器中,rest API url 工作正常,我可以看到 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。

【问题讨论】:

  • 当您在浏览器中使用该 URL 时会发生什么?看起来它也需要密码,或者其他形式的身份验证?
  • 不,它不需要密码。使用浏览器,它会提供 XML 格式的产品信息。
  • 嗨,我解决了这个问题。 Spring 测试模板似乎无法识别 username@host/application。所以我们需要手动设置授权。 DefaultHttpClient httpClient = new DefaultHttpClient(); BasicCredentialsProvider credentialsProvider = new BasicCredentialsProvider(); credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(user, password)); httpClient.setCredentialsProvider(credentialsProvider);

标签: java spring rest prestashop resttemplate


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-10
      • 1970-01-01
      • 1970-01-01
      • 2017-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多