前端后端数据传递的几种方式

简介: 前端后端数据传递的几种方式

记录一下前端不同形式传递数据,后端的接收的方式

1. form表单

<form action="/api/user/add" method="POST">
    <div class="form-group">
        <label for="name">name</label>
        <input type="text" class="form-control" name="name" id="name" placeholder="用户名">
    </div>
    <div class="form-group">
        <label for="age">age</label>
        <input type="text" class="form-control" name="age" id="age" placeholder="年龄">
    </div>
    <button type="submit" class="btn btn-default">提交</button>
</form>

设置action,method设置为post

设置的name和表单的输入值作为value组将成键值对

点击提交按钮

打开chrome浏览器,按f12进入开发者模式,可以看到请求头信息

post在请求头中包含Content-Type: application/x-www-form-urlencoded

可以看到数据是form Data形式

创建对应的实体类User ,成员和name属性对应

@Data//如果直接返回此类型需要加上getter 方法才能被序列化
public class User {
    private String name;
    private int age;
    private String avatar;
}

控制器

@Controller
@RequestMapping("/api/user")
public class UserController {
    @PostMapping("/add")
    @ResponseBody//返回json格式数据
    public User addUser(User user){
        System.out.println("request param1:"+user);
        return user;//这里仅把请求参数直接返回
    }
}

or

@Controller
@RequestMapping("/api/user")
public class UserController {
    @PostMapping("/add")
    @ResponseBody//数据以json格式返回
    public User addUser(String name,int age){
        System.out.println("request param1:"+user);
        return new User(name,age,null);//这里仅把请求参数直接返回
    }
}

如果是get请求

参数会像是这样在url上http://localhost:8080/api/user/add?name=%E5%BC%A0%E4%B8%89&age=12

汉字显示为编码后的样子

当需要自定义请求参数的名字时我们可以使用spring注解@RequestParam

@RequestMapping("/add")
@ResponseBody
public User addUser(@RequestParam("name") String username,
                    @RequestParam("age")int userage){
    System.out.println("request param1:"+username);
    System.out.println("request param2:"+userage);
    return new User(username,userage,null);
}

2. ajax & formdata

<form action="/api/user/add" method="POST">
        <div class="form-group">
            <label for="name">name</label>
            <input type="text" class="form-control" name="name" id="name" placeholder="用户名">
        </div>
        <div class="form-group">
            <label for="age">age</label>
            <input type="text" class="form-control" name="age" id="age" placeholder="年龄">
        </div>
        <button type="submit" class="btn btn-default">提交</button>
    </form>
    <script>
        $('button').click(function (e) {
            e.preventDefault();
            var fd = new FormData();
            fd.append("name",$('input[name=name]').val());
            fd.append("age",$('input[name=age]').val());
            console.log(fd.get('name'));
            console.log(fd.get('age'));
            $.ajax({
                url:"/api/user/add",
                data: fd,
                processData: false,
                contentType: false,//必须
                type: 'POST',
                success: function(data){
                    alert(data.name);
                }
            });
        });
    </script>

接收方式同上 使用对象或者对应的name作为参数

3. ajax json

$('button').click(function (e) {
            e.preventDefault();//阻止默认事件
           var user = {};
            var fd = new FormData();
            user.name = $('input[name=name]').val();
            user.age = $('input[name=age]').val();
            console.log(user);
            $.ajax({
                url:"/api/user/add",
                data: JSON.stringify(user),
                processData: false,
                contentType: 'application/json',
                type: 'POST',
                success: function(data){
                    alert(data.name);
                }
            });
        });

传递json格式字符串

我们手动设置contentType为'application/json' 此时查看请求,发现数据是这样的

@Controller
@RequestMapping("/api/user")
public class UserController {
    @RequestMapping("/add")
    @ResponseBody
    public User addUser(@RequestBody User user){ //对应实体类
        System.out.println("request param1:"+user);
        return user;
    }
}

后台接收数据使用@RequestBody注解,就能拿到数据

