一、背景?
最近项目中有个三方接口,需要使用get请求传递json,
这个让人有点懵,一般来说get参数都会直接拼接在url后, 复杂的参数都使用post方式传递, 尝试过程中发现postman可以正常请求,使用hutool工具请求却失败了,网上找了一圈,才摸索出了解决方案
二、尝试的过程
1.postman(成功)
截图如下(示例):
2.hutool(失败)
代码如下(示例):
HttpRequest get = HttpUtil.createGet(url + "api/token");
Map<String, String> params = new HashMap<>();
params.put("AppId", appId);
params.put("AppKey", appKey);
get.body(JSONObject.toJSONString(params), "application/json");
get.execute();
上述代码会返回415(为什么明明是get,却提示415呢?),这里有意思的地方在于, 如果我去掉get.body() 这行代码, 他会正常返回没有参数的异常, 所以我推测是hutool在发现请求携带body时, 将get换成post方式了, 而且在fiddler中发现确实如此。
3.AsyncHttpClient(成功)
此处参考博客地址
废话不多说,代码如下
DefaultAsyncHttpClient asyncHttpClient = new DefaultAsyncHttpClient();
Map<String, String> params = new HashMap<>();
params.put("AppId", appId);
params.put("AppKey", appKey);
Request r = new RequestBuilder()
.setUrl(url + "api/token")
.setBody(JSONObject.toJSONString(params))
.addHeader("Content-Type", "application/json")
.build();
ListenableFuture<Response> future = asyncHttpClient.executeRequest(r);
Response response = future.get();
asyncHttpClient.close();
//工具版本
<dependency>
<groupId>org.asynchttpclient</groupId>
<artifactId>async-http-client</artifactId>
<version>2.12.3</version>
</dependency>