Spring RestTemplate POST请求urlformencoded提供400(错误请求)

Spring RestTemplate POST请求urlformencoded提供400(错误请求),spring,spring-boot,resttemplate,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

我有以下要求:

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);
String url=“oauth_令牌的url”;
HttpHeaders=新的HttpHeaders();
headers.setContentType(MediaType.APPLICATION\u FORM\u URLENCODED);
RestTemplate RestTemplate=新RestTemplate();
String body=“授权类型=授权代码&客户号=123&客户号=123&”
+"重定向"uri=https://axyz.com&code=123";
HttpEntity实体=新的HttpEntity(主体、标题);
Object token=restTemplate.exchange(url,HttpMethod.POST,entity,Object.class);

这似乎返回400(错误请求)。我也尝试过它的替代方法,其中body是一个
多值映射
,但这对我来说最有意义。我尝试请求的方式有问题吗?

POST字段的值应该是URL编码的(在连接
正文
字符串时,可以对每个值使用
urlcoder.encode(值,“UTF-8”)
)。这就是为什么你会得到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);
List formparams=new ArrayList();
formparams.add(新的BasicNameValuePair(“param1”、“value1”);
添加(新的BasicNameValuePair(“重定向uri”)https://axyz.com"));
...
UrlEncodedFormEntity实体=新的UrlEncodedFormEntity(formparams,Consts.UTF_8);

我尝试了
urlcoder.encode
方法,但似乎不起作用。对于更好的解决方案,有没有一种spring方法可以实现同样的效果?我展示了另一种创建HttpEntity的方法(UrlEncodedFormEntity扩展了HttpEntity),这样您就可以像以前一样自由地将其传递给restTemplate.exchange方法。@NewUser您真正的url不是oauth_令牌的
url,对吗?这是什么?当然不是,这是一个正确的url,它指向我们使用的第三方应用之一