数据编码方式 ------总结网络请求中常见的4种数据编码方式

news2024/9/19 8:51:10

引子

在Web开发中,表单(<form>)用于收集用户输入的数据。当用户提交表单时,数据会被发送到服务器进行处理。根据不同的场景需求,表单可以采用不同的数据格式来发送数据。通常有两种主要的数据格式:application/x-www-form-urlencodedmultipart/form-data。此外,还有 text/plain 这种较少使用的格式。下面分别介绍这三种的数据格式:


1. application/x-www-form-urlencoded

这是最常见的表单数据格式。当表单的 method 属性为 POSTGET 并且 enctype 属性未指定或为空时,默认会使用这种格式。在这种格式下,表单数据会被编码为名称/值对的形式,每个名称/值对由等号 (=) 分隔,多个名称/值对之间由与号 (&) 分隔。

特点
  • 键值对形式:数据以键值对的形式发送,每个键值对由等号 (=) 分隔,多个键值对之间由与号 (&) 分隔。
  • URL 编码:特殊字符会被转义成 %xx 的形式,例如空格会被转义成 %20
  • 默认编码方式:当使用 <form> 元素提交数据时,默认情况下如果没有显式指定 enctype 属性,则会使用 application/x-www-form-urlencoded
使用场景
  • 普通表单数据提交:当表单不包含文件上传时,通常使用这种编码方式。
  • API 请求:许多 RESTful API 接口在 POST 请求中使用这种编码方式来传递参数。
示例代码

HTML 表单:

1<form action="/submit_form" method="POST">
2    <label for="username">用户名:</label>
3    <input type="text" id="username" name="username"><br>
4    <label for="password">密码:</label>
5    <input type="password" id="password" name="password"><br>
6    <input type="submit" value="提交">
7</form>

HTTP 请求:

1POST /submit_form HTTP/1.1
2Host: example.com
3Content-Type: application/x-www-form-urlencoded
4
5username=John&password=secret
服务器端处理

在服务器端,可以使用框架提供的工具来解析这种编码的数据。例如,在 Node.js 中使用 Express:

1const express = require('express');
2const bodyParser = require('body-parser');
3const app = express();
4
5app.use(bodyParser.urlencoded({ extended: true }));
6
7app.post('/submit_form', (req, res) => {
8    const username = req.body.username;
9    const password = req.body.password;
10    console.log(`Username: ${username}, Password: ${password}`);
11    res.send('Form submitted successfully!');
12});
13
14app.listen(3000, () => {
15    console.log('Server is running on port 3000');
16});


2. multipart/form-data

这种格式主要用于处理文件上传。当表单包含文件上传字段 (<input type="file">) 时,需要将 enctype 属性设置为 multipart/form-data。在这种格式下,每个表单字段都会作为一个独立的部分(part)发送,并且每个部分都有自己的头部信息。

特点
  • 多部分数据:数据被划分为多个部分(part),每个部分有自己的头部信息。
  • 文件上传:主要用于处理文件上传,因为文件数据通常较大且复杂。
  • 必须指定 enctype 属性:当表单包含文件上传字段 (<input type="file">) 时,需要将 enctype 属性设置为 multipart/form-data
使用场景
  • 文件上传:当需要上传文件时,使用这种编码方式。
  • 混合数据类型:可以同时上传文件和其他表单数据。
示例代码

HTML 表单:

1<form action="/upload_file" method="POST" enctype="multipart/form-data">
2    <label for="file">选择文件:</label>
3    <input type="file" id="file" name="file"><br>
4    <label for="description">描述:</label>
5    <input type="text" id="description" name="description"><br>
6    <input type="submit" value="上传">
7</form>

HTTP 请求:

1POST /upload_file HTTP/1.1
2Host: example.com
3Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
4
5------WebKitFormBoundary7MA4YWxkTrZu0gW
6Content-Disposition: form-data; name="description"
7
8这是一个描述
9------WebKitFormBoundary7MA4YWxkTrZu0gW
10Content-Disposition: form-data; name="file"; filename="example.txt"
11Content-Type: text/plain
12
13文件内容
14------WebKitFormBoundary7MA4YWxkTrZu0gW--
服务器端处理

