2023年8月1日发(作者:)
Spring学习笔记之RestTemplate使⽤⼩结前⾔作为⼀个Java后端,需要通过HTTP请求其他的⽹络资源可以说是⼀个⽐较常见的case了;⼀般怎么做呢?可能⼤部分的⼩伙伴直接捞起Apache的HttpClient开始做,或者⽤其他的⼀些知名的开源库如OkHttp, 当然原⽣的HttpURLConnection也是没问题的本篇博⽂则主要关注点放在Sprig的⽣态下,利⽤RestTemplate来发起Http请求的使⽤姿势I. RestTempalate 基本使⽤0. ⽬标在介绍如何使⽤RestTemplate之前,我们先抛出⼀些⼩⽬标,⾄少需要知道通过RestTemplate可以做些什么,以及我们要⽤它来⼲些什么简单的给出了⼀下常见的问题如下普通的Get请求获取返回数据,怎么玩?post提交表达的请求,如何处理post请求中RequestBody的请求⽅式与普通的请求⽅式区别https/http两种访问如何分别处理如何在请求中带上指定的Header有跨域的问题么?如果有怎么解决有登录验证的请求,该怎么办,怎样携带⾝份信息上传⽂件可以⽀持么对于需要代理才能访问的http资源,加代理的姿势是怎样的上⾯的问题⽐较多,⽬测不是⼀篇博⽂可以弄完的,因此对这个拆解⼀下,本篇主要关注在RestTemplate的简单Get/Post请求的使⽤⽅式上1. 基本接⼝捞出源码,看⼀下其给出的⼀些常⽤接⼝,基本上可以分为下⾯⼏种// get 请求public T getForObject();public ResponseEntity getForEntity();// head 请求public HttpHeaders headForHeaders();// post 请求public URI postForLocation();public T postForObject();public ResponseEntity postForEntity();// put 请求public void put();// pathch
public T patchForObject// deletepublic void delete()// optionspublic Set optionsForAllow// exchangepublic ResponseEntity exchange()上⾯提供的⼏个接⼝,基本上就是Http提供的⼏种访问⽅式的对应,其中exchange却⼜不⼀样,后⾯细说2. Get请求从上⾯的接⼝命名上,可以看出可以使⽤的有两种⽅式 getForObject 和 getForEntity,那么这两种有什么区别?从接⼝的签名上,可以看出⼀个是直接返回预期的对象,⼀个则是将对象包装到 ResponseEntity 封装类中如果只关⼼返回结果,那么直接⽤ GetForObject 即可如果除了返回的实体内容之外,还需要获取返回的header等信息,则可以使⽤ getForEntita. 创建Get接⼝为了验证RestTemplate的使⽤姿势,当然得先提供⼀个后端的REST服务,这了直接⽤了我个⼈的⼀个古诗词的后端接⼝,来作为简单的Get测试使⽤返回结果:{ "status": { "code": 200, "msg": "SUCCESS" }, "result": { "id": 666106231640, "title": "西塞⼭⼆⾸(今谓之道⼠矶,即兴国军⼤冶县", "author": "王周", "content": "西塞名⼭⽴翠屏,浓岚横⼊半江青。n千寻铁锁⽆由问,⽯壁空存道者形。n匹妇顽然莫问因,匹夫何去望千春。n翻思岵屺传诗什,举世曾⽆化⽯⼈。", "explain": "", "theme": "⽆", "dynasty": "唐诗" }}b. getForObject⽅式⾸先看下完整的接⼝签名@Nullablepublic T getForObject(String url, Class responseType, uriVariables) throws RestClientException ;@Nullablepublic T getForObject(String url, Class responseType, Map uriVariables) throws RestClientException ;@Nullablepublic T getForObject(URI url, Class responseType) throws RestClientException;有三个重载的⽅法,从接⼝上也⽐较容易看出如何使⽤,其中有点疑惑的则是第⼀钟,参数应该怎么传了,下⾯给出上⾯⼏种的使⽤姿势public class RestTestmplateTest { private RestTemplate restTemplate; @Before public void init() { restTemplate = new RestTemplate(); } @ static class InnerRes { private Status status; private Data result; } @ static class Status { int code; String msg; } @ static class Data { long id; String theme; String title; String dynasty; String explain; String content; String author; } @Test public void testGet() { // 使⽤⽅法⼀,不带参数 String url = "/detail?id=666106231640"; InnerRes res = Object(url, ); n(res); // 使⽤⽅法⼀,传参替换 url = "/detail?id={?}"; res = Object(url, , "666106231640"); n(res); // 使⽤⽅法⼆,map传参 url = "/detail?id={id}"; Map params = new HashMap<>(); ("id", 666106231640L); res = Object(url, , params); n(res); // 使⽤⽅法三,URI访问 URI uri = ("/detail?id=666106231640"); res = Object(uri, ); n(res); }}看上⾯的testcase,后⾯两个⽅法的使⽤没什么好说的,主要看⼀下mplate#getForObject(,, ...)
的使⽤姿势根据实际传参替换url模板中的内容使⽤⽅法⼀时,模板中使⽤ {?} 来代表坑位,根据实际的传参顺序来填充使⽤⽅法⼆时,模板中使⽤ {xx}, ⽽这个xx,对应的就是map中的key上⾯执⾏后的截图如下c. getForEntity⽅式既然getForObject有三种使⽤⽅法,那么getForEntity理论上也应该有对应的三种⽅式public ResponseEntity getForEntity(String url, Class responseType, uriVariables) throws RestClientException ;public ResponseEntity getForEntity(String url, Class responseType, Map uriVariables) throws RestClientException;public ResponseEntity getForEntity(URI url, Class responseType) throws RestClientException;因为使⽤姿势和上⾯⼀致,因此只拿⼀个进⾏测试@Testpublic void testGetForEntity() { String url = "/detail?id=666106231640"; ResponseEntity res = Entity(url, ); n(res);}对这个,我们主要关注的就是ResponseEntity封装中,多了哪些东西,截图如下从上⾯可以看出,多了两个东西⼀个返回的http状态码,如200表⽰请求成功,500服务器错误,404not found等⼀个 ResponseHeader3. Post请求从上⾯的接⼝说明上看,post请求除了有forObject 和 forEntity之外,还多了个forLocation;其次post与get⼀个明显的区别就是传参的姿势问题,get的参数⼀般会待在url上;post的则更常见的是通过表单的⽅式提交因此接下来关注的重点在于forLocation是什么,以及如何传参a. post接⼝mock⾸先创建⼀个简单的提供POST请求的REST服务,基于Spring-boot简单搭建⼀个,如下@ResponseBody@RequestMapping(path = "post", method = {, S, })public String post(HttpServletRequest request, @RequestParam(value = "email", required = false) String email, @RequestParam(value = "nick", required = false) String nick) { Map map = new HashMap<>(); ("code", "200"); ("result", "add " + email + " # " + nick + " success!"); return String(map);}b. postForObject⽅法⾸先看⼀下接⼝签名public T postForObject(String url, @Nullable Object request, Class responseType, uriVariables) throws RestClientException ;public T postForObject(String url, @Nullable Object request, Class responseType, Map uriVariables) throws RestClientException;public T postForObject(URI url, @Nullable Object request, Class responseType) throws RestClientException ;上⾯的三个⽅法,看起来和前⾯并没有太⼤的区别,只是多了⼀个request参数,那么具体的使⽤如何呢?下⾯分别给出使⽤⽤例@Testpublic void testPost() { String url = "localhost:8080/post"; String email = "test@"; String nick = "⼀灰灰Blog"; MultiValueMap request = new LinkedMultiValueMap<>(); ("email", email); ("nick", nick); // 使⽤⽅法三 URI uri = (url); String ans = rObject(uri, request, ); n(ans); // 使⽤⽅法⼀ ans = rObject(url, request, ); n(ans); // 使⽤⽅法⼀,但是结合表单参数和uri参数的⽅式,其中uri参数的填充和get请求⼀致 (); ("email", email); ans = rObject(url + "?nick={?}", request, , nick); n(ans); // 使⽤⽅法⼆ Map params = new HashMap<>(); ("nick", nick); ans = rObject(url + "?nick={nick}", request, , params); n(ans);}复制代码上⾯分别给出了三种⽅法的调⽤⽅式,其中post传参区分为两种,⼀个是uri参数即拼接在url中的,还有⼀个就是表单参数uri参数,使⽤姿势和get请求中⼀样,填充uri中模板坑位表单参数,由MultiValueMap封装,同样是kv结构c. postForEntity和前⾯的使⽤姿势⼀样,⽆⾮是多了⼀层包装⽽已,略过不讲d. postForLocation这个与前⾯有点区别,从接⼝定义上来说,主要是POST 数据到⼀个URL,返回新创建资源的URL同样提供了三个接⼝,分别如下,需要注意的是返回结果,为URI对象,即⽹络资源public URI postForLocation(String url, @Nullable Object request, uriVariables) throws RestClientException ;public URI postForLocation(String url, @Nullable Object request, Map uriVariables) throws RestClientException ;public URI postForLocation(URI url, @Nullable Object request) throws RestClientException ;那么什么样的接⼝适合⽤这种访问姿势呢?想⼀下我们⼀般登录or注册都是post请求,⽽这些操作完成之后呢?⼤部分都是跳转到别的页⾯去了,这种场景下,就可以使⽤postForLocation 了,提交数据,并获取返回的URI,⼀个测试如下⾸先mock⼀个后端接⼝@ResponseBody@RequestMapping(path = "success")public String loginSuccess(String email, String nick) { return "welcome " + nick;}@RequestMapping(path = "post", method = {, S, })public String post(HttpServletRequest request, @RequestParam(value = "email", required = false) String email, @RequestParam(value = "nick", required = false) String nick) { return "redirect:/success?email=" + email + "&nick=" + nick + "&status=success";}访问的测试⽤例,基本上和前⾯的⼀样,没有什么特别值得⼀说的@Testpublic void testPostLocation() { String url = "localhost:8080/post"; String email = "test@"; String nick = "⼀灰灰Blog"; MultiValueMap request = new LinkedMultiValueMap<>(); ("email", email); ("nick", nick); // 使⽤⽅法三 URI uri = rLocation(url, request); n(uri);}执⾏结果如下获取到的就是302跳转后端url,细⼼的朋友可能看到上⾯中⽂乱码的问题,如何解决呢?⼀个简单的解决⽅案就是url编码⼀下@RequestMapping(path = "post", method = {, S, }, produces = "charset/utf8")public String post(HttpServletRequest request, @RequestParam(value = "email", required = false) String email, @RequestParam(value = "nick", required = false) String nick) throws UnsupportedEncodingException { return "redirect:/success?email=" + email + "&nick=" + (nick, "UTF-8") + "&status=success";}II. ⼩结上⾯⽬前只给出了Get/Post两种请求⽅式的基本使⽤⽅式,并没有涉及到更⾼级的如添加请求头,添加证书,设置代理等,⾼级的使⽤篇等待下⼀篇出炉,下⾯⼩结⼀下上⾯的使⽤姿势1. Get请求get请求中,参数⼀般都是带在url上,对于参数的填充,有两种⽅式,思路⼀致都是根据实际的参数来填充url中的占位符的内容;根据返回结果,也有两种⽅式,⼀个是只关⼼返回对象,另⼀个则包含了返回headers信⼼参数填充调⽤ getForObject(String url, Class responseType, uriVariables)模板中的0,表⽰ uriVariables 数组中的第0个, i,则表⽰第i个如果没有url参数,也推荐⽤这个⽅法,不传uriVariables即可调⽤ getForObject(String url, Class responseType, Map uriVariables)map参数中的key,就是url参数中 {} 中的内容其实还有⼀种传参⽅式,就是path参数,填充⽅式和上⾯⼀样,并没有什么特殊的玩法,上⾯没有特别列出返回结果直接获取返回的数据 getForObject获取待responseHeader的数据 getForEntity2. Post请求post请求的返回也有两种,和上⾯⼀样post请求,参数可以区分为表单提交和url参数,其中url参数和前⾯的逻辑⼀致post表单参数,请包装在 MultiValueMap 中,作为第⼆个参数 Request 来提交post的⽅法,还有⼀个 postForLocation,返回的是⼀个URI对象,即适⽤于返回⽹络资源的请求⽅式3. 其他最前⾯提了多点关于⽹络请求的常见case,但是上⾯的介绍,明显只处于基础篇,我们还需要关注的有如何设置请求头?有⾝份验证的请求,如何携带⾝份信息?代理的设置⽂件上传可以怎么做?post提交json串(即RequestBody) ⼜可以怎么处理上⾯可能还停留在应⽤篇,对于源码和实现有兴趣的话,问题也就来了RestTemplaet的实现原理是怎样的前⾯url参数的填充逻辑实现是否优雅返回的对象如何解析....⼩⼩的⼀个⼯具类,其实东西还挺多的,接下来的⼩⽬标,就是针对上⾯提出的点,逐⼀进⾏研究总结以上就是这篇⽂章的全部内容了,希望本⽂的内容对⼤家的学习或者⼯作具有⼀定的参考学习价值,如果有疑问⼤家可以留⾔交流,谢谢⼤家对的⽀持。
2023年8月1日发(作者:)
Spring学习笔记之RestTemplate使⽤⼩结前⾔作为⼀个Java后端,需要通过HTTP请求其他的⽹络资源可以说是⼀个⽐较常见的case了;⼀般怎么做呢?可能⼤部分的⼩伙伴直接捞起Apache的HttpClient开始做,或者⽤其他的⼀些知名的开源库如OkHttp, 当然原⽣的HttpURLConnection也是没问题的本篇博⽂则主要关注点放在Sprig的⽣态下,利⽤RestTemplate来发起Http请求的使⽤姿势I. RestTempalate 基本使⽤0. ⽬标在介绍如何使⽤RestTemplate之前,我们先抛出⼀些⼩⽬标,⾄少需要知道通过RestTemplate可以做些什么,以及我们要⽤它来⼲些什么简单的给出了⼀下常见的问题如下普通的Get请求获取返回数据,怎么玩?post提交表达的请求,如何处理post请求中RequestBody的请求⽅式与普通的请求⽅式区别https/http两种访问如何分别处理如何在请求中带上指定的Header有跨域的问题么?如果有怎么解决有登录验证的请求,该怎么办,怎样携带⾝份信息上传⽂件可以⽀持么对于需要代理才能访问的http资源,加代理的姿势是怎样的上⾯的问题⽐较多,⽬测不是⼀篇博⽂可以弄完的,因此对这个拆解⼀下,本篇主要关注在RestTemplate的简单Get/Post请求的使⽤⽅式上1. 基本接⼝捞出源码,看⼀下其给出的⼀些常⽤接⼝,基本上可以分为下⾯⼏种// get 请求public T getForObject();public ResponseEntity getForEntity();// head 请求public HttpHeaders headForHeaders();// post 请求public URI postForLocation();public T postForObject();public ResponseEntity postForEntity();// put 请求public void put();// pathch
public T patchForObject// deletepublic void delete()// optionspublic Set optionsForAllow// exchangepublic ResponseEntity exchange()上⾯提供的⼏个接⼝,基本上就是Http提供的⼏种访问⽅式的对应,其中exchange却⼜不⼀样,后⾯细说2. Get请求从上⾯的接⼝命名上,可以看出可以使⽤的有两种⽅式 getForObject 和 getForEntity,那么这两种有什么区别?从接⼝的签名上,可以看出⼀个是直接返回预期的对象,⼀个则是将对象包装到 ResponseEntity 封装类中如果只关⼼返回结果,那么直接⽤ GetForObject 即可如果除了返回的实体内容之外,还需要获取返回的header等信息,则可以使⽤ getForEntita. 创建Get接⼝为了验证RestTemplate的使⽤姿势,当然得先提供⼀个后端的REST服务,这了直接⽤了我个⼈的⼀个古诗词的后端接⼝,来作为简单的Get测试使⽤返回结果:{ "status": { "code": 200, "msg": "SUCCESS" }, "result": { "id": 666106231640, "title": "西塞⼭⼆⾸(今谓之道⼠矶,即兴国军⼤冶县", "author": "王周", "content": "西塞名⼭⽴翠屏,浓岚横⼊半江青。n千寻铁锁⽆由问,⽯壁空存道者形。n匹妇顽然莫问因,匹夫何去望千春。n翻思岵屺传诗什,举世曾⽆化⽯⼈。", "explain": "", "theme": "⽆", "dynasty": "唐诗" }}b. getForObject⽅式⾸先看下完整的接⼝签名@Nullablepublic T getForObject(String url, Class responseType, uriVariables) throws RestClientException ;@Nullablepublic T getForObject(String url, Class responseType, Map uriVariables) throws RestClientException ;@Nullablepublic T getForObject(URI url, Class responseType) throws RestClientException;有三个重载的⽅法,从接⼝上也⽐较容易看出如何使⽤,其中有点疑惑的则是第⼀钟,参数应该怎么传了,下⾯给出上⾯⼏种的使⽤姿势public class RestTestmplateTest { private RestTemplate restTemplate; @Before public void init() { restTemplate = new RestTemplate(); } @ static class InnerRes { private Status status; private Data result; } @ static class Status { int code; String msg; } @ static class Data { long id; String theme; String title; String dynasty; String explain; String content; String author; } @Test public void testGet() { // 使⽤⽅法⼀,不带参数 String url = "/detail?id=666106231640"; InnerRes res = Object(url, ); n(res); // 使⽤⽅法⼀,传参替换 url = "/detail?id={?}"; res = Object(url, , "666106231640"); n(res); // 使⽤⽅法⼆,map传参 url = "/detail?id={id}"; Map params = new HashMap<>(); ("id", 666106231640L); res = Object(url, , params); n(res); // 使⽤⽅法三,URI访问 URI uri = ("/detail?id=666106231640"); res = Object(uri, ); n(res); }}看上⾯的testcase,后⾯两个⽅法的使⽤没什么好说的,主要看⼀下mplate#getForObject(,, ...)
的使⽤姿势根据实际传参替换url模板中的内容使⽤⽅法⼀时,模板中使⽤ {?} 来代表坑位,根据实际的传参顺序来填充使⽤⽅法⼆时,模板中使⽤ {xx}, ⽽这个xx,对应的就是map中的key上⾯执⾏后的截图如下c. getForEntity⽅式既然getForObject有三种使⽤⽅法,那么getForEntity理论上也应该有对应的三种⽅式public ResponseEntity getForEntity(String url, Class responseType, uriVariables) throws RestClientException ;public ResponseEntity getForEntity(String url, Class responseType, Map uriVariables) throws RestClientException;public ResponseEntity getForEntity(URI url, Class responseType) throws RestClientException;因为使⽤姿势和上⾯⼀致,因此只拿⼀个进⾏测试@Testpublic void testGetForEntity() { String url = "/detail?id=666106231640"; ResponseEntity res = Entity(url, ); n(res);}对这个,我们主要关注的就是ResponseEntity封装中,多了哪些东西,截图如下从上⾯可以看出,多了两个东西⼀个返回的http状态码,如200表⽰请求成功,500服务器错误,404not found等⼀个 ResponseHeader3. Post请求从上⾯的接⼝说明上看,post请求除了有forObject 和 forEntity之外,还多了个forLocation;其次post与get⼀个明显的区别就是传参的姿势问题,get的参数⼀般会待在url上;post的则更常见的是通过表单的⽅式提交因此接下来关注的重点在于forLocation是什么,以及如何传参a. post接⼝mock⾸先创建⼀个简单的提供POST请求的REST服务,基于Spring-boot简单搭建⼀个,如下@ResponseBody@RequestMapping(path = "post", method = {, S, })public String post(HttpServletRequest request, @RequestParam(value = "email", required = false) String email, @RequestParam(value = "nick", required = false) String nick) { Map map = new HashMap<>(); ("code", "200"); ("result", "add " + email + " # " + nick + " success!"); return String(map);}b. postForObject⽅法⾸先看⼀下接⼝签名public T postForObject(String url, @Nullable Object request, Class responseType, uriVariables) throws RestClientException ;public T postForObject(String url, @Nullable Object request, Class responseType, Map uriVariables) throws RestClientException;public T postForObject(URI url, @Nullable Object request, Class responseType) throws RestClientException ;上⾯的三个⽅法,看起来和前⾯并没有太⼤的区别,只是多了⼀个request参数,那么具体的使⽤如何呢?下⾯分别给出使⽤⽤例@Testpublic void testPost() { String url = "localhost:8080/post"; String email = "test@"; String nick = "⼀灰灰Blog"; MultiValueMap request = new LinkedMultiValueMap<>(); ("email", email); ("nick", nick); // 使⽤⽅法三 URI uri = (url); String ans = rObject(uri, request, ); n(ans); // 使⽤⽅法⼀ ans = rObject(url, request, ); n(ans); // 使⽤⽅法⼀,但是结合表单参数和uri参数的⽅式,其中uri参数的填充和get请求⼀致 (); ("email", email); ans = rObject(url + "?nick={?}", request, , nick); n(ans); // 使⽤⽅法⼆ Map params = new HashMap<>(); ("nick", nick); ans = rObject(url + "?nick={nick}", request, , params); n(ans);}复制代码上⾯分别给出了三种⽅法的调⽤⽅式,其中post传参区分为两种,⼀个是uri参数即拼接在url中的,还有⼀个就是表单参数uri参数,使⽤姿势和get请求中⼀样,填充uri中模板坑位表单参数,由MultiValueMap封装,同样是kv结构c. postForEntity和前⾯的使⽤姿势⼀样,⽆⾮是多了⼀层包装⽽已,略过不讲d. postForLocation这个与前⾯有点区别,从接⼝定义上来说,主要是POST 数据到⼀个URL,返回新创建资源的URL同样提供了三个接⼝,分别如下,需要注意的是返回结果,为URI对象,即⽹络资源public URI postForLocation(String url, @Nullable Object request, uriVariables) throws RestClientException ;public URI postForLocation(String url, @Nullable Object request, Map uriVariables) throws RestClientException ;public URI postForLocation(URI url, @Nullable Object request) throws RestClientException ;那么什么样的接⼝适合⽤这种访问姿势呢?想⼀下我们⼀般登录or注册都是post请求,⽽这些操作完成之后呢?⼤部分都是跳转到别的页⾯去了,这种场景下,就可以使⽤postForLocation 了,提交数据,并获取返回的URI,⼀个测试如下⾸先mock⼀个后端接⼝@ResponseBody@RequestMapping(path = "success")public String loginSuccess(String email, String nick) { return "welcome " + nick;}@RequestMapping(path = "post", method = {, S, })public String post(HttpServletRequest request, @RequestParam(value = "email", required = false) String email, @RequestParam(value = "nick", required = false) String nick) { return "redirect:/success?email=" + email + "&nick=" + nick + "&status=success";}访问的测试⽤例,基本上和前⾯的⼀样,没有什么特别值得⼀说的@Testpublic void testPostLocation() { String url = "localhost:8080/post"; String email = "test@"; String nick = "⼀灰灰Blog"; MultiValueMap request = new LinkedMultiValueMap<>(); ("email", email); ("nick", nick); // 使⽤⽅法三 URI uri = rLocation(url, request); n(uri);}执⾏结果如下获取到的就是302跳转后端url,细⼼的朋友可能看到上⾯中⽂乱码的问题,如何解决呢?⼀个简单的解决⽅案就是url编码⼀下@RequestMapping(path = "post", method = {, S, }, produces = "charset/utf8")public String post(HttpServletRequest request, @RequestParam(value = "email", required = false) String email, @RequestParam(value = "nick", required = false) String nick) throws UnsupportedEncodingException { return "redirect:/success?email=" + email + "&nick=" + (nick, "UTF-8") + "&status=success";}II. ⼩结上⾯⽬前只给出了Get/Post两种请求⽅式的基本使⽤⽅式,并没有涉及到更⾼级的如添加请求头,添加证书,设置代理等,⾼级的使⽤篇等待下⼀篇出炉,下⾯⼩结⼀下上⾯的使⽤姿势1. Get请求get请求中,参数⼀般都是带在url上,对于参数的填充,有两种⽅式,思路⼀致都是根据实际的参数来填充url中的占位符的内容;根据返回结果,也有两种⽅式,⼀个是只关⼼返回对象,另⼀个则包含了返回headers信⼼参数填充调⽤ getForObject(String url, Class responseType, uriVariables)模板中的0,表⽰ uriVariables 数组中的第0个, i,则表⽰第i个如果没有url参数,也推荐⽤这个⽅法,不传uriVariables即可调⽤ getForObject(String url, Class responseType, Map uriVariables)map参数中的key,就是url参数中 {} 中的内容其实还有⼀种传参⽅式,就是path参数,填充⽅式和上⾯⼀样,并没有什么特殊的玩法,上⾯没有特别列出返回结果直接获取返回的数据 getForObject获取待responseHeader的数据 getForEntity2. Post请求post请求的返回也有两种,和上⾯⼀样post请求,参数可以区分为表单提交和url参数,其中url参数和前⾯的逻辑⼀致post表单参数,请包装在 MultiValueMap 中,作为第⼆个参数 Request 来提交post的⽅法,还有⼀个 postForLocation,返回的是⼀个URI对象,即适⽤于返回⽹络资源的请求⽅式3. 其他最前⾯提了多点关于⽹络请求的常见case,但是上⾯的介绍,明显只处于基础篇,我们还需要关注的有如何设置请求头?有⾝份验证的请求,如何携带⾝份信息?代理的设置⽂件上传可以怎么做?post提交json串(即RequestBody) ⼜可以怎么处理上⾯可能还停留在应⽤篇,对于源码和实现有兴趣的话,问题也就来了RestTemplaet的实现原理是怎样的前⾯url参数的填充逻辑实现是否优雅返回的对象如何解析....⼩⼩的⼀个⼯具类,其实东西还挺多的,接下来的⼩⽬标,就是针对上⾯提出的点,逐⼀进⾏研究总结以上就是这篇⽂章的全部内容了,希望本⽂的内容对⼤家的学习或者⼯作具有⼀定的参考学习价值,如果有疑问⼤家可以留⾔交流,谢谢⼤家对的⽀持。
发布评论