首页 > 解决方案 > 对 stockitem 进行 GET 调用的未经授权的 401 错误

问题描述

我正在使用 Java Spring Resttemplate 访问 Acumatica API。对登录端点的 POST 调用工作正常。但是下一个获取 StockItems 的调用会得到一个401 Unauthorized error.

org.springframework.web.client.HttpClientErrorException: 401 Unauthorized at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:91) at org.springframework.web.client.RestTemplate.handleResponseError(RestTemplate.java:615) at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:573) at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:544) at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:465) at 

现在,当我使用 Postman 和 Chrome Restlet 客户端时,这可以正常工作。我注意到在 Restlet 客户端中,对 API 的 GET 调用传递了由 API 在登录调用中设置的会话 cookie。我尝试在 GET 请求中传递来自登录调用的响应标头。但我仍然得到 401。我使用的是标准的 resttemplate 配置。

HttpEntity<Credentials> entity = new HttpEntity<Credentials>(credentials, headers);
ResponseEntity<String> response = restTemplate.exchange("https://xxxx.acumatica.com/entity/auth/login", 
HttpMethod.POST, entity, String.class);

HttpHeaders rHeaders = response.getHeaders();
String set_cookie = rHeaders.getFirst(rHeaders.SET_COOKIE);

if (LOG.isInfoEnabled()) { LOG.info("Response: " + response.toString()); }
if (LOG.isInfoEnabled()) { LOG.info("Set-Cookie: " + set_cookie); }


HttpEntity<String> entity2 = new HttpEntity<String>(response.getHeaders());
ResponseEntity<String> response2 = restTemplate.exchange("https://usell.acumatica.com/entity/Default/6.00.001/StockItem?$expand=Attributes,WarehouseDetails", HttpMethod.GET, entity2, String.class);

使用 Java 的 Acumatica API 客户端是如何解决这个问题的?

标签: springacumaticaresttemplate

解决方案


我没有设置所有的饼干..这就是我所要做的

List<String> cookies = response.getHeaders().get(HttpHeaders.SET_COOKIE);
HttpHeaders requestHeaders = new HttpHeaders();
for (String cookie : cookies) {
requestHeaders.add("Cookie", cookie);
}

推荐阅读