在服务器端,同样可以使用框架提供的工具来解析这种编码的数据。例如,在 Node.js 中使用 Multer:

1const express = require('express');
2const multer = require('multer');
3const app = express();
4
5const storage = multer.diskStorage({
6    destination: function (req, file, cb) {
7        cb(null, 'uploads/');
8    },
9    filename: function (req, file, cb) {
10        cb(null, file.fieldname + '-' + Date.now());
11    }
12});
13
14const upload = multer({ storage: storage });
15
16app.post('/upload_file', upload.single('file'), (req, res) => {
17    const description = req.body.description;
18    const file = req.file;
19    console.log(`Description: ${description}`);
20    console.log(`File uploaded: ${file.path}`);
21    res.send('File uploaded successfully!');
22});
23
24app.listen(3000, () => {
25    console.log('Server is running on port 3000');
26});

总结
  • application/x-www-form-urlencoded:用于普通表单数据的提交,适合不需要文件上传的情况。
  • multipart/form-data:用于包含文件上传的表单数据提交。

选择合适的 enctype 属性对于确保表单数据正确传输非常重要。


3.text/plain

text/plain 是一种 MIME 类型(Multipurpose Internet Mail Extensions),用于表示纯文本数据。这种数据编码方式主要用于传输未经格式化的文本数据。

特点
  • 简单性text/plain 仅包含普通的 ASCII 或 Unicode 文本,没有任何特殊的格式或结构。

  • 兼容性:几乎所有文本编辑器和编程语言都可以处理 text/plain 数据。

  • 无格式化:不像 HTML 或 JSON 那样具有结构化的数据格式,text/plain 就是一段普通的文本字符串。

使用场景

text/plain 通常用于以下场景:

  • 简单的文本消息:例如,发送简单的文本消息而不包含任何格式化或结构。

  • 调试输出:在开发过程中,有时需要输出原始的文本数据进行调试。

  • 配置文件:某些配置文件可能会使用纯文本格式存储,方便手动编辑。

示例

作为 HTTP 响应

当服务器返回 text/plain 数据时,HTTP 响应头会包含 Content-Type: text/plain

1HTTP/1.1 200 OK
2Content-Type: text/plain
3
4Hello, World!
5This is a simple text message.

在客户端发送 text/plain 数据时,可以设置 Content-Typetext/plain

1fetch('https://example.com/api/message', {
2  method: 'POST',
3  headers: {
4    'Content-Type': 'text/plain'
5  },
6  body: 'Hello, World!'
7})
8.then(response => response.text())
9.then(data => console.log(data))
10.catch(error => console.error('Error:', error));
示例代码

以下是一个使用 Node.js 处理 text/plain 数据的例子:

服务器端

1const express = require('express');
2const app = express();
3
4app.use(express.text());
5
6app.post('/submit_message', (req, res) => {
7  const message = req.body;
8  console.log(message);
9  res.send('Message received: ' + message);
10});
11
12app.listen(3000, () => {
13  console.log('Server is running on port 3000');
14});

客户端

使用 fetch 发送 text/plain 数据:

1fetch('http://localhost:3000/submit_message', {
2  method: 'POST',
3  headers: {
4    'Content-Type': 'text/plain'
5  },
6  body: 'Hello, World!'
7})
8.then(response => response.text())
9.then(data => console.log(data))
10.catch(error => console.error('Error:', error));

总结

text/plain 是一种非常简单的数据编码方式,适用于传输纯文本数据。虽然它不像 application/jsonapplication/x-www-form-urlencoded 那样具有复杂的结构,但在某些场景下仍然非常有用,尤其是在需要传输简单的文本消息时。


4.application/json

介绍

application/json 是一个 MIME 类型(Multipurpose Internet Mail Extensions),用于标识数据是以 JSON(JavaScript Object Notation)格式编码的。这个 MIME 类型在 Web 开发中非常常见,特别是在 RESTful API 中用于数据交换。

1. 用途
  • API 数据交换:现代 Web API 经常使用 application/json 类型来发送和接收数据。
  • 配置文件:某些配置文件也采用 JSON 格式存储,便于解析和编辑。

2. HTTP 头部

