使用Spring RestTemplate进行POST时获得400 BAD请求

时间:2013-06-18 19:19:14

标签: java spring http rest box-api

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

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

以下代码返回400 (BAD REQUEST)。我能够使用 FireFox POST插件 成功调用相同的方法。我已经对writeForm method上的FormHttpMessageConverter class的输出进行了比较,就像我从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());
    }
  }
}

3 个答案:

答案 0 :(得分:3)

RestTemplate的no-arg构造函数使用java.net API发出请求,但不支持gzip编码。但是,有一个接受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);

答案 1 :(得分:0)

在Spring Boot中,将这样的内容添加到pom.xml似乎会增加一些魔力。

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

我认为还有其他类似的解决方案......

答案 2 :(得分:0)

仔细检查HttpHeaders !!