欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

x-www-form-urlencoded 与form-data 区别,分别用在什么地方 AG chatgpt 有大用

x-www-form-urlencoded 与form-data 区别,分别用在什么地方

x-www-form-urlencoded 和 form-data 是 HTTP 请求中常见的两种数据编码方式,主要用于表单提交或 API 请求。它们的核心区别在于数据格式和适用场景:


1. x-www-form-urlencoded

  • 编码方式
    将表单数据编码为键值对(key=value),用 & 连接,特殊字符会被 URL 编码(如空格变 %20)。
    例如:

    plaintext            
    name=John+Doe&age=30            

       

  • HTTP 请求头

    http            
    Content-Type: application/x-www-form-urlencoded            

       

  • 特点

    • 数据是纯文本,体积较小(无冗余字符)。

    • 不支持文件上传。

    • 适合简单的文本数据(如登录表单、搜索框)。

  • 典型场景

    • 提交纯文本表单(如用户名、密码)。

    • 传统 AJAX 请求(非文件上传)。

    • URL 查询参数(如 ?key=value)。


2. form-data (multipart/form-data)

  • 编码方式
    将数据分割为多个“部分”(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 请求头

    http            
    Content-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
    当需要上传文件或表单中包含非文本数据(如图片、视频)时。


其他注意事项

  1. 现代 API 设计
    RESTful API 通常直接使用 application/json 替代 x-www-form-urlencoded,但浏览器表单默认不支持 JSON。

  2. 性能影响
    form-data 因分隔符和二进制编码会有额外开销,适合必要场景(如文件上传)。

  3. 框架自动处理
    前端库(如 Axios)和后端框架(如 Express、Django)会自动根据数据类型选择编码方式,无需手动设置。


ajax 提交 json 数据 一般用什么格式

使用 AJAX 提交 JSON 数据 时,通常采用 application/json 作为 Content-Type,并直接将 JavaScript 对象序列化成 JSON 字符串作为请求体。这种方式是现代 Web 开发中最常见、最清晰的 JSON 数据传输方式。


1. 正确格式示例

请求头(Headers):

http    
Content-Type: application/json    


请求体(Body):

json    
{  "username": "john",  "age": 25,  "isAdmin": false }    


JavaScript 代码(以 Fetch API 为例):

javascript    
fetch('https://api.example.com/users', {  method: 'POST',  headers: {    'Content-Type': 'application/json'  // 关键头  },  body: JSON.stringify({               // 手动序列化对象    username: 'john',    age: 25,    isAdmin: false  }) });    



2. 为什么不用 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 数据。


3. 后端如何接收 JSON 数据?

主流后端框架(如 Node.js/Express、Django、Spring Boot)会自动解析 application/json 请求体,无需手动处理。

Express (Node.js) 示例

javascript    
app.post('/users', express.json(), (req, res) => {  // 使用 express.json() 中间件  console.log(req.body);  // 直接获取 JSON 对象  res.send('Data received'); });    


Django (Python) 示例

python    
from django.http import JsonResponse import json def api_view(request):    data = json.loads(request.body)  # 手动解析 JSON    return JsonResponse({"status": "success"})    



4. 补充说明

  • 兼容性
    所有现代浏览器和服务器均支持 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 数据 的步骤如下:


1. 选择请求类型并设置 URL                

  1. 打开 Postman,在顶部选择 POST 方法。

  2. 在地址栏输入目标 API URL(如 https://api.example.com/data)。


2. 设置 Headers(请求头)                

  1. 切换到 "Headers" 选项卡。

  2. 添加一个键值对:

    Postman Headers                        

  • KeyContent-Type

  • Valueapplication/json


3. 编写 JSON 请求体                

  1. 切换到 "Body" 选项卡。

  2. 选择 raw 方式。

  3. 在右侧的下拉菜单选择 JSON(会自动设置 Content-Type)。

  4. 在编辑框中输入 JSON 数据,例如:

    json                            
    {    "name": "John",    "age": 30,    "isAdmin": false }                            

                           

    Postman JSON Body                        


4. 发送请求                

  1. 点击 "Send" 按钮发送请求。

  2. 在 "Response" 区域查看返回的数据。


🔥 常见问题                

Q: 如果 API 需要认证(如 JWT Token)怎么办?                

  • 在 "Headers" 里添加 Authorization 头,例如:

    Authorization: Bearer your_token_here
    

                       

Q: 如何发送带变量的 JSON?                

  • 可以使用 Postman 环境变量,例如:

    json                            
    {    "username": "{{username}}",    "password": "{{password}}" }                            

                           

    (需在 Postman 的环境变量中提前定义 username 和 password                        

Q: JSON 数据报错怎么办?                

  • 检查 语法(如逗号、引号是否正确)。

  • 确保 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。


方法 1:直接获取原始 JSON 数据                

PHP 代码                

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 解析是否成功。


方法 2:检查 $_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); } ?>                    
               

Postman 正确提交 JSON                

  1. 方法POST

  2. Headers

  • Content-Type: application/json

  • Body → raw → 选择 JSON,并输入:

    json                            
    {    "name": "John",    "age": 30,    "isAdmin": false }                            

                           

    Postman JSON Body                        


  • 常见错误 & 解决方案                

    问题                             原因                             解决方法                            
    $_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)中,长命令可以这么写:

    ✅ 正确方式(一行命令)

    bash    
    curl -X POST http://aaaaa.bbbbb-ict.com/get_keyword_file_info -H "Content-Type: application/json" -d '{"ComputerName":"AAAA","Serial":"BBBB","Version":"CCC"}'    


    (直接粘贴运行,不要换行)


    🔥 常见错误及修复

    1. zsh: command not found: -H

    • 原因:换行符 (\) 未被正确解析,导致 -H 被当成独立命令。

    • 解决

      • 方法 1:直接写一行(推荐)。

      • 方法 2:用引号包裹整个 JSON(避免换行问题):

        bash                
        curl -X POST http://aaaaa.bbbbb-ict.com/get_keyword_file_info -H "Content-Type: application/json" -d "{\"ComputerName\":\"AAAA\",\"Serial\":\"BBBB\",\"Version\":\"CCC\"}"                

               

    2. NULL 响应

    • 可能原因

      • 服务器未正确解析 JSON(检查 Content-Type: application/json 是否设置)。

      • 服务器返回的数据本身就是 NULL(检查 API 逻辑)。

    • 调试方法

      bash            
      curl -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 参数显示详细请求/响应信息)


    📌 关键点

    1. 换行符问题

    • 在终端中,\ 用于换行续写命令,但需确保后面没有空格或格式错误。

  • JSON 转义

    • 如果 JSON 中包含双引号,需用 \" 转义(或直接使用单引号包裹整个 JSON)。

  • 服务器兼容性

    • 确保后端能正确解析 application/json(如 PHP 需用 php://input 读取)。


    完整示例(适应不同场景)

    1. 简单 JSON 请求

    bash    
    curl -X POST http://aaaa.bbbb.com/get_keyword_file_info -H "Content-Type: application/json" -d '{"key":"value"}'    


    2. JSON 含变量(动态数据)

    bash    
    COMPUTER_NAME="AAAA" curl -X POST http://aaaa.bbbb.com/get_keyword_file_info -H "Content-Type: application/json" -d "{\"ComputerName\":\"$COMPUTER_NAME\"}"    


    3. 从文件读取 JSON

    bash    
    echo '{"ComputerName":"AAAA"}' > data.json curl -X POST http://aaaa.bbbb.com/get_keyword_file_info -H "Content-Type: application/json" -d @data.json    



    如果问题仍然存在,可能是:

    1. URL 格式错误:检查是否包含非法字符(如空格、中文符号)。

    2. 网络问题:尝试用 ping aaaaa.bbbbb-ict.com 测试连通性。

    3. 服务器问题:联系 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。以下是可能的原因和解决方案:


    1. 服务器返回 NULL 的可能原因

    (1)PHP 代码未正确解析 JSON

    • 后端可能使用了 $_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); // 处理数据 }            

         

    (2)接口逻辑问题

    • 接口可能未正确处理请求数据,直接返回 NULL(需联系后端开发者确认逻辑)。

    (3)JSON 格式或字段不匹配

    • 确保发送的 JSON 字段与接口要求一致(如字段名大小写、必填字段等)。


    2. 调试建议

    (1)检查服务器日志

    • 让后端开发者查看 PHP 错误日志(如 /var/log/nginx/error.log 或 PHP-FPM 日志),确认是否有解析错误。

    (2)简化测试

    • 尝试用最简 JSON 测试接口:

      bash            
      curl -X POST http://aaaaa.bbbbb-ict.com/get_keyword_file_info \     -H "Content-Type: application/json" \     -d '{"test":"value"}'            

         

    (3)验证 JSON 是否被正确接收

    • 在 PHP 中临时输出接收到的数据:

      php            
      // 调试代码(临时添加) file_put_contents('debug.log', file_get_contents('php://input'), FILE_APPEND);            

         

    (4)检查 HTTP 响应头

    • 你的响应头显示 Content-Type: text/html,但实际返回的是 NULL,可能是 PHP 代码未设置正确的响应类型。确保后端返回 JSON:

      php            
      header('Content-Type: application/json'); echo json_encode(['data' => $result]);            

         


    3. 你的 curl 命令改进

    去掉 -X POST(因为 -d 已隐含 POST 方法):

    bash    
    curl -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 请求和完整响应日志,协助他们排查问题。


    普通分类: