RequestPayload和Formdata

本文探讨了使用Fetch API与传统Ajax在发送POST请求时的区别,特别是关于表单数据提交方式的变化,包括formdata与requestpayload的概念及其在服务器端的处理方式。

今天使用fecth做异步的服务获取,调用方法如下

  return xFetch('/api/common/getsearchowner.json',{body: JSON.stringify(para),method:'POST'});

查看前台发出的request如下

POST /api/common/getsearchowner.json HTTP/1.1
Host: localhost:8989
Connection: keep-alive
Content-Length: 11
Pragma: no-cache
Cache-Control: no-cache
authorization:
Origin: http://localhost:8989
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36
content-type: text/plain;charset=UTF-8
Accept: */*
Referer: http://localhost:8989/
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.8,en;q=0.6

且有一个request payload的值

{"aaa":111}

而以前使用ajax的时候似乎没有这个值,而是一个form data记录了post的值

csrftoken:1472039431885

formdata和requestpayload到底有什么区别呢、为什么用fecth的时候,提交的数据都变成了request payload?

对于get请求,表单参数以name=value&name1=value1的形式附到url的后面

对于post请求,表单参数是在请求体中,也是以name=value&name1=value1的形式在请求体中,并且post请求的Content-Type为application/x-www-form-urlencoded,参数是在请求体中,即请求中的Form Data。在servlet中,可以通过request.getParameter(name)的形式来获取表单参数。

但是如果是原生的ajax请求,请求的Content-Type为text/plain;charset=UTF-8,而请求表单参数在RequestPayload中。此时的POST请求是不会读取请求体数据和进行相应的参数处理的,即不会解析表单数据来放到request parameter map中。所以通过request.getParameter(name)是获取不到的。此时servelet中只能用解析流的解析

为什么原生的ajax后者fetch不能获取form data呢?

jquery在执行post请求时,会设置Content-Type为application/x-www-form-urlencoded,所以服务器能够正确解析,而使用原生ajax请求时,如果不显示的设置Content-Type,那么默认是text/plain,这时服务器就不知道怎么解析数据了,所以才只能通过获取原始数据流的方式来进行解析请求数据。

解决方案是什么呢?可以再请求的时候增加

headers: {'Content-Type': 'application/x-www-form-urlencoded'}

参考文档:http://stackoverflow.com/questions/10494574/what-is-the-difference-between-form-data-and-request-payload

http://blog.youkuaiyun.com/mhmyqn/article/details/25561535

转载于:https://my.oschina.net/zimingforever/blog/737414

<think>我们正在讨论如何发送JSON格式的请求体(payload)而不是表单数据(form data)。根据用户上一次的问题我的回答,用户已经知道使用jQuery发送JSON数据的方法,现在用户的问题更偏向于一般性的HTTP请求(不限于jQuery)如何发送对象格式的请求体。 关键点: 1. 使用正确的Content-Type头(application/json) 2. 将JavaScript对象序列化为JSON字符串 3. 在请求体中发送这个字符串 由于用户提到“不是使用Form Data”,所以我们需要避免使用multipart/form-data或application/x-www-form-urlencoded。 我们可以使用原生JavaScript(Fetch API)jQuery两种方式来说明。 参考用户提供的引用: 引用[1]提到了创建HTTP请求FormData,但用户不想用FormData,所以我们可以忽略。 引用[2]是关于隐私数据模型的,与当前问题无关。 引用[3]是关于表单动作的,也与当前问题无关。 因此,我们主要根据用户上一次的问题(使用jQuery发送JSON)以及更通用的方法(使用Fetch API)来回答。 回答结构: 1. 使用Fetch API发送JSON格式的请求体 2. 使用jQuery发送JSON(作为复习) 3. 服务器端如何处理(简要) 同时,生成相关问题。</think>### 在 HTTP 请求中发送对象格式的请求体(Payload) 在 HTTP 请求中发送对象格式的请求体(而非 Form Data)需要正确设置请求头序列化数据。以下是关键步骤实现方法: #### 核心实现步骤 1. **设置请求头** 必须指定 `Content-Type: application/json` 头,告知服务器请求体是 JSON 格式[^1]。 2. **数据序列化** 使用 `JSON.stringify()` 将 JavaScript 对象转换为 JSON 字符串: ```javascript const payload = { username: "john_doe", preferences: { theme: "dark" } }; const jsonData = JSON.stringify(payload); ``` 3. **选择请求方法** 推荐使用 POST/PUT/PATCH 方法发送 JSON 数据(GET 请求不支持请求体)。 #### 实现方式示例 ##### 原生 Fetch API ```javascript fetch('https://api.example.com/user', { method: 'POST', headers: { 'Content-Type': 'application/json' // 关键头 }, body: JSON.stringify({ // 序列化对象 username: "john_doe", preferences: { theme: "dark" } }) }) .then(response => response.json()) .catch(error => console.error('Error:', error)); ``` ##### jQuery 实现 ```javascript $.ajax({ url: 'https://api.example.com/user', type: 'POST', contentType: 'application/json', // 声明 JSON 格式 processData: false, // 禁用 Form Data 转换 data: JSON.stringify({ // 手动序列化 username: "john_doe", preferences: { theme: "dark" } }), success: response => console.log(response) }); ``` ##### Axios 实现 ```javascript axios.post('https://api.example.com/user', { username: "john_doe", preferences: { theme: "dark" } }, { headers: { 'Content-Type': 'application/json' } // 显式设置头 }) .then(response => console.log(response)); ``` #### 服务器端处理 服务器需要解析原始请求体获取 JSON 数据: ```python # Python Flask 示例 from flask import request @app.route('/user', methods=['POST']) def handle_request(): json_data = request.get_json() # 自动解析 JSON username = json_data['username'] theme = json_data['preferences']['theme'] ``` #### 常见问题排查 1. **415 Unsupported Media Type** 服务器未收到 `Content-Type: application/json` 头[^1] 2. **400 Bad Request** JSON 格式错误(如缺少引号、括号不匹配) 3. **特殊字符处理** JSON 自动处理 Unicode 字符,无需手动编码 > 通过此方式可有效实现 RESTful API 交互,适用于复杂数据结构传输[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值