RestTemplate的使用

我们调用其他人的接口时,就需要建立网络连接,需要释放连接和一系列复杂的操作,为了简化这个操作,spring提供了RestTemplate用来进行网络连接调用第三方API操作

RestTemplate的常用方法解析

GET请求

GET请求有2个方法,一个getForObject,另外一个是getForEntity,如果你只需要返回的信息主体就是用getForObject就好,如果需要其他的额外信息,例如JSP版本,返回时间之类的信息则使用getForEntity,一般情况都使用getForObject

一、getForObject

用于获取返回信息的本体信息

这里测试使用免费API网站:全部分类 - ALAPI

我们随便选择一个API来进行调用

实例调用

@Test
void contextLoads() {
        RestTemplate restTemplate = new RestTemplate();
        //便于测试,值全部手动输入,不推荐直接把请求值直接写在链接内,如果想直接写在链接内请使用uri,因为有浏览器需要对值进行转码,安全性等问题,请参考底下重载传参的2种方法,token是我自己的,你们的自己申请
        String url = "https://v2.alapi.cn/api/joke" + "?token=QoP4v0JtGiHyO23k&page=1&num=2";
        String forObject = restTemplate.getForObject(url, String.class);
    	System.out.println(forObject);
    }
  • getForObject的第一个参数是要调用的服务的地址
  • getForObject第二个参数表示返回的body类型

输出结果

{
    "code": 200,
    "msg": "success",
    "data": [
        {
            "title": "最新超级爆笑笑话段子精选:我想纹个二维码可以吗?",
            "content": "1、本人女,昨晚下夜班回家,经过一条小巷,身后鬼鬼祟祟的尾随着一个男人,我紧张地摸摸裤子口袋松了口气,还好没带钱包,顶多被劫色而已,但是又想到已经两天没洗澡了,再次紧张起来,万一那男人嫌弃我怎么办?2、跟男朋友谈了两个多月了,他特别爱抽烟。今天我和他说:“不许抽烟了,不然就分手!”他缓缓地点了根烟,轻轻地抽了一口:“烟跟我多久了!你才跟我多久?你走吧!”尼玛!剧情不应该是这样的啊。。。3、打电话给老妈,说国庆准备回南昌,老妈叹了口气说:”不瞒你,家里出了点事,饭都吃不上了,你先别回家。”我心里一慌,急忙赶回家,都不在,连忙又打电话问在哪,老妈说:”你爸放假不愿意做饭,家里没饭吃了,我俩只好跑桂林这边的饭店随便吃点。”4、小红对自己的双胞胎妹妹说:“妹妹,我明天不想上课,你替我去吧,我们是双胞胎,他们肯定分不清你和我。”“你是傻么?哥。”5、“唉,感觉白龙马登场后,西游记就不好看了”“嗯,这就是无马跟有马的区别!”6、去某地玩,碰见一美女问要服务么,看长的还行就问价,答300觉得不贵就跟她去了,完事告诉我是300一下,当时就懵B了。她看我不想结账还叫来几个纹身大汉,没办法只好乖乖的掏了600。想想后怕,差点破产。7、和同事在烤鸭店里吃烤鸭,一帮大男人居然没完没了的聊起了做鸭的话题。。。。我觉得很无聊,义正言辞的对他们说:“下班了,能不能不谈工作?”8、我:师傅我想纹个身。师傅:小伙子想纹个什么?我:我想纹个唯一的、个性的、复杂点,流行又上档次的。师傅:小伙子放心,无论是青龙白虎或是米老鼠,我都会让你满意的。你要纹什么?我:我想纹个二维码可以吗?师傅:。。。。。。小伙子你是来找茬的吧。9、今天在办公室喝加多宝,在开罐的时候发现和汽水一样有那种气的声音,我问了一句:加多宝为什么会有气?同事:那还不是因为王老吉!",
            "time": "2021-05-26 23:46:10"
        }
    ],
    "time": 1644307189,
    "log_id": 349583450803064832
}
重载传参的2种方法
  • 使用参数的 key作为占位符,同时将参数放入到一个 map 中。map 中的 key 和占位符的 key 相对应,map 中的 value 就是参数的具体值,实例如下:
RestTemplate restTemplate = new RestTemplate();
String url = "https://v2.alapi.cn/api/joke?token={token}&page={page}&num={num}";
Map<String, Object> map = new HashMap<>();
map.put("token", "QoP4v0JtGiHyO23k");
map.put("page", 1);
map.put("num", 1);
String forObject = restTemplate.getForObject(url, String.class, map);
  • 使用 Uri 对象,使用 Uri 对象时,参数可以直接拼接在地址中,实例如下:
String url = "https://v2.alapi.cn/api/joke?token="+URLEncoder.encode("QoP4v0JtGiHyO23k","UTF-8")+"&page=1&num="+ URLEncoder.encode("1","UTF-8");
        URI uri = URI.create(url);
        String forObject = restTemplate.getForObject(uri, String.class);