content-type为 application/json时必须用 @RequestBody否则不会进入后端控制器

而使用form-data时, 则必须不加@RequestBody

或者 ,你也可以使用String 类型,然后自己解析

@RequestMapping("/add")
@ResponseBody
public User addUser(@RequestBody String user){ //字符串
    ObjectMapper mapper = new ObjectMapper();
    User u = null;
    try {
        u = mapper.readValue(user, User.class);
    } catch (JsonProcessingException e) {
        e.printStackTrace();
    }
    System.out.println("request param1:"+u);
    return u;
}

4. path variable

请求地址:/api/app/123

参数: appid = 123

后端接口:

@GetMapping("/api/app/{appid}")
public String getApp(@PathVariable String appid){
  ...
}

参数中包含数组

<h1>用户注册</h1>
    <form action="/api/user/add" method="POST">
        <div class="form-group">
            <label for="name">name</label>
            <input type="text" class="form-control" name="name" id="name" placeholder="用户名">
        </div>
        <div class="form-group">
            <label for="age">age</label>
            <input type="text" class="form-control" name="age" id="age" placeholder="年龄">
        </div>
        <div class="form-group">
            <label for="age">friends</label>
            <div>
                周杰伦<input type="checkbox" class="form-control" value="周杰伦" name="friends">
            </div>
            <div>
                许嵩<input type="checkbox" class="form-control" value="许嵩" name="friends">
            </div>
            <div>
                筷子兄弟<input type="checkbox" class="form-control" value="筷子兄弟" name="friends">
            </div>
        </div>
        <button type="submit" class="btn btn-default">提交</button>
    </form>
    <script>
        $('button').click(function (e) {
            e.preventDefault();//阻止默认事件
            var user = {};
            var fd = new FormData();
            user.name = $('input[name=name]').val();
            user.age = $('input[name=age]').val();
            user.friends = [];
            $('input[type=checkbox]').each(function () {
                if($(this).is(':checked')){
                    user.friends.push($(this).val());
                }
            })
            //console.log(user);
            $.ajax({
                url:"/api/user/add",
                data: JSON.stringify(user),
                processData: false,
                contentType: 'application/json',
                type: 'POST',
                success: function(data){
                    alert(data.name);
                }
            });
        });
    </script>
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private String name;
    private int age;
    private String avatar;
    private List<String> friends;
}

新增friend属性,接收方式不变

参数校验:

添加hibernate-validator依赖

可以在请求实体内加验证注解

e.g

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Account {
    private String id;
    @NotNull
    @Length(max = 20)
    private String userName;
    @NotNull
    @Pattern(regexp = "[A-Z][a-z][0-9]")
    private String passWord;
    @DateTimeFormat(pattern = "yyy-MM-dd")
    private Date createTime;
    private String alias;
    @Max(10)
    @Min(1)
    private Integer level;
    private Integer vip;
}
 @PostMapping("/saveAccount")
    public Object saveAccount(@RequestBody @Valid Account account){
         accountService.saveAccount(account);
        return "保存成功";
}

当请求数据时form-data时,你的请求参数实体是不会为空的(即使前端不传, 对象字段为默认而已)所以不需要加判断

当请求数据时application/json 时,你的请求参数实体 也不用判断一下, 因为不添加body参数,是不会进控制器的,spring只会警告。

为了防止前端传一个空对象 {} 过来, 可以判断一下请求参数实体是否为空。

欢迎评论交流啊

