一、前后端
前端:不仅仅是指客户端,app,小程序,还指两个后端服务之间的调用方
后端:被调用方
json:是前后端约定好的一种数据传输规范。
1,json的可视化。
2,json也是面向对象的,而且js天生就支持json
二、API篇
1、java接口:interface关键字。
2、http接口:和语言没有关系了,他是一种用http协议去通信。
5元组:源IP地址,源端口号,目的ip地址,目的端口号,通信协议(tcp协议)http协议
tcp协议:传输层协议就两个:一个tcp一个udp
http协议:三次握手,在用tcp去传输数据,然后4次挥手,http协议结束。
3、前后端交互无非就是,前端将数据告诉后端,后端执行一些操作,将数据返回给前端。
2.1、接口演示
1、创建springboot项目,使用postman来测试restful风格的接口
Restful 风格的请求是使用 “url+请求方式” 表示一次请求目的的,HTTP 协议里面四个表示操作方式的动词如下:
- GET:用于获取资源
- POST:用于新建资源
- PUT:用于更新资源
- DELETE:用于删除资源
例如:
- /user/1 GET : 得到 id = 1 的 user
- /user/1 DELETE: 删除 id = 1 的 user
- /user/1 PUT: 更新 id = 1 的 user
- /user POST: 新增 user
缺点:接口都是一个,统计的时候不好统计
import org.springframework.web.bind.annotation.*;
/**
* 订单控制器
*
* @author yunyan
* @date 2023/5/22
*/
@RestController
@RequestMapping("/order")
public class OrderController {
@GetMapping
public String get(){
return "get";
}
@PostMapping
public String post(){
return "post";
}
@PutMapping
public String put(){
return "put";
}
@DeleteMapping
public String delete(){
return "delete";
}
}
结果是如下所示,restful是通过请求方式区分接口
①get请求
②post请求
③put请求
④delete请求
2.2、参数获取
2.2.1、java方法入参里没有注释
适用于:参数比较少的时候
缺点:请求参数比较多的时候,可能会丢参数,因为get请求有长度限制。
import org.springframework.web.bind.annotation.*;
/**
* 订单控制器
*
* @author yunyan
* @date 2023/5/22
*/
@RestController
@RequestMapping("/order")
public class OrderController {
@GetMapping("/get-order")
public String get(Order order){
return order.toString();
}
@PostMapping
public String post(){
return "post";
}
}
使用postman测试结果是:
2.2.2、不使用?和&来拼接参数
@PathVariable注释作用是获取GetMapping中的参数
适用于:参数比较少,并且是单独的参数
还适用于动态接口,主要是为了统计不同的调用方式,看是哪一方调用的
@GetMapping("/{channel}get-order/{orderNo}/{orderName}")
public String get1(@PathVariable("orderNo") String orderNo,@PathVariable("orderName")String orderName,@PathVariable("channel") String channel){
System.out.println(channel);
return orderNo+orderName;
}
结果是:
动态接口:
这是控制台打印出来的拿到的参数
2.2.3、@RequestBody注解
这个注解会从http请求的body当中拿到json,并且反序列化成java对象
适用于请求参数非常多,body没有长度限制
@PostMapping
public String post(@RequestBody Order order){
return order.toString();
}
结果是:(属性要一一对应)
2.2.4、获取数组类型的参数
Controller中的业务方法数组名称与请求参数的name一致,参数值会自动映射匹配
@RequestMapping("/order")
@ResponseBody
public void orderMethod(String[] strs) throws IOException {
System.out.println(Arrays.asList(strs));
}
2.2.5、参数绑定注解 @requestParam
当请求的参数名称与Controller的业务方法参数名称不一致时,就需要通过@RequestParam注解显示的绑定
< form action= " ${ pageContext.request.contextPath } /order" method= "post" >
< input type= "text" name= "name" ></br >
< input type= "submit" value= " 提交 " ></br >
</ form >
@RequestMapping("/order")
@ResponseBody
public void orderMethod(@RequestParam("name") String username) throws
IOException {
System.out.println(username);
}
注解@RequestParam还有如下参数可以使用:
- value:与请求参数名称
- required:此在指定的请求参数是否必须包括,默认是true,提交时如果没有此参数则报错
- defaultValue:当没有指定请求参数时,则使用指定的默认值赋值
@RequestMapping("/order")
@ResponseBody
public void orderMethod(@RequestParam(value="name",required =
false,defaultValue = "hello") String username) throws IOException {
System.out.println(username);
}
2.2.6、通过Servlet相关API
SpringMVC支持使用原始ServletAPI对象作为控制器方法的参数进行注入,常用的对象如下:
- HttpServletRequest
- HttpServletResponse
- HttpSession
@RequestMapping("/order")
@ResponseBody
public void orderMethod(HttpServletRequest request,HttpServletResponse response,HttpSession session){
System.out.println(request);
System.out.println(response);
System.out.println(session);
}
2.3、注意事项
在参数获取前三种常用方式中:
1,第一种方式中,如果参数重复了,取哪个?
答:如果是String类型的,会自动拼接,如果是整型,取第一个
2,第三种方式中,如果参数重复了,取哪个?
答:不管什么类型的,都取最后一个
3,第二种方式中,如何改成非必传
答:一个java方法,可以对应多个http接口
使用@Pathvariable(value = "name", required = false)来保证参数是否必填
4,第三种方式中,我想解析list怎么写,想解析嵌套对象怎么写
答:可以,只要json对象构造的正确,就能够解析。
5,encode和decode:
当我使用第一种方式进行前后端交互的时候((url上面携带参数的这种),如果说参数中包含特殊字符,,比如说: ,; {} 我需要先对这个参数进行encode,后端接收到的参数是编码以后的,所以得decode才能使用。