gpt4 book ai didi

java - Spring Rest 模板 400 错误请求但在 PostMan 上成功

转载 作者:行者123 更新时间:2023-12-02 01:08:25 29 4
gpt4 key购买 nike

基本上,我进行了一次 post 调用来获取访问 token ,并使用 RestTemplate 得到了“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)

最佳答案

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

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

关于java - Spring Rest 模板 400 错误请求但在 PostMan 上成功,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59733188/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com