簡體   English   中英

使用 Spring RestTemplate 進行 POST 時收到 400 BAD 請求

[英]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 classwriteForm 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM