码迷,mamicode.com
首页 > 其他好文 > 详细

我们仍未知道那天他们为什么要用GET方法传Body数据

时间:2020-01-08 19:03:50      阅读:176      评论:0      收藏:0      [点我收藏+]

标签:pos   body   有关   时间   through   引用   gre   资料   utf-8   

一、问题

在某个项目中,对接方提供了一个方法,但是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);

 

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里面。

我们仍未知道那天他们为什么要用GET方法传Body数据

标签:pos   body   有关   时间   through   引用   gre   资料   utf-8   

原文地址:https://www.cnblogs.com/sefuture/p/12167882.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!