在将 API 调用从旧 Web 应用程序从我们之前的 API 管理迁移到 Apigee(GCP API 管理工具)时,我遇到了一个奇怪的问题。我什至不确定我尝试调用 Apigee 的事实本身就是一个问题,但为了完整起见我仍然提及它。
这是 RestTemplate 的配置方式
@Bean
public RestTemplatemyRestTemplate(
RestTemplateBuilder restTemplateBuilder,
@Value("${application.my.url}") String myUrl,
Supplier<ClientHttpRequestFactory> bufferingClientHttpRequestFactorySupplier,
OAuth2TokenService oAuth2TokenService
) {
return restTemplateBuilder
.rootUri(myUrl)
.requestFactory(bufferingClientHttpRequestFactorySupplier)
.interceptors(new AuthorizationHeaderInterceptor(oAuth2TokenService)) // Oauth2 mechanism that is working well
.build();
}
现在这是 API 调用完成的地方
public void createOrUpdateCustomerSource(Customer myCustomer, final HttpHeaders headers) throws TechnicalException {
final HttpEntity<Customer> httpEntity = new HttpEntity<>(myCustomer, headers);
final String myId = "dummyId";
final String uri = UriComponentsBuilder
.newInstance()
.pathSegment("some-path", myId))
.build().toString();
try {
log.info("Sending PUT request for customer Id: {} at {}", myId, uri);
myRestTemplate.exchange(uri, HttpMethod.PUT, httpEntity, Void.class);
} catch (RestClientException e) {
// exception handling
}
}
我想说这是非常基本的,但由于某种原因我从其余模板中得到了这个输出:
org.springframework.web.client.HttpClientErrorException$NotFound:404未找到:[无正文]
除了检索授权令牌的调用之外,没有任何内容到达 Apigee。显然,我尝试复制粘贴 Postman 上 RestTemplate 使用的完全相同的 URL,效果很好,因为我可以使用 Apigee 进行监控。
我需要添加的最后一件事是,如果我像这样调用我的 API(没有任何主体或标头): myRestTemplate.exchange(uri, HttpMethod.PUT, null, Void.class); 它确实到达了 Apigee,这让我认为我执行 PUT 的方式是错误的,而且我不知道为什么。