当你在 HTTP 请求或响应中使用 JSON 数据时,通常会在 Content-Type 头部指定 application/json。例如:

请求头

1POST /api/data HTTP/1.1
2Host: example.com
3Content-Type: application/json
4
5{
6  "key": "value",
7  "another_key": 123
8}

响应头

1HTTP/1.1 200 OK
2Content-Type: application/json
3
4{
5  "status": "success",
6  "message": "Data retrieved successfully."
7}
3. JSON 数据格式

JSON 数据通常是一个包含键值对的对象或数组。以下是一个简单的 JSON 示例:

1{
2  "name": "张三",
3  "age": 30,
4  "isStudent": false,
5  "hobbies": ["阅读", "旅行", "编程"],
6  "address": {
7    "street": "和平路",
8    "city": "北京",
9    "country": "中国"
10  }
11}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2145926.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

华为OD机试 - 返回矩阵中非1的元素个数 - 广度优先搜索BFS(Python/JS/C/C++ 2024 E卷 200分)

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试真题&#xff08;Python/JS/C/C&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;私信哪吒&#xff0c;备注华为OD&#xff0c;加入华为OD刷题交流群&#xff0c;…

最长连续子序列 - 华为OD统一考试(E卷)

OD统一考试&#xff08;E卷&#xff09; 分值&#xff1a; 100分 题解&#xff1a; Java / Python / C 2024华为OD机试&#xff08;E卷D卷C卷&#xff09;最新题库【超值优惠】Java/Python/C合集 题目描述 有N个正整数组成的一个序列。给定整数sum&#xff0c;求长度最长的连续…

WIFI路由器的套杆天线简谈

❝本次推文简单介绍下WIFI路由器的套杆天线。 路由器天线 路由器在这个万物互联的时代&#xff0c;想必大家对其都不陌生。随着科技的发展&#xff0c;常用的路由器上的天线也越来越多&#xff0c;那么问题来了&#xff1a;天线越多&#xff0c;信号越好吗&#xff1f;路由器…

前端mock了所有……

目录 一、背景描述 二、开发流程 1.引入Mock 2.创建文件 3.需求描述 4.Mock实现 三、总结 一、背景描述 前提&#xff1a; 事情是这样的&#xff0c;老板想要我们写一个demo拿去路演/拉项目&#xff0c;有一些数据&#xff0c;希望前端接一下&#xff0c;写几个表格&a…

Linux进程间通信——探索共享内存—— 剖析原理, 学习接口应用

前言&#xff1a;本节内容主要讲解进程间通信的&#xff0c; systemV版本下的共享内存。 共享内存&#xff0c;顾名思义&#xff0c; 其实就是一块内存&#xff0c; 它不同于管道是一个文件。 所以它的传输速度是很快的。 因为管道是文件&#xff0c;有缓冲区&#xff0c; 而共…

Day99 代码随想录打卡|动态规划篇--- 01背包问题

题目&#xff08;卡玛网T46&#xff09;&#xff1a; 小明是一位科学家&#xff0c;他需要参加一场重要的国际科学大会&#xff0c;以展示自己的最新研究成果。他需要带一些研究材料&#xff0c;但是他的行李箱空间有限。这些研究材料包括实验设备、文献资料和实验样本等等&am…

LeRobot - 让现实机器人更易学

文章目录 一、关于 LeRobot特点模拟环境中预训练模型的示例 致谢教程 - Getting Started with Real-World Robots 二、安装三、Walkthrough1、可视化数据集2、LeRobotDataset的格式3、评估预先训练的策略4、训练你自己的政策复制最先进的&#xff08;SOTA&#xff09; 四、贡献…

Vue3 中 Aos 动画同时触发的解决办法

文章目录 问题现象解决之后的效果解决办法问题猜测 问题现象 我总共有四行数据&#xff0c;每一行都是一个动画&#xff0c;但是触发第一个之后其他三个也都触发了 我想要的效果是&#xff1a;动画从底部出现的时候触发一个动画&#xff0c;不要都触发掉 解决之后的效果 解决…

智慧卫生间系统:引领公共卫生间管理的新时代@卓振思众

