RestFul风格编程
一、RestFul
REST 风格:
提倡 URL 地址使用统一的风格设计,从前到后各个单词使用斜杠分开,不使用问号键值对方式携带请求参数,而是将要发送给服务器的数据作为 URL 地址的一部分,以保证整体风格的一致性。
四种基本操作:
- GET 用来获取资源
- POST 用来新建资源 add
- PUT 用来更新资源 update
- DELETE 用来删除资源。
1、调用请求
![](https://img2020.cnblogs.com/blog/2600280/202112/2600280-20211215193008286-2080598545.png)
2、编写调用方法
@RequestMapping("/{userName}/{year}")
@ResponseBody
public String checkChannel(@PathVariable("userName") String userName, @PathVariable("year") String year){
return userName+"_"+year;
}
二、RestTemplate
远程调用一个 HTTP 接口时,可以使用Spring框架提供的工具类: Spring 框架提供的一个工具类RestTemplate。
但是在 Spring 5 中已经不再建议使用 RestTemplate
1、常用方法
- getForObject --- optionsForAllow 分为一组,这类方法是常规的 Rest API(GET、POST、DELETE 等)方法调用;
通过 RestTemplate,我们可以非常方便的进行 Rest API 调用。
- exchange:接收一个
RequestEntity
参数,可以自己设置 HTTP method,URL,headers 和 body,返回 ResponseEntity; - execute:通过 callback 接口,可以对请求和返回做更加全面的自定义控制。
2、 接口调用
(1)普通接口调用
String defaultJsonResult = restTemplate.postForObject(ntpUrl,null, String.class);
JSONObject object = JSON.parseObject(defaultJsonResult);
JSONObject forObject = restTemplate.getForObject(ibs, JSONObject.class);
districts = (List<JSONObject>) forObject.get("districts");
JSONObject object = JSON.parseObject(JSON.toJSONString(districts.get(0)));
districts=(List<JSONObject>)object.get("districts");
String flagStr = restTemplate.postForObject(volunUrl, null, String.class);
JSONObject object = JSON.parseObject(flagStr);
boolean flag1 = (boolean) object.get("data");
Map<String, String> vars = Collections.singletonMap("hotel", "42");
// 通过 GET 方式调用,返回一个 String 值,还可以给 URL 变量设置值(也可通过 uriTemplateHandler 这个属性自定义)
String result = restTemplate.getForObject(
"https://example.com/hotels/{hotel}/rooms/{hotel}", String.class, vars);
String url = "http://127.0.0.1:8080/hello";
JSONObject param = new JSONObject();
//restTemplate 会根据 params 的具体类型,调用合适的 HttpMessageConvert 将请求参数写到请求体 body 中,并在请求头中添加合适的 content-type;
// 也会根据 responseType 的类型(本列子中是 JSONObject),设置 head 中的 accept 字段,当响应返回的时候再调用合适的 HttpMessageConvert 进行响应转换
ResponseEntity<JSONObject> responseEntity=restTemplate.postForEntity(url,params,JSONObject.class);
int statusCodeValue = responseEntity.getStatusCodeValue();
HttpHeaders headers = responseEntity.getHeaders();
JSONObject body = responseEntity.getBody();
(2)添加 Header 和 Cookie
UriComponents uriComponents = UriComponentsBuilder.fromHttpUrl("127.0.0.1:8080").
path("/test").build(true);
URI uri = uriComponents.toUri();
RequestEntity<JSONObject> requestEntity = RequestEntity.post(uri).
// 添加 cookie(这边有个问题,假如我们要设置 cookie 的生命周期,作用域等参数我们要怎么操作)
header(HttpHeaders.COOKIE,"key1=value1").
// 添加 header
header(("MyRequestHeader", "MyValue")
accept(MediaType.APPLICATION_JSON).
contentType(MediaType.APPLICATION_JSON).
body(requestParam);
ResponseEntity<JSONObject> responseEntity = restTemplate.exchange(requestEntity,JSONObject.class);
// 响应结果
JSONObject responseEntityBody = responseEntity.getBody();
(3)文件上传发送
public Object uplaod(@RequestBody JSONObject params) throws Exception{
final String url = "http://localhost:8888/hello/m3";
// 设置请求头
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.MULTIPART_FORM_DATA);
// 设置请求体,注意是 LinkedMultiValueMap
FileSystemResource resource1 = new FileSystemResource("D:\\dir1\\ss\\pic1.jpg");
FileSystemResource resource2 = new FileSystemResource("D:\\dir1\\ss\\pic2.jpg");
MultiValueMap<String, Object> form = new LinkedMultiValueMap<>();
form.add("file", resource1);
form.add("file", resource2);
form.add("param1","value1");
HttpEntity<MultiValueMap<String, Object>> files = new HttpEntity<>(form, headers);
JSONObject s = restTemplate.postForObject(url, files, JSONObject.class);
return s;
}
(4)文件上传接收
@RequestMapping("/m3")
public Object fileUpload(@RequestParam("file") MultipartFile[] files, HttpServletRequest request) throws Exception {
// 携带的其他参数可以使用 getParameter 方法接收
String param1 = request.getParameter("param1");
Response response = new Response();
if (files == null) {
response.failure("文件上传错误, 服务端未拿到上传的文件!");
return response;
}
for (MultipartFile file : files) {
if (!file.isEmpty() && file.getSize() > 0) {
String fileName = file.getOriginalFilename();
// 参考 FileCopyUtils 这个工具类
file.transferTo(new File("D:\\" + fileName));
logger.info("文件:{} 上传成功...",fileName);
}
}
response.success("文件上传成功");
return response;
}