Java 对Spring RestTemplate转换的Curl令牌请求

Java 对Spring RestTemplate转换的Curl令牌请求,java,spring,curl,resttemplate,Java,Spring,Curl,Resttemplate,我正在尝试将一个curl请求转换为Spring的Resttemplate post请求,这会给我一个令牌,但我得到403-错误的请求 我的卷发请求 curl -d "grant_type=client_credentials&client_id=nu5yzeth9tektzf5egxuntp7&client_secret=uP2Xvr6SCKYgXgxxJsv2QkUG" -H "Content-Type: application/x-www-form-urlencoded

我正在尝试将一个curl请求转换为Spring的Resttemplate post请求,这会给我一个令牌,但我得到403-错误的请求

我的卷发请求

curl -d "grant_type=client_credentials&client_id=nu5yzeth9tektzf5egxuntp7&client_secret=uP2Xvr6SCKYgXgxxJsv2QkUG" 
  -H "Content-Type: application/x-www-form-urlencoded" 
  -X POST https://cloudsso.example.com/as/token.oauth2
卷曲反应:

{"access_token":"HVURQ845OPJqs8UpOlef5m2ZCNwR","token_type":"Bearer","expires_in":3599}
现在,这里是我的Java代码来实现上述curl post请求

RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));

MultiValueMap<String, String> bodyParamMap = new LinkedMultiValueMap<String, String>();
bodyParamMap.add("grant_type", "client_credentials");
bodyParamMap.add("client_id", "nu5yzeth9tektzf5egxuntp7");
bodyParamMap.add("client_secret", "uP2Xvr6SCKYgXgxxJsv2QkUG");

entity = new HttpEntity<>(reqBodyData, bodyParamMap);

restTemplate.postForEntity(url, entity, TokenDTO.class)
如何使上述curl请求在
restemplate
中工作

注意:这个问题几乎没有修改。

正如post所建议的那样

您应该将header中的请求内容类型设置为; headers.setContentType(MediaType.APPLICATION\u FORM\u URLENCODED)

希望这有帮助

如《邮报》所建议

您应该将header中的请求内容类型设置为; headers.setContentType(MediaType.APPLICATION\u FORM\u URLENCODED)


希望这有帮助

我刚刚解决了这个问题:

我有这个

// wrong
//private HttpEntity<String> entity;
注意:在我的情况下,添加或禁用这个值并没有任何区别,我还是得到了auth令牌

//headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);

我刚刚解决了这个问题:

我有这个

// wrong
//private HttpEntity<String> entity;
注意:在我的情况下,添加或禁用这个值并没有任何区别,我还是得到了auth令牌

//headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);

如果您查看文档,您会发现您使用了错误的构造函数

entity = new HttpEntity<>(reqBodyData, bodyParamMap);
作为
HttpHeaders
impements
MultiValueMap
,您可以在构造函数中直接使用它们。您还希望按原样传递
bodyParamMap

注意:我还建议在
HttpHeaders
上明确设置
内容类型
,以便您确定发送的内容

headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
因此,总的结果代码应该如下所示

RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);

MultiValueMap<String, String> bodyParamMap = new LinkedMultiValueMap<>();
bodyParamMap.add("grant_type", "client_credentials");
bodyParamMap.add("client_id", "nu5yzeth9tektzf5egxuntp7");
bodyParamMap.add("client_secret", "uP2Xvr6SCKYgXgxxJsv2QkUG");

entity = new HttpEntity<>(bodyParamMap, headers);

restTemplate.postForEntity(url, entity, TokenDTO.class)
RestTemplate RestTemplate=new RestTemplate();
HttpHeaders=新的HttpHeaders();
setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
headers.setContentType(MediaType.APPLICATION\u FORM\u URLENCODED);
MultiValueMap bodyParamMap=新链接的MultiValueMap();
添加(“授权类型”、“客户端凭据”);
bodyParamMap.add(“客户id”,“nu5yzeth9tektzf5egxuntp7”);
bodyParamMap.add(“客户机密”、“uP2Xvr6SCKYgXgxxJsv2QkUG”);
实体=新的HttpEntity(bodyParamMap,标题);
postForEntity(url、实体、TokenDTO.class)