随着城市化进程的加快&#xff0c;公共卫生间的使用频率不断增加。如何提升公共卫生间的使用体验、管理效率以及卫生水平&#xff0c;已成为各地政府和管理者关注的焦点。智慧卫生间系统应运而生&#xff0c;成为解决这一问题的重要工具。它结合了物联网技术和智能管理理念&…

四、Cookie 和 Session

文章目录 1. Cookie 饼干1.1 什么是 Cookie?1.2 如何创建 Cookie1.3 服务器如何获取 Cookie1.4 Cookie 值的修改1.5 浏览器查看 Cookie1.6 Cookie 生命控制&#xff08;指浏览器中Cookie的存在时间&#xff09;1.7 Cookie 有效路径 Path 的设置 2. Session 会话2.1 什么是 Ses…

Canopen-pn有线通信标准在汽车制造中至关重要

电子元件越来越多地被集成到车辆中&#xff0c;从而实现与物联网世界的连接。该行业中主要的高速串行接口方法包括控制器局域网 (CAN) 总线 。CAN 是运输应用中使用的一种强大的总线标准。它旨在允许微控制器(MCU) 和相关组件与彼此的应用程序进行通信。这无需系统具有主机即可…

从入门到精通,带你探索适合新手的视频剪辑工具

用视频来分享生活已经变成越来越多人的一种习惯&#xff0c;很多时候视频并不能一镜到底&#xff0c;所以还需要一些的修改、剪辑操作&#xff0c;那么这次我将介绍几款视频剪辑工具&#xff0c;希望能够让你分享的道路更加通畅。 1.FOXIT视频剪辑 连接直达>>https://w…

【项目设计】Facial-Hunter

目录 一、项目介绍 二、开发环境以及技术 三、项目架构设计 3.1 项目总体架构 3.2 客户端架构 3.3 主服务端架构 3.4 处理服务端架构 3.5 数据库设计 四、FaceNet 五、代码实现 一、项目介绍 该项目是基于深度学习与负载均衡的人脸识别系统 该项目主要由三个部分组…

【Elasticsearch系列十二】聚合-电视案例

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

反射的相关内容

目录 一、什么是反射 二、为什么会有反射 三、反射是如何工作的 获取类信息的三种方式&#xff1a; 例&#xff1a; 四、获取类信息并调用 1.获取 &#xff08;1&#xff09;获取变量 获取全部类信息 获取public修饰的 获取指定某一个 &#xff08;2&#xff09;…

【新手上路】衡石分析平台使用手册-租户管理

租户管理​ 衡石系统支持服务一个平台方和多个企业客户的租户模式&#xff0c;平台方管理租户&#xff0c;为租户提供数据&#xff0c;租户在系统内进行数据分析。 衡石系统增加工作空间的设计&#xff0c;在平台方和租户之间提供单向的传递通道&#xff0c;平台厂商可以轻松…

C++map,set,multiset,multimap详细介绍

目录 1. 关联式容器 2. 键值对 3. 树形结构的关联式容器 3.1 set set的介绍 set的使用 1. set的模板参数列表 2. set的构造 3. set的迭代器 4. set的容量 5. set的修改操作 6. set的使用举例 ​3.2 map map的介绍 map的使用 1. map的模板参数声明 2. map的构造 …

实例讲解电动汽车钥匙ON挡上下电控制策略及Simulink建模方法

在电动汽车VCU开发中&#xff0c;上下电控制是其中一个核心控制内容&#xff0c;也是其他控制功能的基础&#xff0c;而钥匙ON挡上下电又是整车上下电的基础。本文介绍电动汽车钥匙ON挡上下电的控制策略及Simulink建模方法。 目录 一、整车高压原理 二、钥匙ON挡上下电控制策…

计算机毕业设计 办公用品管理系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

Aegisub字幕自动化及函数篇(图文教程附有gif动图展示)(一)

目录 自动化介绍 bord 边框宽度 随机函数 fsvp 随机颜色 move 自动化介绍 自动化介绍:简单来说自动化能让所有字幕行快速拥有你指定的同一种特效 对时间不同的行应用相同的效果 只要设计好一个模板&#xff0c;然后让所有行都执行这个模板上的特效就好了 首先制作模板行…