1.引言
随着互联网技术的快速发展,前后端分离的架构模式逐渐成为主流。在这种模式下,前端负责用户界面和用户体验,而后端则专注于业务逻辑和数据处理。数据传输作为连接前后端的关键环节,其重要性不言而喻。因为我也在实际开发中参与前后端分离的项目,所以搜集了相关资料写一篇整理的文档来帮助更好理解数据传输在前后端分离过程中的具体实现。
2.数据传输格式
Json
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。JSON 的优势在于其简洁、易读且跨语言支持。这也是本人最常见和最多用的数据传输格式。
{
"name": "John Doe",
"age": 30,
"email": "john.doe@example.com"
}
XML
XML(eXtensible Markup Language)是一种标记语言,用于存储和传输数据。XML 的优势在于其结构化和可扩展性,适用于复杂的数据模型。
<person>
<name>John Doe</name>
<age>30</age>
<email>john.doe@example.com</email>
</person>
URL
统一资源定位系统URL(uniform resource locator;URL)是因特网的万维网服务程序上用于指定信息位置的表示方法。这个方式历史悠久,就是最常见的写在url请求?后面跟着的一堆key-value值,也有更具动态路径生成的数据,不过这个确实快,就是安全性不是很高。
https://sensearch.baidu.com//sensearch/collection/item/check?fanyi_src=helloworld&direction=en2zh&cb=jsonp_1733711605406_81039
//常见的get请求体
以上就是本菜在日常开发中经常接触到的数据传输格式,其实关于数据格式的种类还有很多,有兴趣的可以去百度学习并且可以试试在Postman中测试测试,这样对数据的理解会深很多。一般在前后端分离的项目中,json主要是用来前后端传输,前端传输给后端来获取信息来写service,后端传递给前端信息用于渲染,一些简单的就直接根据get请求体传输。
在实际开发中的应用
在spring项目中,可以通过注解来实现数据格式的转换,当然也可以手写,原理都是一样的,从前端获取json格式的字符串解析,基本上一个道理,都用spring已经写好的工具类其实问题也不大。以下是常见的一些用于前后端数据传输的注解。
@RequestParam
这个注解@RequestParam (org.springframework.web.bind.annotation.RequestParam)是用于将指定的请求参数赋值给方法中的形参。通俗点,就是后端获取前端传入的数据。
参数
String value:请求中传入参数的名称,如果不设置value值,则会默认为该变量名。
String name:等价与value,和value无本质上的差异,两个属性指定其一即可。
boolean required:是否必需,默认为 true,即 请求中必须包含该参数,如果没有包含,将会抛出异常(可选配置)
String defaultValue:参数的默认值,如果请求中没有同名的参数时,该变量默认为此值。
使用
获取url中的数据
@GetMapping("/user")
public String user(@RequestParam(value = "name") String name) {
return name;
//通过配置value来获取前端传入的字段名,赋值给后面的String name
}
URL 上存在多个指定的 KEY
@GetMapping("/list")
public String list(@RequestParam(value = "name") List<String> names) {
return names.toString();
//通过List遍历实现多个值的存取
}
使用map接受
@GetMapping("/map")
public String map(@RequestParam Map<String, Object> map) {
return map.toString();
}
其实就是将原来url请求体中?后面一堆的key-value存取到map中再进行存取。
需要注意一点,map是不允许重复值的,一个key只存在唯一的value,如果想一个key存取多个value,可以通过MultiValueMap实现。
接受文件
@GetMapping("/file")
public String multipart(@RequestParam(value = "file") MultipartFile file) {
return file.getOriginalFilename();
}
接收多个文件
@GetMapping("/multi_file")
public String multipart(@RequestParam(value = "file") List<MultipartFile> files) {
return files.stream().map(MultipartFile::getOriginalFilename).collect(Collectors.joining(","));
}
@PathVariable
区别
@RequestParam和@PathVariable都能够完成类似的功能——因为本质上,它们都是用户的输入,只不过输入的部分不同,一个在URL路径部分,另一个在参数部分。要访问一篇博客文章,这两种URL设计都是可以的:
通过@PathVariable,例如/blogs/1
通过@RequestParam,例如blogs?blogId=1
那么究竟应该选择哪一种呢?建议:1、当URL指向的是某一具体业务资源(或资源列表),例如博客,用户时,使用@PathVariable
2、当URL需要对资源或者资源列表进行过滤,筛选时,用@RequestParam
例如我们会这样设计URL:
/blogs/{blogId}
/blogs?state=publish而不是/blogs/state/publish来表示处于发布状态的博客文章
使用
@ResponseBody
@GetMapping("/PathVariable/{name}/{age}")
public Map test(@PathVariable("name") String name,@PathVariable("age") Integer age){
Map map=new HashMap();
map.put("name",name);
map.put("age",age);
return map;
}
应用时,在@RequestMapping请求路径中,将需要传递的参数用花括号{}括起来,然后,通过@PathVariable(“参数名称”)获取URL中对应的参数值。如果@PathVariable标明参数名称,则参数名称必须和URL中参数名称一致。