【问题标题】:Spring Rest Template 400 Bad Request but Successful on PostManSpring Rest 模板 400 错误请求但在 PostMan 上成功
【发布时间】:2020-05-01 03:27:47
【问题描述】:

基本上,我使用 RestTemplate 进行了一个 post call 以获取访问令牌并获得“400 Bad Request”。

通过 Postman 进行的相同调用可以使用完全相同的参数成功。

    private String getTokenString(@NonNull String code)
    {
    String tokenUrl = AZURE_BASE_URL + tenantId + "/oauth2/token";

    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_JSON);
    headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
    headers.set("Authorization", "Bearer "+code);

    JSONObject request = new JSONObject();
    request.put("grant_type", "authorization_code");
    request.put("client_id", clientId);
    request.put("code", code);
    request.put("client_secret", password);
    request.put("redirect_uri", redirectUrl);

    HttpEntity<String> entity = new HttpEntity<>(request.toString(), headers);
    RestTemplate restTemplate = new RestTemplate();

    try {
        ResponseEntity<String> response = restTemplate.exchange(tokenUrl, HttpMethod.POST, entity, String.class);
        return response.getBody();
    } catch (Exception e)
    {
        e.printStackTrace();
    }

    return null;
}`

在多次尝试修改后,我无法弄清楚这段代码有什么问题。 我的堆栈跟踪是这样的。

org.springframework.web.client.HttpClientErrorException$BadRequest: 400 Bad Request
at org.springframework.web.client.HttpClientErrorException.create(HttpClientErrorException.java:79)
at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:122)
at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:102)
at org.springframework.web.client.ResponseErrorHandler.handleError(ResponseErrorHandler.java:63)
at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:778)
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:736)
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:670)
at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:579)
at com.xupes.stockmanagement.azure.controller.AzureController.getTokenString(AzureController.java:68)
at com.xupes.stockmanagement.azure.controller.AzureController.userInfo(AzureController.java:45)
at com.xupes.stockmanagement.azure.controller.AzureController$$FastClassBySpringCGLIB$$c7397a7.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:684)
at com.xupes.stockmanagement.azure.controller.AzureController$$EnhancerBySpringCGLIB$$1e02dbbe.userInfo(<generated>)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:892)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:797)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1039)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:942)

【问题讨论】:

    标签: java rest spring-boot oauth-2.0 azure-active-directory


    【解决方案1】:

    请求正文不正确。试试下面的代码。

    private String getTokenString(@NonNull String code)
        {
            String tokenUrl = AZURE_BASE_URL + tenantId + "/oauth2/token";
    
            HttpHeaders headers = new HttpHeaders();
            headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
            headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
            //headers.set("Authorization", "Bearer "+code);
    
            MultiValueMap<String, String> requestBody = new LinkedMultiValueMap<>();
            requestBody.add("grant_type","authorization_code");
            requestBody.add("client_id",clientId);
            requestBody.add("code",code);
            requestBody.add("client_secret",password);
            requestBody.add("redirect_uri",redirectUrl);
    
            HttpEntity<MultiValueMap> entity = new HttpEntity<MultiValueMap>(requestBody, headers);
            RestTemplate restTemplate = new RestTemplate();
    
            try {
                ResponseEntity<String> response = restTemplate.exchange(tokenUrl, HttpMethod.POST, entity, String.class);
                System.out.println(response.getBody());
                return response.getBody();
            } catch (Exception e)
            {
                e.printStackTrace();
            }
    
            return null;
        }
    

    回应

    【讨论】:

    • 谢谢,我终于用 MultivalueMap 解决了这个问题。
    • @all 在正文中使用以下值 MultiValueMap requestBody = new LinkedMultiValueMap(); requestBody.add("grant_type","client_credentials"); requestBody.add("client_id",IDP_CLIENT_ID); //requestBody.add("code",code); requestBody.add("client_secret",IDP_CLIENT_Screeet); //requestBody.add("redirect_uri",redirectUrl);
    猜你喜欢
    • 2017-08-19
    • 1970-01-01
    • 1970-01-01
    • 2016-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-23
    相关资源
    最近更新 更多