4

有人可以帮我弄清楚下面的代码有什么问题吗?

我正在使用Spring 3.1.1 RestTemplate尝试在 Box.com 上调用 REST WS以从刷新令牌中获取新的访问令牌。

下面的代码返回一个400 (BAD REQUEST). 我能够使用FireFox POST 插件成功调用相同的方法。我已经比较了on the 的输出,它与我从 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

无参数构造函数RestTemplate使用java.netAPI 发出请求,不支持 gzip 编码。但是,有一个构造函数接受ClientHttpRequestFactory. 您可以使用HttpComponentsClientHttpRequestFactory实现,它使用 Apache 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 回答
0

在 Spring Boot 中,添加这样的东西pom.xml似乎增加了一些魔力。

<dependency>
    <groupId>com.squareup.retrofit2</groupId>
    <artifactId>retrofit</artifactId>
    <version>2.3.0</version>
</dependency>

我假设还有其他类似的解决方案......

于 2018-04-03T19:58:26.653 回答
0

仔细检查 HttpHeaders 正确!

于 2020-05-29T17:15:28.037 回答