RestTemplate实现发送带headers的GET请求
resttemplate 发送带headers的get请求
需求:发送自定义header的get请求,header中需要插入一个签名。
发送自定义header的post请求
之前写过一个类似的请求,但是是post的。这个也摸了一段时间,自己看参数整了出来。代码如下:
// header填充 linkedmultivaluemap<string, string> headers = new linkedmultivaluemap<>(); headers.put("content-type", collections.singletonlist("application/json;charset=utf-8")); headers.put("signature", collections.singletonlist(makesignature(form.getnewmobile()))); // body填充 jsonobject json = new jsonobject(); json.put("oldmobile", mobile); json.put("newmobile", form.getnewmobile()); httpentity<string> request = new httpentity<string>(json.tostring(), headers); // 一个单例的resttemplate resttemplate resttemplate = httpinvoker.getresttemplate(); // 发送请求 responseentity<string> response = resttemplate.postforentity(whitelisturl, request, string.class);
很简单的想着,只需要把上面的postforentity()改成get的就行,但不是这样的。
发送自定义header的get请求
update: 2019/12/11
从链接学到了一种比较友好的写法:
private static void getemployees(){ final string uri = "http://localhost:8080/springrestexample/employees"; resttemplate resttemplate = new resttemplate(); httpheaders headers = new httpheaders(); headers.setaccept(arrays.aslist(mediatype.application_json)); httpentity<string> entity = new httpentity<string>("parameters", headers); responseentity<string> result = resttemplate.exchange(uri, httpmethod.get, entity, string.class); system.out.println(result); }
粗略看了看postforentity()和getforentity()这两个方法的实现,都是准备参数,然后调用execute()方法,如下:
// post @override public <t> responseentity<t> postforentity(string url, @nullable object request, class<t> responsetype, object... urivariables) throws restclientexception { requestcallback requestcallback = httpentitycallback(request, responsetype); responseextractor<responseentity<t>> responseextractor = responseentityextractor(responsetype); return nonnull(execute(url, httpmethod.post, requestcallback, responseextractor, urivariables)); } // get @override @nullable public <t> t getforobject(string url, class<t> responsetype, map<string, ?> urivariables) throws restclientexception { requestcallback requestcallback = acceptheaderrequestcallback(responsetype); httpmessageconverterextractor<t> responseextractor = new httpmessageconverterextractor<>(responsetype, getmessageconverters(), logger); return execute(url, httpmethod.get, requestcallback, responseextractor, urivariables); }
区别就在于requestcallback实例化的时候,传的参数不一样。post的时候,是将header做为参数传给了requestcallback。再然后就是execute()中的get和post参数不一样。到这个时候,发送自定义header的get请求,已经很明显了。
实例化的函数,都是public的。
如果不是public的,或者说我们不能直接访问到,还可以考虑通过反射的方式去调用相关的方法,但这里不需要用反射了。
结果
// header填充 linkedmultivaluemap<string, string> headers = new linkedmultivaluemap<>(); headers.put("content-type", collections.singletonlist("application/json;charset=utf-8")); headers.put("signature", collections.singletonlist(makesignature(mobile))); // 获取单例resttemplate resttemplate resttemplate = httpinvoker.getresttemplate(); httpentity request = new httpentity(headers); // 构造execute()执行所需要的参数。 requestcallback requestcallback = resttemplate.httpentitycallback(request, jsonobject.class); responseextractor<responseentity<jsonobject>> responseextractor = resttemplate.responseentityextractor(jsonobject.class); // 执行execute(),发送请求 responseentity<jsonobject> response = resttemplate.execute(apiaddress + "/xxx/whitelist/check?phone=" + mobile, httpmethod.get, requestcallback, responseextractor);
虽然很简单,但是看似不可能,自己却做到了、完成了,就很有成就感。
resttemplate优雅的发送get请求
在我们的项目中,如果借助resttemplate发送带参数的get请求,我们可以通过拼接字符串的方式将url拼接出来,比如下面这种方式:
string url = "http://127.0.0.1:8080/rest/get?name="+ name +"&id=" + id; responseentity<restvo> forentity = resttemplate.getforentity(url, restvo.class);
然而这种方式不太优雅,我们还可以通过以下几种方式发送get请求
方式1:使用占位符
string url = "http://127.0.0.1:8080/rest/path/{name}/{id}"; map<string, object> params = new hashmap<>(); params.put("name", "这是name"); params.put("id", 1l); responseentity<restvo> forentity = resttemplate.getforentity(url, restvo.class, params);
map的key要和url中的占位符一致
方式2:使用linkedmultivaluemap和uricomponentsbuilder
string url = "http://127.0.0.1:8080/rest/get"; multivaluemap<string, string> params = new linkedmultivaluemap<>(); params.add("name", "这是name"); params.add("id", "1"); uricomponentsbuilder builder = uricomponentsbuilder.fromhttpurl(url); uri uri = builder.queryparams(params).build().encode().touri(); responseentity<restvo> forentity = resttemplate.getforentity(uri, restvo.class); return forentity.getbody();
方式2看起来是最优雅的,将参数的设置和url分离。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。
上一篇: 淘宝喵糖会过期清空吗 淘宝喵糖会消失吗
下一篇: Python词法结构
推荐阅读
-
PHP实现的带超时功能get_headers函数
-
RestTemplate发送带请求头的Json的Post请求Utils工具类
-
RestTemplate的请求参数传递问题 RestTemplate发送Get请求通过body传参问题
-
RestTemplate实现发送带headers的GET请求
-
用VBS实现的发送带Cookie的HTTP请求的代码
-
python使用urllib2实现发送带cookie的请求
-
python 实现Requests发送带cookies的请求
-
使用spring 中的RestTemplate 发送请求 实现httpclient
-
RestTemplate优雅的发送Get请求
-
resttemplate 发送带header的get请求