gpt4 book ai didi

java - 带有参数的 Spring RestTemplate HTTP Post 导致 400 bad request 错误

转载 作者:IT老高 更新时间:2023-10-28 13:49:22 27 4
gpt4 key购买 nike

可能重复 Need help on RestTemplate Post Request with Body Parameters?Spring RESTtemplate POST但这些答案对我不起作用
我尝试通过 Spring Android 从 Instagram API 获取访问 token 。来自 Instagram 's document 的请求像这样:

curl \-F 'client_id=CLIENT-ID' \
-F 'client_secret=CLIENT-SECRET' \
-F 'grant_type=authorization_code' \
-F 'redirect_uri=YOUR-REDIRECT-URI' \
-F 'code=CODE' \https://api.instagram.com/oauth/access_token

这是我的请求访问 token (在我获得请求 token 成功后):

 MultiValueMap<String, String> mvm = new LinkedMultiValueMap<String, String>();
mvm.add("client_id", INSTAGRAM_CILENT_ID);
mvm.add("client_secret", INSTAGRAM_SECRET);
mvm.add("grant_type", "authorization_code");
mvm.add("redirect_uri", CALLBACKURL);
mvm.add("code", requestToken);

InstagramResult result = restTemplate .postForObject("https://api.instagram.com/oauth/access_token", mvm, InstagramResult .class);

结果映射类:

public class InstagramLogin {
public String access_token;
public InstagramUser user;
}

public class InstagramUser {
public String id;
public String username;
public String full_name;
public String profile_picture;
}

其余模板:

   RestTemplate restTemplate = new RestTemplate();
final List<HttpMessageConverter<?>> listHttpMessageConverters = new ArrayList< HttpMessageConverter<?> >();

listHttpMessageConverters.add(new GsonHttpMessageConverter());
listHttpMessageConverters.add(new FormHttpMessageConverter());
listHttpMessageConverters.add(new StringHttpMessageConverter());
restTemplate.setMessageConverters(listHttpMessageConverters);

但我总是收到 400 bad request 错误。这是我的堆栈跟踪:

04-03 09:32:45.366: W/RestTemplate(31709): POST request for "https://api.instagram.com/oauth/access_token" resulted in 400 (BAD REQUEST); invoking error handler
04-03 09:32:46.857: E//DefaultRequestRunner.java:138(31709): 09:32:46.862 Thread-32787 An exception occurred during request network execution :400 BAD REQUEST
04-03 09:32:46.857: E//DefaultRequestRunner.java:138(31709): org.springframework.web.client.HttpClientErrorException: 400 BAD REQUEST
04-03 09:32:46.857: E//DefaultRequestRunner.java:138(31709): at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:76)
04-03 09:32:46.857: E//DefaultRequestRunner.java:138(31709): at org.springframework.web.client.RestTemplate.handleResponseError(RestTemplate.java:524)
04-03 09:32:46.857: E//DefaultRequestRunner.java:138(31709): at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:481)
04-03 09:32:46.857: E//DefaultRequestRunner.java:138(31709): at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:439)
04-03 09:32:46.857: E//DefaultRequestRunner.java:138(31709): at org.springframework.web.client.RestTemplate.postForObject(RestTemplate.java:317)

P/s:我的参数值肯定是对的,因为我用 curl 测试过,效果很好。

最佳答案

如果请求的内容类型 Not Acceptable ,服务器通常会返回 HTTP 400。来自 instagram 的 curl 示例使用指定多部分发布数据的 -F 参数:

-F, --form CONTENT  Specify HTTP multipart POST data (H)

因此,您可能想尝试在 RestTemplate 请求中显式设置 Content-type HTTP header :

HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.setContentType(MediaType.MULTIPART_FORM_DATA);
HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<MultiValueMap<String, String>>(mvm, requestHeaders);
ResponseEntity<InstagramResult> response = restTemplate.exchange(url, HttpMethod.POST, requestEntity, InstagramResult.class);
InstagramResult result = response.getBody();

正如前面在评论中提到的,像 fiddler 这样的代理工具对于调试非常有用。这种情况的挑战在于您正在使用 SSL,因此如果没有特殊配置,这些工具将无法“看到”加密通信。

关于java - 带有参数的 Spring RestTemplate HTTP Post 导致 400 bad request 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22826887/

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