gpt4 book ai didi

java - JSON 中 RestTemplate 中的 GET 请求

转载 作者:可可西里 更新时间:2023-11-01 17:28:15 24 4
gpt4 key购买 nike

一个看似非常简单的问题已经困扰了几天:

我在 application/json 中使用 RestTemplate 发出一个简单的 GET 请求,但我一直在获取

org.springframework.web.client.HttpClientErrorException: 400 Bad Request
at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:91)
at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:636)
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:592)
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:552)
at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:470)

我做了研究并关注了这个tutorial ,我也查看了这个 POST request via RestTemplate in JSON 的解决方案.但他们都没有帮助,这是我的代码:

RestTemplate restTemplate = new RestTemplate();    
HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<?> requestEntity = new HttpEntity<Object>(requestHeaders);
restTemplate.exchange(endpoint, HttpMethod.GET, requestEntity, String.class);

endpointhttp://localhost:8080/api/v1/items?itemIds="+ URLEncoder.encode(itemIds, "UTF-8") 其中在 postman 中工作正常。itemIds 是一个以逗号分隔的列表,如下所示:

5400028914,5400029138,5400029138,5400029138,5400029138,5400028401,5400028918,5400028076,5400028726

我还尝试像下面这样使用 getForObject:

String result = restTemplate.getForObject(endpoint, String.class);

这给了我这个错误:

org.springframework.web.client.HttpClientErrorException: 415 Unsupported Media Type

我不确定我错过了什么或做错了什么,但相同的端点在 Postman 上运行完美,但唯一的区别是我在 Postman 应用程序中添加了 Content-Type header 。

这是我对 Postman 的请求:


GET/api/v1/items?itemIds=abc%2cdef%2cghi HTTP/1.1
主机:本地主机:8080
连接:保持 Activity 状态
postman token :84790e06-86aa-fa8a-1047-238d6c931a68
缓存控制:无缓存
用户代理:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36
内容类型:application/json
接受: */*
接受编码:gzip、deflate、sdch
接受语言:en-US,en;q=0.8,zh-CN;q=0.6,zh;q=0.4

那么,如果我上面的代码是错误的,我该如何使用 RestTemplate 正确设置内容类型呢?

又一次深潜,我已经开火了 Wireshark捕获两个 HTTP 请求,这里是屏幕截图:

Postman的请求:request from Postman

来 self 的 Java 代码的请求:request from Java program

我仍然不明白为什么我的 Java 程序会抛出 400,而 Postman 程序却可以正常工作。

非常感谢。

最佳答案

好吧,不管你信不信,我的一位同事最终帮助我弄清楚了原因,就这么简单:

endpoint是这样的: "http:localhost:8080/api/v1/items?itemIds=" + URLEncoder.encode(itemIds, "UTF-8");

不过应该​​是"http:localhost:8080/api/v1/items?itemIds=" + itemIds;

itemIds只是一个逗号分隔的列表。

通过“UTF-8”模式进行 URLEncoder 编码后,这个逗号分隔的列表变为 itemIds=5400028914%2C5400029138%2C5400029138%2C5400029138%2C5400029138%2C5400028401%2C5400028918%2C5400028076

来自

itemIds=5400028914,5400029138,5400029138,5400029138,5400029138,5400028401,5400028918,5400028076,5400028726

我们在使用 RestTemplate 时不需要 URLEncoder 对 URL 进行编码,请问有人可以帮助我加深理解吗?

谢谢!

关于java - JSON 中 RestTemplate 中的 GET 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42142801/

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