远程接口调用

发布于:2025-02-10 ⋅ 阅读:(46) ⋅ 点赞:(0)

目录

GET请求

案例1:

案例2: 

案例3:查询新闻列表  

POST请求

PUT请求

DELETE请求

通用

传json参数


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

GET请求

要调用的接口是Get请求:

代码实现: 

案例1:

@RestController
@RequestMapping("/news")
public class NewsController {
    /**
     * 服务对象
     */
    @Resource
    private 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";
        // 返回的数据类型是ResponseEntity
        ResponseEntity<R> responseEntity = restTemplate.getForEntity(url, R.class);
        // 获取body
        R body = responseEntity.getBody();
        // 获取header
        HttpHeaders 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);
    }
    
    @Bean
    public 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}";
    // 返回的数据类型是ResponseEntity
    R 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 {

    @Resource
    private RestTemplate restTemplate;

    @Resource
    private RedisTemplate<String, Object> redisTemplate;

    @Override
    public 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:20250116
        String 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;
    }

    @Override
    public 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);
    // 设置header
    HttpHeaders 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);
    // 设置header
    HttpHeaders 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);
}

接口调用成功: 


网站公告

今日签到

点亮在社区的每一天
去签到