二、getForEntity

用于获取返回所有信息

getForEntity的重载传参和上面的类似,因此不多提

实例

@Test
void contextLoads() {
        RestTemplate restTemplate = new RestTemplate();
        String url = "https://v2.alapi.cn/api/joke" + "?token=QoP4v0JtGiHyO23k&page=1&num=2";
        ResponseEntity<String> forEntity = restTemplate.getForEntity(url, String.class);
        System.out.println(forEntity);
    }

输出结果

<200,{"code":200,"msg":"success","data":[{"title":"最新超级爆笑笑话段子精选:我想纹个二维码可以吗?","content":"1、本人女,昨晚下夜班回家,经过一条小巷,身后鬼鬼祟祟的尾随着一个男人,我紧张地摸摸裤子口袋松了口气,还好没带钱包,顶多被劫色而已,但是又想到已经两天没洗澡了,再次紧张起来,万一那男人嫌弃我怎么办?2、跟男朋友谈了两个多月了,他特别爱抽烟。今天我和他说:“不许抽烟了,不然就分手!”他缓缓地点了根烟,轻轻地抽了一口:“烟跟我多久了!你才跟我多久?你走吧!”尼玛!剧情不应该是这样的啊。。。3、打电话给老妈,说国庆准备回南昌,老妈叹了口气说:&#8221;不瞒你,家里出了点事,饭都吃不上了,你先别回家。&#8221;我心里一慌,急忙赶回家,都不在,连忙又打电话问在哪,老妈说:&#8221;你爸放假不愿意做饭,家里没饭吃了,我俩只好跑桂林这边的饭店随便吃点。&#8221;4、小红对自己的双胞胎妹妹说:“妹妹,我明天不想上课,你替我去吧,我们是双胞胎,他们肯定分不清你和我。”“你是傻么?哥。”5、“唉,感觉白龙马登场后,西游记就不好看了”“嗯,这就是无马跟有马的区别!”6、去某地玩,碰见一美女问要服务么,看长的还行就问价,答300觉得不贵就跟她去了,完事告诉我是300一下,当时就懵B了。她看我不想结账还叫来几个纹身大汉,没办法只好乖乖的掏了600。想想后怕,差点破产。7、和同事在烤鸭店里吃烤鸭,一帮大男人居然没完没了的聊起了做鸭的话题。。。。我觉得很无聊,义正言辞的对他们说:“下班了,能不能不谈工作?”8、我:师傅我想纹个身。师傅:小伙子想纹个什么?我:我想纹个唯一的、个性的、复杂点,流行又上档次的。师傅:小伙子放心,无论是青龙白虎或是米老鼠,我都会让你满意的。你要纹什么?我:我想纹个二维码可以吗?师傅:。。。。。。小伙子你是来找茬的吧。9、今天在办公室喝加多宝,在开罐的时候发现和汽水一样有那种气的声音,我问了一句:加多宝为什么会有气?同事:那还不是因为王老吉!","time":"2021-05-26 23:46:10"}],"time":1644307241,"log_id":349583668340641792},[Server:"JSP3/2.0.14", Date:"Tue, 08 Feb 2022 08:00:41 GMT", Content-Type:"application/json; charset=utf-8", Content-Length:"2483", Connection:"keep-alive", Accept-Ranges:"bytes", Access-Control-Allow-Origin:"*", Access-Control-Allow-Credentials:"true", Access-Control-Allow-Headers:"*", Access-Control-Allow-Methods:"*", Log_id:"349583668340641792", Timing-Allow-Origin:"*", Ohc-Cache-HIT:"xm2ct50 [1], njctcache100 [1]", Ohc-File-Size:"2483", alt-svc:"quic="27.148.188.42:443"; ma=300; v="44,43,39""]>

由此可见,getForEntity返回的结果更加详细,但是一般情况下不需要额外信息。

POST请求

一、postForObject

与getForObject类似,不过参数上不同,需要提供上传的参数

实例

@Test
void contextLoads() {
        RestTemplate restTemplate = new RestTemplate();
        //便于测试,值全部手动输入,token是我自己的,你们的自己申请
        String url = "https://v2.alapi.cn/api/joke" + "?token=QoP4v0JtGiHyO23k&page=1&num=2";
        String forObject = restTemplate.postForObject(url,"",String.class);
        System.out.println(forObject);
    }

输出结果与getForObject一致

二、postForEntity

与getForEntity类似,不过参数上不同,需要提供上传的参数

实例

@Test
void contextLoads() {
        RestTemplate restTemplate = new RestTemplate();
        String url = "https://v2.alapi.cn/api/joke" + "?token=QoP4v0JtGiHyO23k&page=1&num=2";
        ResponseEntity<String> stringResponseEntity = restTemplate.postForEntity(url, "", String.class);
        System.out.println(stringResponseEntity);
    }

输出结果与getForEntity一致

posted @ 2022-02-08 16:38  HeiDaotu  阅读(367)  评论(0编辑  收藏  举报