查看源码的话分为了好多种请求方式,主要用到的就是get、post方式的请求,可能偶尔也会用到put和detele,目前的话还没有接触到过这两种方式。下面就以get和post方式为主介绍。
-
首先接口提供方 以及接口消费方
我在本地创建了两个项目 端口为9999的为接口提供方,端口8888的为接口消费方 在接口提供方中有一个接口
-
使用get方式
接口调用方需要引入restTemplate
页面访问路径 看返回值
两者除了地址不一样之外内容是一样的。
改变返回值类型为实体类时,打印输返回值内容
前端返回数据还是和之前一样,只显示body内容
在接口提供方修改接口返回值为list之后,接口调用方也修改返回值 前端返回结果是list
在知道返回参数类型的时候我们可以使用相应的实体类去接受,而不用单纯的只用string去接受,然后用gson去解析,稍显麻烦
- 使用post方式我改变了调用放的接参以及返参
如图 接参是一个实体类,返参是一个list
但是我在调用的时候没有修改返回值类型,就报json解析异常的问题,因为调用方的返回值和提供方的返回数据是不一样的,这个需要很谨慎
在传参的过程中发现接口提供方接到的参数是null,但是在接口调用的时候加入了参数book以及所包括的属性
对于以上问题,我根据使用的方法postForEntity往下面看源码
首先进入到 postForObject 方法中 发现request 参数 传入了一个 httpEntityCallBack 方法中 , 那么接着追踪
httpEntityCallBack方法又调用了 RestTemplate的HttpEntityRequestCallback方法
进入HttpEntityRequestCallback
发现用到了判断instanceof类型判定requestBody参数是否是 HttpEntity类型
如果不是则 创建一个HttpEntity类将 requestBody 参数传入
那么我们来看一下 HttpEntity 是怎么个构造
这里可以看到 HttpEntity 有两个构造方法 一个是 传入 泛型的body 另一个是传入 MultiValueMap<String,String> headers
那么 这个MultiValueMap 是个什么东东
百度一下 发现 MultiValueMap 可以让一个key对应多个value,感觉是value产生了链表结构,可以很好的解决一些不好处理的字符串问题
找到 MultiValueMap 接口的实现类
查看里面的构造方法,然后我自己写了一个方法 来对他进行遍历及查询
继续回到我们调用的postForEntity方法上,然后使用MultiValueMap的实现类LinkedMultiValueMap
然后debug我们的接口调用方以及接口提供方 发现接口提供方的接口我们的传参有被传进去
以上就是使用restTemplate的基本方法,有问题的话还请打架多多指教