[英]Getting 400 BAD Request when using Spring RestTemplate to POST
有人可以幫我弄清楚下面的代碼有什么問題嗎?
我正在使用Spring 3.1.1 RestTemplate嘗試調用Box.com上的REST WS以從刷新令牌中獲取新的訪問令牌。
下面的代碼返回400 (BAD REQUEST)
。 我能夠使用FireFox POST 插件成功調用相同的方法。 我已經比較了FormHttpMessageConverter class
上writeForm method
輸出,它與我從 FireFox 發送的結果完全一樣。
有沒有人有任何想法?
public static void main(String[] args) throws InterruptedException {
try {
String apiUrl = "https://www.box.com/api/oauth2/token";
String clientSecret = "[MY SECRET]";
String clientId = "[MY ID]";
String currentRefreshToken = "[MY CURRENT VALID REFRESHTOKEN]";
RestTemplate restTemplate = new RestTemplate();
List<HttpMessageConverter<?>> messageConverters = new ArrayList<HttpMessageConverter<?>>();
messageConverters.add(new FormHttpMessageConverter());
restTemplate.setMessageConverters(messageConverters);
MultiValueMap<String, String> body = new LinkedMultiValueMap<String, String>();
body.add("grant_type", "refresh_token");
body.add("refresh_token", currentRefreshToken);
body.add("client_id", clientId);
body.add("client_secret", clientSecret);
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
headers.add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8,application/json");
headers.add("Accept-Encoding", "gzip, deflate");
HttpEntity<?> entity = new HttpEntity<Object>(body, headers);
restTemplate.exchange(apiUrl, HttpMethod.POST, entity, String.class);
} catch (Exception ex) {
System.out.println("ex = " + ex.getMessage());
}
}
}
RestTemplate
的無參數構造RestTemplate
使用java.net
API 發出請求,不支持 gzip 編碼。 但是,有一個接受ClientHttpRequestFactory
的構造ClientHttpRequestFactory
。 您可以使用HttpComponentsClientHttpRequestFactory
實現,它使用 Apache HttpComponents HttpClient API 發出請求。 這確實支持 gzip 編碼。 因此,在創建RestTemplate
時,您可以執行以下操作(來自Spring Docs ):
HttpClient httpClient = HttpClientBuilder.create().build();
ClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClient);
RestTemplate restTemplate = new RestTemplate(requestFactory);
在 Spring Boot 中,在pom.xml
添加這樣的東西似乎增加了一些魔力。
<dependency>
<groupId>com.squareup.retrofit2</groupId>
<artifactId>retrofit</artifactId>
<version>2.3.0</version>
</dependency>
我假設還有其他類似的解決方案......
仔細檢查 HttpHeaders 正確!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.