欢迎各位兄弟 发布技术文章
这里的技术是共享的
x-www-form-urlencoded 与form-data 区别,分别用在什么地方
x-www-form-urlencoded
和 form-data
是 HTTP 请求中常见的两种数据编码方式,主要用于表单提交或 API 请求。它们的核心区别在于数据格式和适用场景:
编码方式:
将表单数据编码为键值对(key=value
),用 &
连接,特殊字符会被 URL 编码(如空格变 %20
)。
例如:
plaintextname=John+Doe&age=30
HTTP 请求头:
httpContent-Type: application/x-www-form-urlencoded
特点:
数据是纯文本,体积较小(无冗余字符)。
不支持文件上传。
适合简单的文本数据(如登录表单、搜索框)。
典型场景:
提交纯文本表单(如用户名、密码)。
传统 AJAX 请求(非文件上传)。
URL 查询参数(如 ?key=value
)。
编码方式:
将数据分割为多个“部分”(parts),每部分用分隔符(boundary)隔开,可包含二进制数据(如文件)。
例如:
plaintext--boundary Content-Disposition: form-data; name="name" John Doe --boundary Content-Disposition: form-data; name="file"; filename="photo.jpg" Content-Type: image/jpeg [二进制文件数据] --boundary--
HTTP 请求头:
httpContent-Type: multipart/form-data; boundary=自定义分隔符
特点:
支持文件上传和二进制数据。
数据体积较大(因包含元数据和分隔符)。
每部分可单独定义数据类型(如 Content-Type: image/jpeg
)。
典型场景:
文件上传(如图片、文档)。
表单中包含混合类型数据(文本+文件)。
需要传输非 ASCII 或二进制数据的场景。
特性 | x-www-form-urlencoded | form-data |
---|---|---|
数据格式 | 键值对(URL 编码) | 多部分混合(含二进制) |
体积效率 | 更高效(无冗余分隔符) | 较低(因分隔符和元数据) |
文件支持 | ❌ 不支持 | ✅ 支持 |
适用场景 | 简单文本提交 | 文件上传或混合数据 |
用 x-www-form-urlencoded:
当仅需提交文本数据(如 JSON API、登录表单),且追求最小化请求体积时。
用 form-data:
当需要上传文件或表单中包含非文本数据(如图片、视频)时。
现代 API 设计:
RESTful API 通常直接使用 application/json
替代 x-www-form-urlencoded
,但浏览器表单默认不支持 JSON。
性能影响:form-data
因分隔符和二进制编码会有额外开销,适合必要场景(如文件上传)。
框架自动处理:
前端库(如 Axios)和后端框架(如 Express、Django)会自动根据数据类型选择编码方式,无需手动设置。
ajax 提交 json 数据 一般用什么格式
使用 AJAX 提交 JSON 数据 时,通常采用 application/json
作为 Content-Type
,并直接将 JavaScript 对象序列化成 JSON 字符串作为请求体。这种方式是现代 Web 开发中最常见、最清晰的 JSON 数据传输方式。
httpContent-Type: application/json
json{ "username": "john", "age": 25, "isAdmin": false }
javascriptfetch('https://api.example.com/users', { method: 'POST', headers: { 'Content-Type': 'application/json' // 关键头 }, body: JSON.stringify({ // 手动序列化对象 username: 'john', age: 25, isAdmin: false }) });
x-www-form-urlencoded
或 form-data
?
x-www-form-urlencoded
:
适用于简单的键值对(如 key1=value1&key2=value2
),但需要手动处理嵌套对象或数组,且无法直接传输 JSON 结构。
javascript// 不推荐:需要手动拼接字符串 body: 'username=john&age=25&isAdmin=false'
multipart/form-data
:
专为文件上传设计,携带二进制数据时会添加冗余的分隔符(boundary),完全不适合纯 JSON 数据。
主流后端框架(如 Node.js/Express、Django、Spring Boot)会自动解析 application/json
请求体,无需手动处理。
javascriptapp.post('/users', express.json(), (req, res) => { // 使用 express.json() 中间件 console.log(req.body); // 直接获取 JSON 对象 res.send('Data received'); });
pythonfrom django.http import JsonResponse import json def api_view(request): data = json.loads(request.body) # 手动解析 JSON return JsonResponse({"status": "success"})
兼容性:
所有现代浏览器和服务器均支持 application/json
(IE10+ 需确认,但推荐使用 Polyfill 或 Axios 等库)。
安全性:
比起 x-www-form-urlencoded
,JSON 更不易因 URL 编码问题导致数据错误(如特殊字符处理)。
调试工具:
Postman、curl 等工具可直接发送 application/json
请求,格式更直观。
场景 | 推荐格式 | 示例 Content-Type |
---|---|---|
AJAX 提交 JSON 数据 |
application/json
|
Content-Type: application/json
|
传统表单提交 |
x-www-form-urlencoded
|
Content-Type: application/x-www-form-urlencoded
|
文件上传 |
multipart/form-data
|
Content-Type: multipart/form-data
|
始终优先使用 application/json
传输结构化数据,除非受限于遗留系统或特殊需求。
postman 如何post提交 json 数据
在 Postman 中提交 JSON 数据 的步骤如下:
打开 Postman,在顶部选择 POST
方法。
在地址栏输入目标 API URL(如 https://api.example.com/data
)。
切换到 "Headers" 选项卡。
添加一个键值对:
Key: Content-Type
Value: application/json
切换到 "Body" 选项卡。
选择 raw
方式。
在右侧的下拉菜单选择 JSON
(会自动设置 Content-Type
)。
在编辑框中输入 JSON 数据,例如:
json{ "name": "John", "age": 30, "isAdmin": false }
点击 "Send" 按钮发送请求。
在 "Response" 区域查看返回的数据。
在 "Headers" 里添加 Authorization
头,例如:
Authorization: Bearer your_token_here
可以使用 Postman 环境变量,例如:
json{ "username": "{{username}}", "password": "{{password}}" }
(需在 Postman 的环境变量中提前定义 username
和 password
)
检查 语法(如逗号、引号是否正确)。
确保 Content-Type: application/json
已设置。
如果后端是表单解析(如 PHP 的 $_POST
),可能需要改用 x-www-form-urlencoded
。
步骤 | 具体操作 |
---|---|
1. 方法 |
选择 POST
|
2. URL | 填写 API 目标地址 |
3. Headers |
添加 Content-Type: application/json
|
4. Body |
选择 raw → JSON ,并输入 JSON 数据
|
5. Send | 发送请求并查看返回结果 |
✅ 这样就能正确提交 JSON 数据了!
php 如何获取 Postman post 提交的 json 数据
在 PHP 中,获取 Postman 通过 POST
提交的 JSON 数据,需要使用 php://input
读取原始请求体,并用 json_decode()
解析 JSON。
php<?php // 1. 读取原始 JSON 请求体 $jsonData = file_get_contents('php://input'); // 2. 解析 JSON 字符串为 PHP 数组或对象 $data = json_decode($jsonData, true); // true 返回关联数组,false 返回对象 // 3. 检查是否解析成功 if ($data === null && json_last_error() !== JSON_ERROR_NONE) { die('JSON 解析错误: ' . json_last_error_msg()); } // 4. 使用数据 echo "Name: " . $data['name'] . "\n"; echo "Age: " . $data['age'] . "\n"; // 返回 JSON 响应 header('Content-Type: application/json'); echo json_encode(['status' => 'success', 'data' => $data]); ?>
php://input
:HTTP 原始请求体(如 application/json
)。
json_decode($jsonData, true)
:
第二个参数 true
→ 返回 关联数组。
默认 false
→ 返回 stdClass
对象(访问方式:$data->name
)。
json_last_error()
:检查 JSON 解析是否成功。
$_POST
是否为空(调试用)
如果直接使用 $_POST
,但发现 $_POST
为空,说明数据是以 application/json
而不是 x-www-form-urlencoded
或 form-data
提交的:
php<?php if (empty($_POST)) { echo "数据未以表单形式提交,可能是 JSON!"; $jsonData = file_get_contents('php://input'); $data = json_decode($jsonData, true); print_r($data); } else { echo "数据以表单(x-www-form-urlencoded 或 form-data)提交:"; print_r($_POST); } ?>
方法:POST
Headers:
Content-Type: application/json
Body → raw
→ 选择 JSON
,并输入:
json{ "name": "John", "age": 30, "isAdmin": false }
问题 | 原因 | 解决方法 |
---|---|---|
$_POST 为空
|
数据未以表单格式提交 |
改用 php://input + json_decode()
|
json_decode() 返回 null
|
JSON 格式错误 |
检查 Postman 是否为 application/json
|
json_last_error() 报错
|
JSON 数据有语法错误 | 使用在线工具(如 JSONLint)验证 JSON |
✅ 正确方式:
php$jsonData = file_get_contents('php://input'); $data = json_decode($jsonData, true);
❌ 错误方式:
php$name = $_POST['name']; // 不适用 `application/json` 请求
确保 Postman Content-Type: application/json
设置正确,PHP 不使用 $_POST
,而是从 php://input
读取 JSON 数据。
在macos 的 shell 中执行 curl -X POST http://aaa.bbb.com/get_keyword_file_info \
-H "Content-Type: application/json" \
-d '{"ComputerName":"AAAA","Serial":"BBBB","Version":"CCC"}'
NULL
curl: (3) URL using bad/illegal format or missing URL
zsh: command not found: -H #有问题
你的 curl
命令语法是正确的,但可能在复制粘贴时出现了 格式错误(例如换行符问题)。在 Mac/Linux 终端(如 zsh
)中,长命令可以这么写:
bashcurl -X POST http://aaaaa.bbbbb-ict.com/get_keyword_file_info -H "Content-Type: application/json" -d '{"ComputerName":"AAAA","Serial":"BBBB","Version":"CCC"}'
(直接粘贴运行,不要换行)
zsh: command not found: -H
原因:换行符 (\
) 未被正确解析,导致 -H
被当成独立命令。
解决:
方法 1:直接写一行(推荐)。
方法 2:用引号包裹整个 JSON(避免换行问题):
bashcurl -X POST http://aaaaa.bbbbb-ict.com/get_keyword_file_info -H "Content-Type: application/json" -d "{\"ComputerName\":\"AAAA\",\"Serial\":\"BBBB\",\"Version\":\"CCC\"}"
NULL
响应
可能原因:
服务器未正确解析 JSON(检查 Content-Type: application/json
是否设置)。
服务器返回的数据本身就是 NULL
(检查 API 逻辑)。
调试方法:
bashcurl -v -X POST http://aaaaa.bbbbb-ict.com/get_keyword_file_info -H "Content-Type: application/json" -d '{"ComputerName":"AAAA","Serial":"BBBB","Version":"CCC"}'
(-v
参数显示详细请求/响应信息)
换行符问题:
在终端中,\
用于换行续写命令,但需确保后面没有空格或格式错误。
JSON 转义:
如果 JSON 中包含双引号,需用 \"
转义(或直接使用单引号包裹整个 JSON)。
服务器兼容性:
确保后端能正确解析 application/json
(如 PHP 需用 php://input
读取)。
bashcurl -X POST http://aaaa.bbbb.com/get_keyword_file_info -H "Content-Type: application/json" -d '{"key":"value"}'
bashCOMPUTER_NAME="AAAA" curl -X POST http://aaaa.bbbb.com/get_keyword_file_info -H "Content-Type: application/json" -d "{\"ComputerName\":\"$COMPUTER_NAME\"}"
bashecho '{"ComputerName":"AAAA"}' > data.json curl -X POST http://aaaa.bbbb.com/get_keyword_file_info -H "Content-Type: application/json" -d @data.json
如果问题仍然存在,可能是:
URL 格式错误:检查是否包含非法字符(如空格、中文符号)。
网络问题:尝试用 ping aaaaa.bbbbb-ict.com
测试连通性。
服务器问题:联系 API 提供方确认接口是否正常。
经测试 正确的代码一行如下: curl -X POST http://aaaa.bbbb.com/get_keyword_file_info -H "Content-Type: application/json" -d '{"ComputerName":"AAAA","Serial":"BBBB","Version":"CCC"}'
在 dos 中执行 C:\Users\myname>curl -v -X POST http://aaaa.bbbb.com/get_keyword_file_info -H "Content-Type: application/json" -d '{"ComputerName":"AAAA","Serial":"BBBB","Version":"CCC"}'
Note: Unnecessary use of -X or --request, POST is already inferred.
* Host aaaa.bbbb.com:80 was resolved.
* IPv6: (none)
* IPv4: 10.54.2.134
* Trying 10.54.2.134:80...
* Connected to aaaa.bbbb.com (10.54.2.134) port 80
* using HTTP/1.x
> POST /get_keyword_file_info HTTP/1.1
> Host: aaaa.bbbb.com
> User-Agent: curl/8.13.0
> Accept: */*
> Content-Type: application/json
> Content-Length: 45
>
* upload completely sent off: 45 bytes
< HTTP/1.1 200 OK
< Server: nginx/1.8.1
< Date: Sun, 31 Aug 2025 03:21:14 GMT
< Content-Type: text/html; charset=UTF-8
< Content-Length: 5
< Connection: keep-alive
< X-Content-Type-Options: nosniff
< X-Powered-By: PHP/5.6.30
< Expires: Sun, 19 Nov 1978 05:00:00 GMT
< Cache-Control: no-cache, must-revalidate
< X-Content-Type-Options: nosniff
< Set-Cookie: SESS140bd0341d58781fc8599a776a8e04d3=G_vsOLSyuHLFRxCCeg8sxPn9a_iReMuPU9pyvZMaMYk; expires=Tue, 23-Sep-2025 06:54:34 GMT; Max-Age=2000000; path=/; domain=.aaaaa.bbbbb-ict.com; HttpOnly
<
NULL #有问题,返回值为空
* Connection #0 to host aaaaa.bbbbb-ict.com left intact
C:\Users\myname>
从你的 curl
请求和服务器响应来看,虽然请求成功(返回 HTTP/1.1 200 OK
),但服务器返回的内容是 NULL
。以下是可能的原因和解决方案:
NULL
的可能原因
后端可能使用了 $_POST
接收数据,但 application/json
数据不会填充到 $_POST
中。
检查 PHP 代码是否使用 php://input
读取 JSON:
php$json = file_get_contents('php://input'); $data = json_decode($json, true); if ($data === null) { echo "Invalid JSON"; } else { print_r($data); // 处理数据 }
接口可能未正确处理请求数据,直接返回 NULL
(需联系后端开发者确认逻辑)。
确保发送的 JSON 字段与接口要求一致(如字段名大小写、必填字段等)。
让后端开发者查看 PHP 错误日志(如 /var/log/nginx/error.log
或 PHP-FPM 日志),确认是否有解析错误。
尝试用最简 JSON 测试接口:
bashcurl -X POST http://aaaaa.bbbbb-ict.com/get_keyword_file_info \ -H "Content-Type: application/json" \ -d '{"test":"value"}'
在 PHP 中临时输出接收到的数据:
php// 调试代码(临时添加) file_put_contents('debug.log', file_get_contents('php://input'), FILE_APPEND);
你的响应头显示 Content-Type: text/html
,但实际返回的是 NULL
,可能是 PHP 代码未设置正确的响应类型。确保后端返回 JSON:
phpheader('Content-Type: application/json'); echo json_encode(['data' => $result]);
curl
命令改进
去掉 -X POST
(因为 -d
已隐含 POST 方法):
bashcurl -v http://aaaaa.bbbbb-ict.com/get_keyword_file_info \ -H "Content-Type: application/json" \ -d '{"ComputerName":"AAAA","Serial":"BBBB","Version":"CCC"}'
现象 | 可能原因 | 解决方案 |
---|---|---|
返回 NULL
|
PHP 未解析 JSON |
使用 php://input 而非 $_POST
|
返回 NULL
|
接口逻辑错误 | 联系后端开发者检查代码 |
返回 text/html
|
未设置响应头 |
在 PHP 中添加 header('Content-Type: application/json')
|
如果问题仍存在,直接联系后端团队,提供你的 curl
请求和完整响应日志,协助他们排查问题。