目录
相关文章
|
5天前
|
JavaScript API 开发工具
<大厂实战场景> ~ Flutter&鸿蒙next 解析后端返回的 HTML 数据详解
本文介绍了如何在 Flutter 中解析后端返回的 HTML 数据。首先解释了 HTML 解析的概念,然后详细介绍了使用 `http` 和 `html` 库的步骤,包括添加依赖、获取 HTML 数据、解析 HTML 内容和在 Flutter UI 中显示解析结果。通过具体的代码示例,展示了如何从 URL 获取 HTML 并提取特定信息,如链接列表。希望本文能帮助你在 Flutter 应用中更好地处理 HTML 数据。
91 1
|
11天前
|
监控 JavaScript 前端开发
前端的混合之路Meteor篇(六):发布订阅示例代码及如何将Meteor的响应数据映射到vue3的reactive系统
本文介绍了 Meteor 3.0 中的发布-订阅模型,详细讲解了如何在服务器端通过 `Meteor.publish` 发布数据,包括简单发布和自定义发布。客户端则通过 `Meteor.subscribe` 订阅数据,并使用 MiniMongo 实现实时数据同步。此外,还展示了如何在 Vue 3 中将 MiniMongo 的 `cursor` 转化为响应式数组,实现数据的自动更新。
|
11天前
|
JSON 分布式计算 前端开发
前端的全栈之路Meteor篇(七):轻量的NoSql分布式数据协议同步协议DDP深度剖析
本文深入探讨了DDP(Distributed Data Protocol)协议,这是一种在Meteor框架中广泛使用的发布/订阅协议,支持实时数据同步。文章详细介绍了DDP的主要特点、消息类型、协议流程及其在Meteor中的应用,包括实时数据同步、用户界面响应、分布式计算、多客户端协作和离线支持等。通过学习DDP,开发者可以构建响应迅速、适应性强的现代Web应用。
|
24天前
|
JavaScript 前端开发 Python
django接收前端vue传输的formData图片数据
django接收前端vue传输的formData图片数据
23 4
|
23天前
|
前端开发 小程序 Java
java基础:map遍历使用;java使用 Patten 和Matches 进行正则匹配;后端传到前端展示图片三种情况,并保存到手机
这篇文章介绍了Java中Map的遍历方法、使用Pattern和matches进行正则表达式匹配,以及后端向前端传输图片并保存到手机的三种情况。
15 1
|
5天前
|
JSON Dart 数据格式
<大厂实战场景> ~ flutter&鸿蒙next处理后端返回来的数据的转义问题
在 Flutter 应用开发中,处理后端返回的数据是常见任务,尤其涉及转义字符时。本文详细探讨了如何使用 Dart 的 `dart:convert` 库解析包含转义字符的 JSON 数据,并提供了示例代码和常见问题的解决方案,帮助开发者有效处理数据转义问题。
95 0
|
30天前
|
JavaScript 前端开发
vue3教程,如何手动获取后端数据(入门到精通3,新人必学篇)
本文提供了一个Vue 3教程,讲解了如何使用axios库手动从后端获取数据,包括安装axios、配置后端访问地址、编写路由地址、发起HTTP请求以及在组件中读取和打印响应数据的步骤。
194 0
vue3教程,如何手动获取后端数据(入门到精通3,新人必学篇)
|
11天前
|
NoSQL 前端开发 MongoDB
前端的全栈之路Meteor篇(三):运行在浏览器端的NoSQL数据库副本-MiniMongo介绍及其前后端数据实时同步示例
MiniMongo 是 Meteor 框架中的客户端数据库组件,模拟了 MongoDB 的核心功能,允许前端开发者使用类似 MongoDB 的 API 进行数据操作。通过 Meteor 的数据同步机制,MiniMongo 与服务器端的 MongoDB 实现实时数据同步,确保数据一致性,支持发布/订阅模型和响应式数据源,适用于实时聊天、项目管理和协作工具等应用场景。
|
18天前
|
存储 前端开发 API
前端开发中,Web Storage的存储数据的方法localstorage和sessionStorage的使用及区别
前端开发中,Web Storage的存储数据的方法localstorage和sessionStorage的使用及区别
71 0
|
23天前
|
前端开发 JavaScript Java
导出excel的两个方式:前端vue+XLSX 导出excel,vue+后端POI 导出excel,并进行分析、比较
这篇文章介绍了使用前端Vue框架结合XLSX库和后端结合Apache POI库导出Excel文件的两种方法,并对比分析了它们的优缺点。
183 0