为什么一定要使用formdata格式……很大原因是因为当时我犯蠢……

前端肯定是JS了,具体不写了,使用Postman测试,后端语言是Java,框架Spring Boot,使用IntelliJ IDEA

一、基本类型

例:

可以看到form-data只能传递键值对形式。

简单类型直接传递就可以了。

二、对象类型

Java代码:

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; class User {
String name;
int age; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
}
} @RestController
@RequestMapping(value={"/example"})
public class Example { @RequestMapping(value={"/user"})
public void objectType(User user) {
return;
} }

前端数据:

name: 'xiaoming'
age: 18

三、复杂情况

行吧……直接说我遇到的问题,接收一个对象和一个对象数组。

同时接收两个参数时不可能的(至少我没发现),首先要建一个对象包含这两个参数。

上代码…

public class CLS1 {
int id;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
/***********************/
public class CLS2 {
String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
/***********************/
import java.util.ArrayList; public class Wrapper {
CLS1 cls1;
ArrayList<CLS2> cls2List;
public CLS1 getCls1() {
return cls1;
}
public void setCls1(CLS1 cls1) {
this.cls1 = cls1;
}
public ArrayList<CLS2> getCls2List() {
return cls2List;
}
public void setCls2List(ArrayList<CLS2> cls2List) {
this.cls2List = cls2List;
}
}
/***********************/
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import java.util.ArrayList; @RestController
@RequestMapping(value={"/example"})
public class Example {
@RequestMapping(value={"/complex"})
public void complexType(Wrapper wrapper) {
CLS1 cls1 = wrapper.getCls1();
ArrayList<CLS2> cls2s = wrapper.getCls2List();
} }

重点在于前端的数据格式:

cls1.id: 233
cls2List[0].name: 'hello'
cls2List[1].name: 'world'

四、前端格式化工具类

前端手打肯定很麻烦,写了一个对象转formdata键值对的函数,自己试了下没什么问题,有没有bug就不知道了……

function objToFd(obj, form, name) {
const fd = form || new FormData() if (typeof obj !== 'object' || obj instanceof File) {
fd.append(name, obj)
return fd
} const keyName = name ? name + '.' : '' for (const prop in obj) {
// 判断是自己的属性 且不为空
if (prop != null && obj.hasOwnProperty(prop) && obj[prop] != null && obj[prop] !== '') {
const val = obj[prop]
if (val instanceof Array) {
// 如果是数组
val.map((item, index) => {
objToFd(item, fd, keyName + prop + '[' + index + ']')
})
} else {
objToFd(val, fd, keyName + prop)
}
}
} return fd
}

测试:

let data = {
k1: "k1-v",
k2: 345,
k3: {
k31: [1, 2, { k313: 'k313-v' }],
k32: {
k321: 'k321-v',
k322: true,
k323: ['con', 'ff']
}
},
k4: '',
k5: undefined,
k6: ['m', 'd', 'z', 'z']
} const fd = objToFd(data);
for (var pair of fd.entries()) {
console.log(pair[0] + ': ' + pair[1])
} /******* 输出 *******/
k1: k1-v
k2: 345
k3.k31[0]: 1
k3.k31[1]: 2
k3.k31[2].k313: k313-v
k3.k32.k321: k321-v
k3.k32.k322: true
k3.k32.k323[0]: con
k3.k32.k323[1]: ff
k6[0]: m
k6[1]: d
k6[2]: z
k6[3]: z

以上全是自己在网上查资料&瞎试出来了,不保证准确性。

使用FormData格式在前后端传递数据的更多相关文章

  1. 编码格式分类: 前后端传递数据的编码格式contentType

    urlencoded:form表单和ajax提交数据的默认编码格式 form-data:传文件 application/json:json格式数据 >>> 前后端分离 urlenco ...

  2. 前后端进行数据交互时候 要优先考虑json格式即简直对形式,[{}] 列表形式 等便于操作的数据结构

