使用Spring @RestTemplate发送API密钥无效

时间:2016-11-18 00:35:41

标签: spring-boot spring-restcontroller

我正在使用Spring Boot开发REST API。我的应用程序依赖于第三方REST API来构建结果并将其发送回我的A​​PI的使用者。我在从REST API应用程序调用第三方API服务时遇到问题。由于我需要提供API密钥,因此我使用RestTemplate的{​​{1}}方法,如下所示:

exchange(...)

当我使用GET调用API方法并在Postman的@RequestMapping(value="/{userId}", method = RequestMethod.GET) public ResponseEntity<String> getUser(@PathVariable String userId, @RequestHeader String apikey) { String url = RESTAPIProperties.getUsersUrl() + "/users/{userId}"; // Set headers for the request Map<String,Object> headersMap = Collections.unmodifiableMap( Stream.of( new SimpleEntry<>("apikey", apikey), new SimpleEntry<>("Accept", "application/json") ) .collect(Collectors.toMap((e) -> e.getKey(), (e) -> e.getValue()))); HttpEntity<?> httpEntity = buildHttpEntity(headersMap); log.info("API Key: {}, Call sign: {}", apikey, userId); RestTemplate restTemplate = new RestTemplate(); return restTemplate.exchange(url, HttpMethod.GET, httpEntity, String.class, userId); } // Returns HttpEntity object with the specified headers set private HttpEntity<String> buildHttpEntity(Map<String,Object> headerParams) { HttpHeaders headers = new HttpHeaders(); headerParams.forEach((k,v)->headers.set(k, v.toString())); return new HttpEntity<String>(headers); } 标头中提供API密钥时,请求会在几秒钟后超时。在日志中,会打印API密钥和用户ID,因此我知道第3方服务的apikey调用。但是,如果我在Postman中使用相同的API密钥直接点击第三方服务,则会立即收到响应。我错过了什么?

1 个答案:

答案 0 :(得分:0)

结果证明这不是问题;这是一个缺少的代理服务器设置。一旦我弄明白了,我就将以下内容添加到Catalina脚本中,一切正常。

JAVA_OPTS="-Dhttps.proxySet=true \
-Dhttps.proxyHost=proxy.company.com \
-Dhttps.proxyPort=2345 $JAVA_OPTS"