RestTemplate POST请求urlformencoded给出400(错误请求)

时间:2016-09-14 20:53:50

标签: spring spring-boot resttemplate

我有以下要求:

String url = "url to oauth_token";

        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);

        RestTemplate restTemplate = new RestTemplate();

        String body = "grant_type=authorization_code&client_id=123&client_secret=123&"
                + "redirect_uri=https://axyz.com&code=123";

        HttpEntity<Object> entity = new HttpEntity<>(body, headers);

        Object token = restTemplate.exchange(url, HttpMethod.POST, entity, Object.class);

这似乎返回400(错误请求)。我也尝试过其身体是MultiValueMap的替代方案,但这对我来说是最有意义的。我尝试请求的方式有问题吗?

1 个答案:

答案 0 :(得分:1)

POST字段的值应该是URL编码的(您可以在连接URLEncoder.encode(value, "UTF-8")字符串时)为每个值使用body。这就是你得到400错误的原因。

您最好使用更方便的方法来创建包含键和值的POST表单实体,这将自动对您的值进行URL编码:

List<NameValuePair> formparams = new ArrayList<NameValuePair>();
formparams.add(new BasicNameValuePair("param1", "value1"));
formparams.add(new BasicNameValuePair("redirect_uri", "https://axyz.com"));
...
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(formparams, Consts.UTF_8);