    前后端进行数据交互时候 要优先考虑json格式即简直对形式,[{}] 列表形式 等便于操作的数据结构

  3. 学习加密(四)spring boot 使用RSA+AES混合加密,前后端传递参数加解密

      学习加密(四)spring boot 使用RSA+AES混合加密,前后端传递参数加解密 技术标签: RSA  AES  RSA AES  混合加密  整合   前言:   为了提高安全性采用了RS ...

  4. 【开源.NET】 轻量级内容管理框架Grissom.CMS(第二篇前后端交互数据结构分析)

    这是 CMS 框架系列文章的第二篇,第一篇开源了该框架的代码和简要介绍了框架的目的.作用和思想,这篇主要解析如何把sql 转成标准 xml 配置文件和把前端post的增删改数据规范成方便后台解析的结构 ...

  5. 基于Ajax技术的前后端Json数据交互方式实现

    前言 使用浏览器访问网站是日常生活中必不可少的一件事情,当我们在浏览器地址栏中输入网址后会看到网站的内容,那么这个过程中发生了什么?下面简单介绍下浏览器访问网站过程. 第一步:浏览器向DNS服务器发起 ...

  6. spring boot 登录注册 demo (三) -- 前后端传递

    前端页面通过thymeleaf渲染 <dependency> <groupId>org.springframework.boot</groupId> <art ...

  7. vue+jquery使用FormData向后端传递数据和文件,express如何获取

    使用multiparty 模块 下载 cnpm install multiparty --save 前端代码: <template> <div class="add-are ...

  8. Django前后端交互&数据验证

    一.前端--->后端 1.form表单 <form method="post" action="/test/?a=1&b=2"> {% ...

  9. 使用axios向后端传递数据,后端接收不到?

    开始使用axios的时候,按照官网的例子请求后端接口,遇到了后端接收不到数据的情况. 翻看了文档也没找到解决方法.先来了解下基本的axios 想要使用axios,需要先安装 npm install a ...

随机推荐

  1. X of a Kind in a Deck of Cards LT914

    In a deck of cards, each card has an integer written on it. Return true if and only if you can choos ...

  2. hdu3307 欧拉函数

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3307 Description has only two Sentences Time Limit: 3 ...

  3. WCF系列_WCF如何选择不同的绑定

    内容转载自<WCF核心技术> 开发者不用直接操作信道范型,而是由WCF根据服务OperationContract来选择合适的信道范型.大多数信道范型都有无会话两种变体.有会话信道会在客户端 ...

  4. 获取当前最顶层的VC

    #pragma mark -  获取当前最顶层的ViewController - (UIViewController*)topVC:(UIViewController*)VC { if([VC isK ...

  5. STC项目风险分析

    一.引言 由于项目的实现具有不确定性,所以每个项目都是存在风险的. 项目实现过程中的复杂性以及项目内外许多变化的因素,都会造成项目实现过程中的风险. 如果不能对项目的风险进行很好的分析和管理,那么项目 ...

  6. 移动APP测试入手点

  7. Mac更改PHP默认目录

    在Mac上搭建了PHP服务器以后,默认的路径为/Library/WebServer/Documents下面,但这让人很不爽,我想修改到自己定义的路径下.经过好一番折腾,终于成功了. PHPEclips ...

  8. #2019-2020-4 《Java 程序设计》第八周总结

    2019-2020-4 <Java 程序设计>第八周知识总结 第15章:泛型与集合框架 一.泛型 1.泛型(Generics)是可以建立具有类型安全的集合框架,如链表.散列映射等数据结构: ...

  9. (PMP)解题技巧和典型题目分析(0903-3班)

    B.项目有依赖 D A A B B C B C D B A B B A B

  10. Vue控制路由滚动行为

    跳转路由时,要求跳转到指定路由的某个地方,可以使用scrollBehavior方法控制. 用法: scrollBehavior(to,from,savedPosition){   } scrollBe ...