Spring boot SpringBootRestTemplate:直接从postman复制时请求错误

Spring boot SpringBootRestTemplate:直接从postman复制时请求错误,spring-boot,resttemplate,Spring Boot,Resttemplate,所以我有一个API请求,我直接从它工作的邮递员那里复制细节。然而,我得到了一个错误的请求 @Service public class GraphApiService { @Bean public RestTemplate restTemplate() { return new RestTemplate(); } @Autowired RestTemplate restTemplate; @Autowired Constants constants; private final Log

所以我有一个API请求,我直接从它工作的邮递员那里复制细节。然而,我得到了一个错误的请求

@Service
public class GraphApiService {

@Bean
public RestTemplate restTemplate() {

    return new RestTemplate();
}
@Autowired
RestTemplate restTemplate;
@Autowired
Constants constants;
private final Logger logger = LoggerFactory.getLogger(this.getClass());
public ResponseEntity<String> getAccessTokenUsingRefreshToken(Credential cred) throws IOException{
    try {

    //https://docs.microsoft.com/en-us/graph/auth-v2-user
    // section 5. Use the refresh token to get a new access token
    String url = "url";
    JSONObject body = new JSONObject();
    body.put("grant_type", "refresh_token");
    body.put("client_id", "clientid");
    body.put("scope","User.Read offline_access Files.Read Mail.Read Sites.Read.All");
    body.put("redirect_uri", "http://localhost");
    body.put("client_secret","secret");
    body.put("refresh_token", "token");
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
    HttpEntity<String> request =  new HttpEntity<String>(body.toString(), headers);
   ResponseEntity<String> response=  restTemplate.postForEntity(url, request,String.class);
   return response;
    }
    catch(HttpClientErrorException  e){
        logger.error(e.getResponseBodyAsString());
        logger.error(e.getMessage());
        return null;
    }

}
@服务
公共类图形显示设备{
@豆子
公共RestTemplate RestTemplate(){
返回新的RestTemplate();
}
@自动连线
rest模板rest模板;
@自动连线
常数;
私有最终记录器Logger=LoggerFactory.getLogger(this.getClass());
公共响应属性getAccessTokenUsingRefreshToken(凭据凭据凭据)引发IOException{
试一试{
//https://docs.microsoft.com/en-us/graph/auth-v2-user
//第5节使用刷新令牌获取新的访问令牌
字符串url=“url”;
JSONObject body=新的JSONObject();
body.put(“授权类型”、“刷新令牌”);
body.put(“客户id”、“客户id”);
body.put(“scope”、“User.Read offline_access Files.Read Mail.Read Sites.Read.All”);
body.put(“重定向uri”)http://localhost");
body.put(“客户机密”、“机密”);
body.put(“刷新令牌”、“令牌”);
HttpHeaders=新的HttpHeaders();
headers.setContentType(MediaType.APPLICATION\u FORM\u URLENCODED);
HttpEntity请求=新的HttpEntity(body.toString(),headers);
ResponseEntity response=restTemplate.postForEntity(url、请求、String.class);
返回响应;
}
捕获(HttpClientErrorE异常){
logger.error(例如getResponseBodyAsString());
logger.error(例如getMessage());
返回null;
}
}

如果您能提供帮助,我将不胜感激。来自microsoft graph的错误请求错误消息不是一条描述性消息,它将帮助您发送带有
表单编码的
头的JSON负载。
您需要检查API是否接受json负载,如果接受,您需要将内容类型更改为
application/json
,或者您可以按如下方式发布表单数据

public ResponseEntity<String> getAccessTokenUsingRefreshToken(Credential cred) throws IOException{
    try {
        //https://docs.microsoft.com/en-us/graph/auth-v2-user
        // section 5. Use the refresh token to get a new access token
        String url = "url";
        MultiValueMap<String, String> multiValueMap= new LinkedMultiValueMap<String, String>();
        multiValueMap.add("grant_type", "refresh_token");
        multiValueMap.add("client_id", "clientid");
        //.....
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
        HttpEntity<MultiValueMap<String, String>> request =  new HttpEntity<>(multiValueMap, headers);
        ResponseEntity<String> response=  restTemplate.postForEntity(url, request, String.class);
        return response;
    }catch(HttpClientErrorException  e){
        logger.error(e.getResponseBodyAsString());
        logger.error(e.getMessage());
        return null;
    }

}
public ResponseEntity getAccessTokenUsingRefreshToken(凭据凭据凭据)引发IOException{
试一试{
//https://docs.microsoft.com/en-us/graph/auth-v2-user
//第5节使用刷新令牌获取新的访问令牌
字符串url=“url”;
MultiValueMap MultiValueMap=新链接的MultiValueMap();
添加(“授权类型”、“刷新令牌”);
多值映射。添加(“客户端id”、“客户端id”);
//.....
HttpHeaders=新的HttpHeaders();
headers.setContentType(MediaType.APPLICATION\u FORM\u URLENCODED);
HttpEntity请求=新的HttpEntity(多值映射,标题);
ResponseEntity response=restTemplate.postForEntity(url、请求、String.class);
返回响应;
}捕获(HttpClientErrorE异常){
logger.error(例如getResponseBodyAsString());
logger.error(例如getMessage());
返回null;
}
}

我用多值映射完成了这项工作,它起了作用。非常感谢