目录
在服务端使用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);
}
接口调用成功: