远程接口调用

news/2025/1/20 4:37:07/

目录

GET请求

案例1:

案例2: 

案例3:查询新闻列表  

POST请求

PUT请求

DELETE请求

通用

传json参数


        在服务端使用java语言,向远程接口发起请求,得到响应数据的方法。实现远程接口调用方法很多,这里我们学习spring封装的工具类RestTemplate,使用起来最方便简单。

GET请求

要调用的接口是Get请求:

代码实现: 

案例1:

@RestController
@RequestMapping("/news")
public class NewsController {/*** 服务对象*/@Resourceprivate NewsService newsService;@GetMapping("/test1")public R test1() {RestTemplate restTemplate = new RestTemplate();String url = "http://127.0.0.1:8080/dynamics/page?pageNum=1&pageSize=5";// 返回的数据类型是ResponseEntityResponseEntity<R> responseEntity = restTemplate.getForEntity(url, R.class);// 获取bodyR body = responseEntity.getBody();// 获取headerHttpHeaders headers = responseEntity.getHeaders();return body;}
}

运行结果: 

将RestTemplate放到容器里:

@SpringBootApplication
@MapperScan("com.javaplay.playPal.*.dao")
public class AdminApiApplication {public static void main(String[] args) {SpringApplication.run(AdminApiApplication.class, args);}@Beanpublic RestTemplate restTemplate() {return new RestTemplate();}
}

案例2: 

@Resource
RestTemplate restTemplate;
@GetMapping("/test2/{id}")
public R test2(@PathVariable Integer id) {String url = "http://127.0.0.1:8080/dynamics/{0}";// 返回的数据类型是ResponseEntityR r = restTemplate.getForObject(url, R.class, id);return r;
}

ResponseEntity<R> responseEntity = restTemplate.getForEntity(url, R.class);
R r = restTemplate.getForObject(url, R.class, id);

案例3:查询新闻列表  

对应的嵌套实体类:

@Data
public class NewsResult {private Integer code;private String msg;private NewsData result;
}@Data
public class NewsData {private List<NewsModel> list;
}@Data
public class NewsModel {private Long hotindex;private String word;
}

NewsController: 

// 查看新闻列表
@GetMapping("/list")
public R newsList(@RequestParam(value = "pageNum", defaultValue = "1") Integer pageNum,@RequestParam(value = "pageSize", defaultValue = "3") Integer pageSize) {// 查询新闻的信息// 新闻接口,有访问次数限制,所以,不能直接从第三方接口直接获取数据,要从Redis中查询List<NewsModel> list = newsService.queryList(pageNum, pageSize);return R.ok(list);
}@GetMapping("/sync")
public R syncNews() {// 查询远程接口 第三方数据,把查询结果存入本地Redis中newsService.syncNews();return R.ok();
}

NewsServiceImpl: 

@Service("newsService")
public class NewsServiceImpl extends ServiceImpl<NewsDao, News> implements NewsService {@Resourceprivate RestTemplate restTemplate;@Resourceprivate RedisTemplate<String, Object> redisTemplate;@Overridepublic List<NewsModel> syncNews() {String url = "https://apis.tianapi.com/toutiaohot/index?key=6892c7b76be5a14dd99473e400f44b48";// 改接口返回值是json数据,所以需要使用RestTemplate来获取数据NewsResult object = restTemplate.getForObject(url, NewsResult.class);List<NewsModel> list = object.getResult().getList();SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd");String t = simpleDateFormat.format(new Date());// news:day:20250116String key = String.format(RedisKeys.NewsDayList, t);Collection<Object> collection = new ArrayList<>(list);// 将新增列表数据存入Redis中redisTemplate.opsForList().rightPushAll(key, collection);// 设置过期时间redisTemplate.expire(key, 2, TimeUnit.HOURS);return list;}@Overridepublic List<NewsModel> queryList(Integer pageNum, Integer pageSize) {String key = String.format(RedisKeys.NewsDayList,new SimpleDateFormat("yyyyMMdd").format(new Date()));// 查询总条数Long total = redisTemplate.opsForList().size(key);// 页面起始位置int start = (pageNum - 1) * pageSize;List<NewsModel> list;if (total <= 0L) {// redis中没有数据,则调用接口同步数据list = syncNews();// total = (long) list.size();int end = Math.min(start + pageSize - 1, list.size() - 1);list = list.subList(start, end + 1);} else {int end = Math.min(start + pageSize - 1, total.intValue() - 1);// redis中有数据,则从redis中查询数据List<Object> objectList = redisTemplate.opsForList().range(key, start, end);list = objectList.stream().map(o -> (NewsModel) o).collect(Collectors.toList());}return list;}public static void main(String[] args) {ArrayList<String> list = new ArrayList<>();list.add("a");list.add("b");list.add("c");list.add("d");list.add("e");list.add("f");Integer pageNum = 2;Integer pageSize = 3;int start = (pageNum - 1) * pageSize;System.out.println("start:" + start);int end = Math.min(start + pageSize - 1, 50 - 1);System.out.println("end:" + end);List<String> subList = list.subList(start, end + 1);System.out.println(subList);}
}

POST请求

想要调用的接口:

@PostMapping("/save")
public R save(Dynamics dynamics) {dynamicsService.save(dynamics);return R.ok(dynamics);
}

编写代码调用接口:

// post请求
@GetMapping("/test3")
public R test3() {String url = "http://127.0.0.1:8080/dynamics/save";// 参数MultiValueMap<String, Object> map = new LinkedMultiValueMap<>();map.add("content", "新闻动态1");map.add("likenum", 4);map.add("uid", 9);map.add("type", 1);// 设置headerHttpHeaders headers = new HttpHeaders();headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);// 设置request对象HttpEntity<MultiValueMap<String, Object>> request = new HttpEntity<>(map, headers);ResponseEntity<R> rResponseEntity = restTemplate.postForEntity(url, request, R.class);return rResponseEntity.getBody();
}

新增数据成功: 

PUT请求

想要调用的接口:

@PutMapping("/update")
public R update2(Dynamics dynamics) {dynamicsService.updateById(dynamics);return R.ok(dynamics);
}

编写代码调用接口:

// put请求
@GetMapping("/test4")
public R test4() {String url = "http://127.0.0.1:8080/dynamics/update";// 参数MultiValueMap<String, Object> map = new LinkedMultiValueMap<>();map.add("id", 13);map.add("content", "美好时光海苔");map.add("likenum", 20);restTemplate.put(url, map);return R.ok();
}

修改数据成功: 

DELETE请求

想要调用的接口:

@DeleteMapping("/del/{id}")
public R deleteById(@PathVariable Integer id) {dynamicsService.removeById(id);return R.ok();
}

编写代码调用接口:

// delete请求
@GetMapping("/test5")
public R test5() {String url = "http://127.0.0.1:8080/dynamics/del/{0}";restTemplate.delete(url, 16);return R.ok();
}

修改数据成功: 

通用

// 通用
@GetMapping("/test6")
public R test6() {String url = "http://127.0.0.1:8080/dynamics/save";MultiValueMap<String, Object> map = new LinkedMultiValueMap<>();// 参数,相当于一个表达提交map.add("content", "新闻动态2");map.add("likenum", 8);map.add("uid", 9);map.add("type", 1);// 设置headerHttpHeaders headers = new HttpHeaders();String token = TokenUtil.generateToken("13");headers.add(TokenUtil.Server_Token_Key, token);// 表单提交的请求headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);// request对象HttpEntity<MultiValueMap<String, Object>> request = new HttpEntity<>(map, headers);ResponseEntity<R> response = restTemplate.exchange(url, HttpMethod.POST, request, R.class);return response.getBody();
}

传json参数

想要调用的接口:

@PostMapping
public R insert(@RequestBody Dynamics dynamics) {return R.ok(this.dynamicsService.save(dynamics));
}

定义一个VO: 

@Data
public class DynamicVo {private Integer uid;private String content;private Integer likenum;private Integer type;
}

编写代码调用接口:

@GetMapping("/test7")
public R test7() {String url = "http://127.0.0.1:8080/dynamics";DynamicVo dynamicVo = new DynamicVo();dynamicVo.setContent("新闻动态3");dynamicVo.setLikenum(10);dynamicVo.setUid(9);dynamicVo.setType(1);// 设置表单提交的方式HttpHeaders headers = new HttpHeaders();headers.setContentType(MediaType.APPLICATION_JSON);HttpEntity<DynamicVo> request = new HttpEntity<>(dynamicVo, headers);return restTemplate.postForObject(url, request, R.class);
}

接口调用成功: 


http://www.ppmy.cn/news/1564583.html

相关文章

npm配置electron专属的淘宝镜像进行安装

nodejs的版本是22.13 npm配置electron专用的淘宝镜像&#xff0c;不配置会下载很慢 npm config edit在打开的文本编辑框里&#xff0c;在最下面空白的地方填写下面的信息 registryhttps://registry.npmmirror.com electron_mirrorhttps://cdn.npmmirror.com/binaries/electr…

【王树森搜索引擎技术】概要04:搜索引擎的链路(查询词处理、召回、排序)

搜素引擎的链路 分为查询词处理&#xff0c;召回&#xff0c;排序 查询词处理 分词 分词&#xff1a;冬季卫衣推荐 -> 冬季 / 卫衣 / 推荐为什么要做分词&#xff1a;文本召回根据词在倒排索引中检索文档倒排索引的 key 大多是 冬季&#xff0c;卫衣&#xff0c; 推荐这…

解决CSS中样式的优先级问题

在CSS中&#xff0c;有以下几种方式来确定优先级&#xff1a; 内联样式 - 直接在HTML元素的 style 属性中写样式&#xff0c;它的优先级是最高的。例如 <p style"color: red;">这是一段红色文字</p> 。 ID选择器 - 当在CSS中使用 #id 选择器来定…

深入剖析 Redis 过期删除策略

深入剖析 Redis 过期删除策略 在当今大数据和高并发的时代&#xff0c;缓存技术对于提升系统性能至关重要&#xff0c;而 Redis 作为一款广泛使用的高性能键值对存储数据库&#xff0c;其过期删除策略更是其中的关键一环。今天&#xff0c;就来和大家深入探讨一下 Redis 过期删…

集群内SSH免密登录及批处理

集群内SSH免密登录及批处理 一、背景二、操作步骤&#xff08;默认在主节点操作&#xff09;1. 为 root 用户设置密码并允许SSH登录&#xff08;在**每台主机**上操作&#xff09;2. 在主节点安装 pdsh&#xff0c;用于批量执行命令3. 创建集群主机列表4. 编写自动生成SSH密钥的…

深度学习学习笔记(第30周)

一、摘要 本周报的目的在于汇报第30周的学习成果&#xff0c;本周主要聚焦于基于深度学习的图像分割领域的常用模型U-net。   U-net是最常用、最简单的一种分割模型&#xff0c;在2015年被提出。UNet网络是一种用于图像分割的卷积神经网络&#xff0c;其特点是采用了U型网络…

解决Spring Boot中Druid连接池“discard long time none received connection“警告

在使用Spring Boot结合Druid连接池时&#xff0c;开发者可能会遇到"discard long time none received connection"的警告信息。虽然这通常不会影响应用程序的正常运行&#xff0c;但这些警告信息可能会让人感到困扰。本文将探讨这个问题的原因&#xff0c;并提供几种…

vue 前端优化性能优化方法

1.列表使用唯一 key v-for"item in activeList" :key"item.id"原因是不使用 key 或者列表的 index 作为 key 的时候&#xff0c;每个元素对应的位置关系都是 index&#xff0c;直接导致我们插入的元素到后面的全部元素&#xff0c;对应的位置关系都发生了变…