【问题标题】:RestTemplate POST request urlformencoded gives 400 (Bad Request)RestTemplate POST 请求 urlformencoded 给出 400(错误请求)
【发布时间】:2017-01-22 19:02:51
【问题描述】:

我有以下要求:

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(错误请求)。我也尝试过它的替代方案,其中 body 是 MultiValueMap 但这对我来说最有意义。我尝试请求的方式有问题吗?

【问题讨论】:

    标签: spring spring-boot resttemplate


    【解决方案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);
    

    【讨论】:

    • 我尝试了URLEncoder.encode 的方式,但似乎没有用。对于better 解决方案,是否有弹簧方式来实现相同的效果?
    • 我展示了另一种创建 HttpEntity 的方法(UrlEncodedFormEntity 扩展了 HttpEntity),因此您可以像以前一样将它传递给 restTemplate.exchange 方法。
    • @NewUser 你的真实网址不是url to oauth_token 对吗?这是什么?
    • 当然不是,它是一个正确的网址,可以转到我们使用的第 3 方应用之一
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-17
    • 1970-01-01
    • 2022-01-04
    • 2017-12-24
    • 1970-01-01
    • 2019-05-28
    • 1970-01-01
    相关资源
    最近更新 更多