Spring Rest Template 400 неверный запрос, но успешный на PostMan - PullRequest
0 голосов
/ 14 января 2020

По сути, я сделал пост-звонок, чтобы получить токен доступа, и получил «400 неверных запросов» с помощью RestTemplate.

Тот же звонок, сделанный через 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)

1 Ответ

2 голосов
/ 15 января 2020

Тело запроса неверно. Попробуйте с кодом ниже.

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;
    }

Ответ

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...