4

誰かが以下のコードの何が問題なのかを理解するのを手伝ってもらえますか?

Spring 3.1.1 RestTemplateを使用して Box.com で REST WSを呼び出し、リフレッシュ トークンから新しいアクセス トークンを取得しようとしています。

以下のコードは400 (BAD REQUEST). FireFox POST プラグインを使用して、同じメソッドを正常に呼び出すことができます。からの出力を比較しましたが、FireFox から送信したものとまったく同じです。writeForm methodFormHttpMessageConverter class

誰にもアイデアはありますか?

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());
    }
  }
}
4

3 に答える 3

3

の引数なしコンストラクターは、 gzip エンコーディングをサポートしない API をRestTemplate使用して要求を行います。java.netただし、 を受け入れるコンストラクターがありますClientHttpRequestFactoryHttpComponentsClientHttpRequestFactoryApache HttpComponents HttpClient API を使用してリクエストを行う実装を使用できます。これgzip エンコーディングをサポートします。したがって、作成時に次のようなことができます ( Spring DocsRestTemplateから) 。

HttpClient httpClient = HttpClientBuilder.create().build();
ClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClient);
RestTemplate restTemplate = new RestTemplate(requestFactory);
于 2015-02-25T19:12:16.933 に答える