注意:您不应该构建一个单一用途的
restemplate
,而是希望配置一次并将其注入到类中

如果您查看文档,您会发现您使用了错误的构造函数

entity = new HttpEntity<>(reqBodyData, bodyParamMap);
作为
HttpHeaders
impements
MultiValueMap
,您可以在构造函数中直接使用它们。您还希望按原样传递
bodyParamMap

注意:我还建议在
HttpHeaders
上明确设置
内容类型
,以便您确定发送的内容

headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
因此,总的结果代码应该如下所示

RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);

MultiValueMap<String, String> bodyParamMap = new LinkedMultiValueMap<>();
bodyParamMap.add("grant_type", "client_credentials");
bodyParamMap.add("client_id", "nu5yzeth9tektzf5egxuntp7");
bodyParamMap.add("client_secret", "uP2Xvr6SCKYgXgxxJsv2QkUG");

entity = new HttpEntity<>(bodyParamMap, headers);

restTemplate.postForEntity(url, entity, TokenDTO.class)
RestTemplate RestTemplate=new RestTemplate();
HttpHeaders=新的HttpHeaders();
setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
headers.setContentType(MediaType.APPLICATION\u FORM\u URLENCODED);
MultiValueMap bodyParamMap=新链接的MultiValueMap();
添加(“授权类型”、“客户端凭据”);
bodyParamMap.add(“客户id”,“nu5yzeth9tektzf5egxuntp7”);
bodyParamMap.add(“客户机密”、“uP2Xvr6SCKYgXgxxJsv2QkUG”);
实体=新的HttpEntity(bodyParamMap,标题);
postForEntity(url、实体、TokenDTO.class)

注意:您不应该构建一个单一用途的
restemplate
,而是希望配置一次并将其注入到类中

这回答了你的问题吗?我的建议是根本不要这样做,而是使用已经了解这一点的OAuth2客户机。有几个可用的,包括一个与RestTemplate集成的Spring。您需要在
HttpHeaders
上正确设置内容类型,并且您的
HttpEntity
构造错误(您没有传递头)。@[chrylis onstrike]-我正在尝试oauth2客户端,但找不到工作的参考代码,所以我尝试了这个,如果你有任何参考资料,请与我分享。这是否回答了你的问题?我的建议是根本不要这样做,而是使用已经了解这一点的OAuth2客户机。有几个可用的,包括一个与RestTemplate集成的Spring。您需要在
HttpHeaders
上正确设置内容类型,并且您的
HttpEntity
构造错误(您没有传递头)。@[chrylis onstrike]-我正在尝试oauth2客户端,但找不到工作的参考代码,因此,我尝试了这个方法,如果您有任何参考资料,请与我共享。问题是您将正文作为标题发送到哪里,并且不确定
reqBodyData
是什么。但是由于这个原因,选择了错误的消息编码器。尽管如此,显式地将内容类型设置为“确定”(您使用curl或多或少地也这样做了
-d
),但问题是您将正文作为标题发送到了哪里,而不确定
reqBodyData
是什么。但是由于这个原因,选择了错误的消息编码器。尽管如此,明确地设置内容类型肯定会让你做得更好(你也或多或少地使用curl设置了
-d
)。谢谢@M.Deinum,我不知道一些事情,请与我分享。虽然,在你回答之前,我已经解决了我的问题,但是你的问题更详细,有一些要点,这对其他人真的很有帮助。谢谢@M.Deinum,我不知道一些事情,请与我分享。虽然,我解决了我的问题,在你回答之前,但你的一个是比较详细的,有一些观点,这真的可以帮助别人。
RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);

MultiValueMap<String, String> bodyParamMap = new LinkedMultiValueMap<>();
bodyParamMap.add("grant_type", "client_credentials");
bodyParamMap.add("client_id", "nu5yzeth9tektzf5egxuntp7");
bodyParamMap.add("client_secret", "uP2Xvr6SCKYgXgxxJsv2QkUG");

entity = new HttpEntity<>(bodyParamMap, headers);

restTemplate.postForEntity(url, entity, TokenDTO.class)