【发布时间】:2019-02-12 23:16:17
【问题描述】:
我正在使用 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 客户端是如何解决这个问题的?
【问题讨论】:
-
您似乎没有将所有需要的凭据/标头/令牌传递给 acumastica。尝试检查您的 java 调用与有效的调用
-
你是对的.. 我所要做的就是用所有的 cookie 创建我的请求标头
标签: spring acumatica resttemplate