Ajax向后台传数据,利用JSON格式(Request payload)和默认格式(formData)的区别

本文详细解析了Ajax在前后端数据交互中使用formData与RequestPayload的区别,以及如何正确设置contentType属性。通过实例说明了如何在不同情况下选择合适的数据传输方式,并强调了在后台获取数据时的注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这是写的时候遇到的坑,看了各种资料,虽然云里雾里的,但是能用。具体的原理还待后面的研究。写在这防止自己忘记。

在前台向后台利用Ajax传数据的时候。有formData(ajax默认的)和Request payload还有其他的类型。具体的差别可以去查。大概意思就是一般表单用的就是formData。JSON格式数据是request payload。

 二者区别在于:对于后台来说FormData中是键值对。在后台可以利用request.getParameter("data")来获取到后面的那些值,因为在Request中会自动转化Form Data为key:value。而Request payload却不可以,因为是JSON格式,Reuqest中不存在该键值对。

2:在Ajax中向后台传数据的时候:可以自行的选择利用那种方式:如下:

有json数组employees。我们需要将这个值传到后台。

1:利用一般方式formData:该方式需要将上面的contentType: 'application/json'注释掉,不注释掉的意思就是利用JSON(request payload)格式传输。然后data部分的值为data:{'data':JSON.stringify(employees)}。其中有引号的‘data’是自定义的键,也就是后台request.getParaml(”data")中的data,JSON.stringify(employees)就是值,是要传的数据,意思是将数组序列化为字符串。

在后台利用获取该值:

2:利用Request payload:这种方法意思就是我直接传一个JSON对象给后台。后台不会把JSON对象自动转化为键值对存放在Request中等你来取,需要自己转。

这种方式data部分需要改变,只利用JSON字符串即可,但是后面需要加上contentType.告诉http传输的是JSON对象。

后台获取数据: 

后台获取JSON一定要加@RequestBody,后面的类型为自定义的,如果前台传来的是你的某一个bean,如User,那么后面为User user也可以。(上面图中注释:将JSON转化为JSON有误,为将JSON字符串转化为JSON)。

重要:如果Ajax中是data:{key:value},一定不能加contextType:application/json。如果是data:JSON字符串,一定要加。并且在后台中,request和@RequestBody不能同时存在,因为前者是formData传输,后面是request payload传输。二者不能一起吧,这里不清楚,反正二者一起这里一直没有获取到值。为此才写了这个来记住一下。第一次写,加上学艺不精,有错还望各位指出改正,大家一起学习嘛。

### jQuery AJAX POST 提交数据在服务器端 Request 对象中的具体位置 当使用 `jQuery.ajax()` 方法以 POST 方式提交数据时,这些数据会根据请求的配置被放置到不同的地方。以下是详细的解析: #### 1. **默认情况下** 如果未指定特殊选项(如 `processData` `contentType`),则递给 `data` 参数的内容会被序列化为 URL 编码字符串,并作为请求体的一部分发送至服务器[^3]。这种情况下,在服务器端可以访问 `Request.Body` 或者框架特定的对象(例如 ASP.NET 的 `HttpContext.Request.Form`)来获取这些参数。 ```javascript $.ajax({ url: 'example.com/api', type: 'POST', data: { key1: 'value1', key2: 'value2' } }); ``` 上述代码中,`key1=value1&key2=value2` 将成为请求负载(request payload),并通常可以在服务端通过解析表单(form-data)的方式读取它。 #### 2. **自定义 Content-Type processData 设置** 如果有如下设置: - `processData: false`: 防止自动转换入的数据成查询字符串。 - `contentType: false`: 不设定 HTTP 请求头部字段 `Content-Type`。 这允许开发者手动控制如何构建请求主体以及其对应的 MIME 类型。比如上二进制文件或者 JSON 数据的时候就需要这样的灵活性[^2]。 对于这种情况下的文件上实例而言,由于采用了 `FormData` 构造函数创建了一个新的形式化的数据集,因此浏览器不会将其转化为统的 query string 形式的 body;而是保持原始格式直接输过去。此时应该依据实际使用的编程语言及其 web 库特性去定位相应的部分——一般也是位于 `request.body` 下面,不过可能需要用额外的方法提取 multipart/form-data 组件里的各个片段。 ```javascript var formData = new FormData(); formData.append('file', $('#uploadFile')[0].files[0]); $.ajax({ url: '/upload', type: 'POST', data: formData, processData: false, contentType: false }); ``` 在这种场景下,接收方需按照多部件编码(multipart encoding)的标准处理流程对待接收到的信息包。 #### 3. **JSON 格式数据提交** 假如希望送的是 JavaScript Object Notation(JSON)-style 的结构化资料,则应调整相应属性以便正确指示客户端服务端之间的协定: ```javascript $.ajax({ url: "/api", method: "POST", headers: {"Accept": "application/json", "Content-Type":"application/json"}, data: JSON.stringify({name:"John Doe"}) }) ``` 在此种情形之下,后端应当期待着从输入流里解码出 json 文本表示法所描述的消息实体。 综上所述,基于不同类型的荷载(payloads), 它们各自存放在 server-side request object 的确切部位有所差异. ### 示例代码展示 下面给出一段 PHP 脚本来演示如何捕获由 jquery 发起的不同种类 post requests 所携带过来的有效负荷(paylaods). ```php <?php if ($_SERVER['REQUEST_METHOD'] === 'POST') { if (!empty($_FILES)) { echo "Handling file upload."; $tmp_name = $_FILES["file"]["tmp_name"]; move_uploaded_file($tmp_name, "./uploads/" . basename($_FILES["file"]["name"])); } elseif (getallheaders()['Content-Type'] == 'application/json') { echo "Processing JSON Data"; $inputJSON = file_get_contents('php://input'); $input= json_decode( $inputJSON , TRUE ); //convert JSON into array foreach ($input as $key => $val){ echo "$key :$val<br>"; } }else{ echo "Standard Form Submission"; print_r($_POST); } } ?> ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值