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

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

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

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只会警告。

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

欢迎评论交流啊

目录
相关文章
|
3月前
|
存储 监控 安全
前端框架的数据驱动方式如何保证数据的安全性?
总之,前端框架的数据驱动方式需要综合运用多种手段来保证数据的安全性。从传输、存储、访问控制到防范攻击等各个方面进行全面考虑和实施,以确保用户数据的安全可靠。同时,不断加强安全管理和技术创新,以应对不断变化的安全挑战。
147 60
|
16天前
|
前端开发 Java Shell
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
121 20
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
30天前
|
前端开发 NoSQL Java
【Java若依框架】RuoYi-Vue的前端和后端配置步骤和启动步骤
本文介绍了如何配置和启动基于Java的若依(RuoYi)项目,涵盖后端和前端的详细步骤。首先,准备Redis、MySQL以及IDE(如Idea和VS)。接着,通过GitHub获取代码并导入到IDE中,执行必要的SQL文件和配置数据库密码。然后,启动Redis并进行相关配置。最后,按照前端配置步骤克隆前端代码库,打开终端执行命令完成前端配置。整个过程详细记录了每一步的操作,帮助开发者顺利部署若依项目。 如果你觉得有帮助,请点赞、关注和收藏,这将是我持续分享的动力!
320 1
|
2月前
|
开发框架 小程序 前端开发
圈子社交app前端+后端源码,uniapp社交兴趣圈子开发,框架php圈子小程序安装搭建
本文介绍了圈子社交APP的源码获取、分析与定制,PHP实现的圈子框架设计及代码编写,以及圈子小程序的安装搭建。涵盖环境配置、数据库设计、前后端开发与接口对接等内容,确保平台的安全性、性能和功能完整性。通过详细指导,帮助开发者快速搭建稳定可靠的圈子社交平台。
|
2月前
|
机器学习/深度学习 前端开发 算法
婚恋交友系统平台 相亲交友平台系统 婚恋交友系统APP 婚恋系统源码 婚恋交友平台开发流程 婚恋交友系统架构设计 婚恋交友系统前端/后端开发 婚恋交友系统匹配推荐算法优化
婚恋交友系统平台通过线上互动帮助单身男女找到合适伴侣,提供用户注册、个人资料填写、匹配推荐、实时聊天、社区互动等功能。开发流程包括需求分析、技术选型、系统架构设计、功能实现、测试优化和上线运维。匹配推荐算法优化是核心,通过用户行为数据分析和机器学习提高匹配准确性。
179 3
|
3月前
|
JavaScript API 开发工具
<大厂实战场景> ~ Flutter&鸿蒙next 解析后端返回的 HTML 数据详解
本文介绍了如何在 Flutter 中解析后端返回的 HTML 数据。首先解释了 HTML 解析的概念,然后详细介绍了使用 `http` 和 `html` 库的步骤,包括添加依赖、获取 HTML 数据、解析 HTML 内容和在 Flutter UI 中显示解析结果。通过具体的代码示例,展示了如何从 URL 获取 HTML 并提取特定信息,如链接列表。希望本文能帮助你在 Flutter 应用中更好地处理 HTML 数据。
157 1
|
4月前
|
监控 JavaScript 前端开发
前端的混合之路Meteor篇(六):发布订阅示例代码及如何将Meteor的响应数据映射到vue3的reactive系统
本文介绍了 Meteor 3.0 中的发布-订阅模型,详细讲解了如何在服务器端通过 `Meteor.publish` 发布数据,包括简单发布和自定义发布。客户端则通过 `Meteor.subscribe` 订阅数据,并使用 MiniMongo 实现实时数据同步。此外,还展示了如何在 Vue 3 中将 MiniMongo 的 `cursor` 转化为响应式数组,实现数据的自动更新。
|
4月前
|
JSON 分布式计算 前端开发
前端的全栈之路Meteor篇(七):轻量的NoSql分布式数据协议同步协议DDP深度剖析
本文深入探讨了DDP(Distributed Data Protocol)协议,这是一种在Meteor框架中广泛使用的发布/订阅协议,支持实时数据同步。文章详细介绍了DDP的主要特点、消息类型、协议流程及其在Meteor中的应用,包括实时数据同步、用户界面响应、分布式计算、多客户端协作和离线支持等。通过学习DDP,开发者可以构建响应迅速、适应性强的现代Web应用。
103 2
|
4月前
|
前端开发 小程序 Java
java基础:map遍历使用;java使用 Patten 和Matches 进行正则匹配;后端传到前端展示图片三种情况,并保存到手机
这篇文章介绍了Java中Map的遍历方法、使用Pattern和matches进行正则表达式匹配,以及后端向前端传输图片并保存到手机的三种情况。
50 1
|
3月前
|
JSON Dart 数据格式
<大厂实战场景> ~ flutter&鸿蒙next处理后端返回来的数据的转义问题
在 Flutter 应用开发中,处理后端返回的数据是常见任务,尤其涉及转义字符时。本文详细探讨了如何使用 Dart 的 `dart:convert` 库解析包含转义字符的 JSON 数据,并提供了示例代码和常见问题的解决方案,帮助开发者有效处理数据转义问题。
194 0

热门文章

最新文章

  • 1
    微信小程序与Java后端实现微信授权登录功能
  • 2
    【04】Java+若依+vue.js技术栈实现钱包积分管理系统项目-若依框架二次开发准备工作-以及建立初步后端目录菜单列-优雅草卓伊凡商业项目实战
  • 3
    【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
  • 4
    【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
  • 5
    【05】flutter完成注册页面完善样式bug-增加自定义可复用组件widgets-严格规划文件和目录结构-规范入口文件-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
  • 6
    详解智能编码在前端研发的创新应用
  • 7
    巧用通义灵码,提升前端研发效率
  • 8
    智能编码在前端研发的创新应用
  • 9
    【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
  • 10
    【07】flutter完成主页-完成底部菜单栏并且做自定义组件-完整短视频仿抖音上下滑动页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
  • 1
    以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
    29
  • 2
    大前端之前端开发接口测试工具postman的使用方法-简单get接口请求测试的使用方法-简单教学一看就会-以实际例子来说明-优雅草卓伊凡
    51
  • 3
    【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
    26
  • 4
    巧用通义灵码,提升前端研发效率
    93
  • 5
    【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
    141
  • 6
    详解智能编码在前端研发的创新应用
    96
  • 7
    智能编码在前端研发的创新应用
    83
  • 8
    【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
    37
  • 9
    【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
    121
  • 10
    【07】flutter完成主页-完成底部菜单栏并且做自定义组件-完整短视频仿抖音上下滑动页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
    75