我们仍未知道那天他们为什么要用GET方法传Body数据
一、问题
在某个项目中,对接方提供了一个方法,但是GET方式提交Body数据,之前确实听说过GET方法可以传body数据(像ES里面好像都是这种操作,但是其他系统还没怎么碰到过),但是并没有实操过,因此花了好多的时间去解决。
百度了很久,有一些较为有用的信息,在这边记录一下,以免下次再遇到。
项目就是最基础的Spring Boot框架,没什么特殊的。
二、处理
1、ApacheHttpClient
项目原本引用的是ApacheHttpClient,但研究了许久,更新到最新的4.5.10,并未发现HttpGet中有setEntity方法(一般postByJson方法将body塞到Entity里即可),感觉可能是并不支持get传递body数据,试了很久,最终放弃。
方法一:
后来经过大佬点拨,HttpGet继承了HttpRequestBase,
而HttpPost继承了HttpEntityEnclosingRequestBase,
HttpEntityEnclosingRequestBase继承了HttpRequestBase外又实现了HttpEntityEnclosingRequest了的方法(就是关键的与Entity有关的方法),
两者本质上都是继承了HttpRequestBase,因此考虑自己写一个HttpGet替代原生的HttpGet,经过试验确实有用。
类其实直接copy HttpGet即可,修改一下继承的类就行。
public class HttpDefineGet extends HttpEntityEnclosingRequestBase { public final static String METHOD_NAME = "GET"; public HttpDefineGet() { super(); } public HttpDefineGet(final URI uri) { super(); setURI(uri); } /** * @throws IllegalArgumentException if the uri is invalid. */ public HttpDefineGet(final String uri) { super(); setURI(URI.create(uri)); } @Override public String getMethod() { return METHOD_NAME; } }
使用时:
HttpRequestBase request = new HttpDefineGet(url); ((HttpDefineGet) request).setEntity((HttpEntity) param);
方法二:
后来经过另一个大佬点拨,提供了httpClient的另一个get传递body使用方法:
public static String getWithBody(String uri, String json) { try (CloseableHttpClient httpClient = HttpClients.createDefault()) { RequestBuilder requestBuilder = RequestBuilder.get(uri); requestBuilder.addHeader("Content-type", "application/json"); StringEntity jsonBody = new StringEntity(json, ContentType.APPLICATION_JSON); requestBuilder.setEntity(jsonBody); HttpUriRequest httpRequest = requestBuilder.build(); try (CloseableHttpResponse httpResponse = httpClient.execute(httpRequest)) { if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { return EntityUtils.toString(httpResponse.getEntity(), "UTF-8"); } else { return ""; } } } catch (IOException e) { // Do some log staff } return ""; }
2、AsyncHttpClient
找了一些资料,说是AsyncHttpClient有get传递body的方法,因此还是在项目里导入了AsyncHttpClient的依赖。
<dependency> <groupId>org.asynchttpclient</groupId> <artifactId>async-http-client</artifactId> <version>2.10.4</version> </dependency>
同步请求,因此也没有特别的处理。
// 构建client AsyncHttpClient client = new DefaultAsyncHttpClient(); // 由于请求传参是json String jsonBody = "{\"page\":{\"page\":1,\"size\":10}}"; Future<Response> feature = client.prepareGet(url) .setBody(jsonBody) .setHeader("Content-Type","application/json;charset=UTF-8") .execute(); // 发起请求 Response response = feature.get(); // 获取返回值 String result = response.getResponseBody();
结果在responseBody里面。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具