远程接口调用

ops/2025/1/20 4:25:47/

目录

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/ops/151567.html

相关文章

周末总结(2024/01/18)

工作 人际关系核心实践&#xff1a; 要学会随时回应别人的善意&#xff0c;执行时间控制在5分钟以内 坚持每天早会打招呼 遇到接不住的话题时拉低自己&#xff0c;抬高别人(无阴阳气息) 朋友圈点赞控制在5min以内&#xff0c;职场社交不要放在5min以外 职场的人际关系在面对利…

SpringBoot中Get请求和POST请求接收参数详解

1、Get请求 1.1 方法形参接收参数 这种方式一般适用参数比较少的情况&#xff0c;并且前后端参数名称必须保持一致 RestController RequestMapping(“/user”) Slf4j public class DemoController { GetMapping("/query") public void getStudent(String name,Strin…

CentOS 9 Stream 上安装飞书客户端

要在 CentOS 9 Stream 上安装飞书客户端&#xff0c;你可以通过以下步骤来实现&#xff1a; 步骤 1: 下载飞书的 Linux 客户端 飞书客户端没有直接在官方仓库中提供 CentOS 版本的软件包&#xff0c;但你可以从飞书官方网站下载 Linux 客户端。 打开浏览器&#xff0c;访问飞…

信安大赛-应急响应

Ubuntu应急响应 1 提交攻击者的IP地址 2 识别攻击者使用的操作系统 3 找出攻击者资产收集所使用的平台 4 提交攻击者目录扫描所使用的工具名称 5 提交攻击者首次攻击成功的时间&#xff0c;格式&#xff1a;DD /MM/YY:HH:MM:SS 6 找到攻击者写入的恶意后门文件&…

今天你学C++了吗?——C++中的STL

♥♥♥~~~~~~欢迎光临知星小度博客空间~~~~~~♥♥♥ ♥♥♥零星地变得优秀~也能拼凑出星河~♥♥♥ ♥♥♥我们一起努力成为更好的自己~♥♥♥ ♥♥♥如果这一篇博客对你有帮助~别忘了点赞分享哦~♥♥♥ ♥♥♥如果有什么问题可以评论区留言或者私信我哦~♥♥♥ ✨✨✨✨✨✨ 个…

AI 音频工具合集

&#x1f423;个人主页 可惜已不在 &#x1f424;这篇在这个专栏AI_可惜已不在的博客-CSDN博客 &#x1f425;有用的话就留下一个三连吧&#x1f63c; 目录 前言: 正文: ​ 前言: 在科技蓬勃发展的时代&#xff0c;AI 音频工具宛如璀璨之星闪耀登场。它是声音的魔法师&a…

如何通过 Apache Airflow 将数据导入 Elasticsearch

作者&#xff1a;来自 Elastic Andre Luiz 了解如何通过 Apache Airflow 将数据导入 Elasticsearch。 Apache Airflow Apache Airflow 是一个旨在创建、安排&#xff08;schedule&#xff09;和监控工作流的平台。它用于编排 ETL&#xff08;Extract-Transform-Load&#xff0…

C++-第三章:模板初阶

目录 第一节&#xff1a;模板是什么 第二节&#xff1a;函数模板 2-1.使用场景 2-2.使用方法 2-3.模板原理 2-4.使用细节 第三节&#xff1a;类模板 3-1.使用场景 3-2.使用方法 3-3.类模板中成员函数的声明与定义分离 3-4.使用细节 第一节&#xff1a;模板是什么 现实生活中…