客户端向服务端传参5个方式

/**

 * get: parmas方式 例子:/:id

 * get: query方式 例子:/home?name=xxx&age=xxx

 * get: json方式 例子:{"name":"xxx","age":"xxx"}

 * post: x-www-form-urlencoded方式 例子: name=xxx&age=xxx

  * post: from-data方式

 */

告知编码方式后,服务器再进行解码

HTTP 数据编码方式

HTTP数据编码方式主要涉及到请求和响应体中的数据表示方法,它决定了数据如何在网络上传输以及如何在接收端被解析。以下是HTTP中常见的几种数据编码方式:

  1. application/x-www-form-urlencoded
    这是最常见的表单数据编码方式。当用户在Web表单中输入数据并提交时,浏览器通常会使用这种编码方式。它将表单数据编码为键值对,每个键值对之间用&分隔,键和值之间用=连接。例如,name=John&age=30

  2. multipart/form-data
    这种编码方式主要用于文件上传。它可以将表单数据分割成多个部分,每个部分可以包含不同的字段,包括文件。每个部分都有自己的头部,描述了该部分的内容类型和可能的文件名。这种方式可以确保文件和其他二进制数据能够安全地传输。

  3. text/plain
    这种编码方式用于纯文本数据。它不对数据进行任何特殊的编码或格式化,只是简单地发送原始文本。

  4. JSON
    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。在HTTP请求或响应中,JSON数据通常以application/json的MIME类型发送。它使用易于阅读和编写的文本格式来存储和表示数据,具有自我描述性,易于理解。

  5. 其他媒体类型
    HTTP还支持许多其他的媒体类型,如image/jpegaudio/mpegvideo/mp4等,用于传输图片、音频、视频等多媒体内容。这些类型的数据通常使用二进制编码,并在HTTP响应中指定相应的MIME类型。

在发送HTTP请求或处理HTTP响应时,选择正确的编码方式非常重要。错误的编码方式可能导致数据丢失、损坏或无法被正确解析。因此,了解每种编码方式的特点和用途,并根据具体的应用场景选择合适的编码方式至关重要。

parmas

在Web开发中,特别是当涉及到RESTful API设计时,:id 这种形式的路径参数(path parameter)是非常常见的。这种参数用于标识资源的一个特定实例,如用户、文章、产品等。当你看到像 /:id 这样的路径时,它意味着在这个位置应该插入一个具体的值来标识一个特定的资源。

例如,假设你有一个API用于获取特定用户的信息,该API的路径可能是 /users/:id。在这个路径中,:id 是一个路径参数,它代表用户的唯一标识符。

下面是一个使用HTTP GET方法和路径参数的例子:

API路径

 

复制代码

/users/:id

请求示例

 

http复制代码

GET /users/123 HTTP/1.1
Host: example.com

在这个例子中,我们请求 /users/123,其中 123 是路径参数 :id 的具体值,代表用户ID。服务器会解析这个请求,并根据ID 123 来查找和返回相应的用户信息。

响应示例

 

http复制代码

HTTP/1.1 200 OK
Content-Type: application/json
{
"id": 123,
"name": "John Doe",
"email": "johndoe@example.com"
}

服务器返回了一个HTTP 200状态码,表示请求成功,并在响应体中包含了用户ID为123的用户信息,这些信息是以JSON格式表示的。

在编写后端代码时,你需要使用相应的Web框架来解析路径参数。例如,在Express.js(一个流行的Node.js Web框架)中,你可以这样定义路由:

 

javascript复制代码

app.get('/users/:id', function(req, res) {
const userId = req.params.id; // 从请求中获取路径参数
// 根据userId查询数据库或其他数据源,并返回结果
// ...
res.json({ id: userId, name: 'John Doe', email: 'johndoe@example.com' });
});

在这个Express路由中,:id 是一个占位符,当请求匹配这个路由时,Express会自动将路径中的值赋给 req.params.id,然后你可以在路由处理函数中使用这个值。

在RESTful API设计中,查询参数(query parameters)是一种用于从服务器检索资源时传递额外信息的常见方式。这些参数附加在URL的末尾,并以问号(?)开始,参数之间使用和号(&)分隔。查询参数通常用于过滤、排序、分页等。

下面是一个使用HTTP GET方法和查询参数的例子:

API路径

 

复制代码

/home

请求示例

 

http复制代码

GET /home?name=xxx&age=xxx HTTP/1.1
Host: example.com

在这个例子中,我们请求 /home 路径,并附加了两个查询参数:name 和 agename=xxx 和 age=xxx 是键值对,其中 xxx 是具体的值。这些值可以是任何字符串,具体取决于API的设计和需求。

响应示例

服务器会根据查询参数来过滤或处理数据,并返回相应的结果。响应的格式取决于API的实现,但通常会是JSON或其他结构化数据格式。

 

http复制代码

HTTP/1.1 200 OK
Content-Type: application/json
[
{
"id": 1,
"name": "xxx",
"age": 25
},
{
"id": 2,
"name": "xxx",
"age": 30
}
// 可能还有其他匹配条件的结果
]

在编写后端代码时,你需要解析查询参数以获取传递的值。以下是一个使用Express.js的示例:

 

javascript复制代码

app.get('/home', function(req, res) {
const name = req.query.name; // 从请求中获取name查询参数
const age = req.query.age; // 从请求中获取age查询参数
// 根据name和age查询数据库或其他数据源,并返回结果
// ...
// 假设我们从数据库中获取了匹配条件的结果列表
const results = [
{ id: 1, name: 'xxx', age: 25 },
{ id: 2, name: 'xxx', age: 30 }
];
res.json(results); // 返回JSON格式的响应体
});

在这个Express路由中,req.query 对象包含了所有的查询参数。你可以通过 req.query.name 和 req.query.age 来获取相应的值,并在路由处理函数中使用这些值来查询或过滤数据。

请注意,查询参数的值应该被适当地验证和清理,以防止安全漏洞,如SQL注入等。此外,对于敏感信息或大量数据,通常不推荐使用查询参数来传递,而是应该考虑使用POST请求体或其他安全的方式来传输数据。

query

在RESTful API设计中,查询参数(query parameters)是一种用于从服务器检索资源时传递额外信息的常见方式。这些参数附加在URL的末尾,并以问号(?)开始,参数之间使用和号(&)分隔。查询参数通常用于过滤、排序、分页等。

下面是一个使用HTTP GET方法和查询参数的例子:

API路径

 

复制代码

/home

请求示例

 

http复制代码

GET /home?name=xxx&age=xxx HTTP/1.1
Host: example.com

在这个例子中,我们请求 /home 路径,并附加了两个查询参数:name 和 agename=xxx 和 age=xxx 是键值对,其中 xxx 是具体的值。这些值可以是任何字符串,具体取决于API的设计和需求。

响应示例

服务器会根据查询参数来过滤或处理数据,并返回相应的结果。响应的格式取决于API的实现,但通常会是JSON或其他结构化数据格式。

 

http复制代码

HTTP/1.1 200 OK
Content-Type: application/json
[
{
"id": 1,
"name": "xxx",
"age": 25
},
{
"id": 2,
"name": "xxx",
"age": 30
}
// 可能还有其他匹配条件的结果
]

在编写后端代码时,你需要解析查询参数以获取传递的值。以下是一个使用Express.js的示例:

 

javascript复制代码

app.get('/home', function(req, res) {
const name = req.query.name; // 从请求中获取name查询参数
const age = req.query.age; // 从请求中获取age查询参数
// 根据name和age查询数据库或其他数据源,并返回结果
// ...
// 假设我们从数据库中获取了匹配条件的结果列表
const results = [
{ id: 1, name: 'xxx', age: 25 },
{ id: 2, name: 'xxx', age: 30 }
];
res.json(results); // 返回JSON格式的响应体
});

在这个Express路由中,req.query 对象包含了所有的查询参数。你可以通过 req.query.name 和 req.query.age 来获取相应的值,并在路由处理函数中使用这些值来查询或过滤数据。

请注意,查询参数的值应该被适当地验证和清理,以防止安全漏洞,如SQL注入等。此外,对于敏感信息或大量数据,通常不推荐使用查询参数来传递,而是应该考虑使用POST请求体或其他安全的方式来传输数据。

application/json

application/json 是一种 MIME 类型,用于表示 JSON(JavaScript Object Notation)格式的数据。JSON 是一种轻量级的数据交换格式,它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于语言的文本格式来存储和表示数据。JSON 文本格式在结构上易于阅读和编写,同时也易于机器解析和生成。

在 HTTP 通信中,application/json 通常作为请求或响应的内容类型(Content-Type)使用。当客户端向服务器发送数据时,如果数据是 JSON 格式的,客户端就会在请求的 Content-Type 头部中指定 application/json。同样,当服务器返回 JSON 格式的数据给客户端时,也会在响应的 Content-Type 头部中指定 application/json

使用 application/json 的好处包括:

  1. 跨语言性:JSON 格式是独立于语言的,这意味着任何支持 JSON 的编程语言都可以解析和处理它。
  2. 轻量级:JSON 格式的数据通常比 XML 更小、更快,因此更适合在网络传输中使用。
  3. 易于阅读:JSON 格式的数据结构清晰,易于人类阅读和理解。
  4. 易于解析:与 XML 相比,JSON 数据的解析通常更简单、更快速。

现在,越来越多的 Web 服务(特别是 RESTful API)选择使用 application/json 作为其主要的数据交换格式。这是因为 JSON 提供了简洁、高效且易于处理的数据表示方式,非常适合用于构建现代的、基于 Web 的应用程序。

x-www-form-urlencoded 

x-www-form-urlencoded 是一种 HTTP 数据编码方式,通常用于在 Web 表单提交时发送数据。当用户在网页上填写表单并点击提交按钮时,浏览器会将表单数据编码为 x-www-form-urlencoded 格式,并将其作为 HTTP 请求体发送到服务器。

这种编码方式的特点是将表单数据转换为一串键值对,每对键值之间使用 & 符号分隔,键和值之间使用 = 符号连接。例如,假设有一个包含两个字段(name 和 age)的表单,用户输入了 John 和 30,那么编码后的数据将如下所示:

 

bash复制代码

name=John&age=30

在发送 HTTP 请求时,这个编码后的字符串会被放在请求体中,并且 Content-Type 头部通常会被设置为 application/x-www-form-urlencoded,以告知服务器数据的编码方式。

例如,一个使用 x-www-form-urlencoded 编码方式的 POST 请求可能如下所示:

 

http复制代码

POST /submit-form HTTP/1.1
Host: example.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 18
name=John&age=30

需要注意的是,x-www-form-urlencoded 主要用于简单的表单数据提交。对于更复杂的数据结构(如嵌套对象或数组),通常使用其他编码方式,如 multipart/form-data(用于文件上传)或 application/json(用于 API 请求)。

multipart/form-data 

multipart/form-data 是一种 HTTP 数据编码方式,通常用于发送包含文件或其他二进制数据的表单数据。这种编码方式能够将表单数据分割成多个部分,每个部分都包含相应的头部和内容,使得二进制数据(如图片、音频、视频或文件)可以与其他表单字段一起发送。

当使用 multipart/form-data 编码方式时,每个部分都包含一个 Content-Disposition 头部,该头部指定了该部分的名称和可能的文件名(如果是一个文件字段)。对于文件字段,还会包含 Content-Type 头部来指定文件的 MIME 类型,以及文件的实际内容。

在 HTTP 请求中,使用 multipart/form-data 编码方式的 Content-Type 头部通常会包含一个 boundary 参数,该参数用于分隔请求体中的不同部分。每个部分的开始和结束都会使用这个边界字符串来标识。

例如,一个包含文件上传的表单的 multipart/form-data 编码请求可能如下所示:

 

http复制代码

POST /upload HTTP/1.1
Host: example.com
Content-Type: multipart/form-data; boundary=---------------------------97476729989295326262800
Content-Length: <请求体的长度>
---------------------------97476729989295326262800
Content-Disposition: form-data; name="username"
JohnDoe
---------------------------97476729989295326262800
Content-Disposition: form-data; name="avatar"; filename="avatar.jpg"
Content-Type: image/jpeg
<文件的二进制内容>
---------------------------97476729989295326262800--

在上面的例子中,请求体包含两个部分:一个是名为 username 的文本字段,另一个是名为 avatar 的文件字段,包含了一个名为 avatar.jpg 的 JPEG 图片的二进制内容。每个部分的开始和结束都使用了相同的边界字符串来分隔。

使用 multipart/form-data 编码方式可以确保文件和其他二进制数据能够安全、完整地传输到服务器,是文件上传和其他需要发送二进制数据的场景中的常用编码方式。

额外补充(RESTful API )

RESTful API 是一种基于 HTTP 协议设计的软件架构风格,用于构建网络应用程序。它遵循一系列的设计原则,使得 API 易于理解、使用和维护。下面是关于 RESTful API 的一些核心要点:

1. 资源(Resources)

RESTful API 的核心思想是将网络上的所有事物都抽象为资源,每个资源都有一个唯一的标识符(URI)。这些资源可以是用户、订单、文章等任何可以在网络上表示的数据。

2. 动词(Verbs)

HTTP 协议定义了几种请求方法(动词),包括 GET、POST、PUT、DELETE 等,用于对资源进行不同的操作。RESTful API 使用这些 HTTP 方法来表示对资源的不同操作,而不是在 URI 中包含动作。

  • GET:用于请求资源。
  • POST:用于创建资源。
  • PUT:用于更新资源。
  • DELETE:用于删除资源。

3. 无状态(Stateless)

RESTful API 是无状态的,即每个请求都必须包含处理该请求所需的所有信息。服务器不会保存客户端的状态信息,每次请求都是独立的。这有助于提高系统的可伸缩性和可靠性。

4. 统一的接口(Uniform Interface)

RESTful API 强调使用统一的接口来对资源进行操作,这有助于简化客户端和服务器之间的交互。统一的接口包括:

  • 资源识别:通过 URI 识别资源。
  • 操作识别:通过 HTTP 方法识别对资源的操作。
  • 消息传递:通过 HTTP 请求和响应传递消息。
  • 自描述消息:消息中包含足够的信息来描述如何处理它们。

5. 分层系统(Layered System)

RESTful API 可以将系统组件分解为多个层次,每个层次提供不同的功能。这种分层结构有助于限制组件间的依赖关系,提高系统的可伸缩性和可维护性。

6. 客户端-服务器架构(Client-Server Architecture)

RESTful API 采用客户端-服务器架构,客户端负责用户交互和展示数据,服务器负责管理和存储数据。这种分离使得客户端和服务器可以独立进化,提高了系统的可维护性和灵活性。

7. 可缓存(Cacheable)

RESTful API 支持响应缓存,这有助于提高性能并减少网络带宽的使用。客户端可以缓存服务器的响应,并在后续请求中直接使用缓存数据,而不必每次都从服务器获取。

总结

RESTful API 是一种基于 HTTP 协议的软件架构风格,它强调资源的唯一性、无状态性、统一的接口和分层系统等特点。通过遵循这些设计原则,RESTful API 可以构建出易于理解、使用和维护的网络应用程序。

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

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

相关文章

迷宫与陷阱

题目&#xff1a;0迷宫与陷阱 - 蓝桥云课 (lanqiao.cn) 代码&#xff1a; #include<stdio.h> #include<iostream> #include<algorithm> #include<queue> using namespace std;int n,k;//N*N矩阵大小&#xff0c;k无敌状态持续的步数 char map[1010…

Visual Studio 2022之Release版本程序发送到其它计算机运行

目录 1、缺少dll​ 2、应用程序无法正常启动 3、This application failed to start because no Qt platform plugin could be initialized. 代码在Debug模式下正常运行&#xff0c;然后切换到Release模式下&#xff0c;也正常运行&#xff0c;把第三方平台的dll拷贝到exe所在…

主成分分析用于综合评价

主成分分析用于综合评价是一种常用的数据降维方法。它通过寻找数据中的主要方差方向&#xff0c;将高维数据转化为低维数据&#xff0c;以便更好地理解和分析数据。主成分分析可以帮助我们发现数据中的潜在结构和模式&#xff0c;并且可以用较少的维度来表示数据。 在综合评价…

IPv6扩展头(四)——分片头

分片头部&#xff08;Fragment Header&#xff09;用于IPv6源节点向目的节点发送一个大于路径MTU的数据报。 一、优势 IPv6 分片头具有多种优势&#xff0c;可提高网络效率&#xff0c;包括减少数据包延迟和减少网络拥塞。使用 IPv6 分片头&#xff0c;数据包在源处而不是中间…

Uninty 鼠标点击(摄像机发出射线-检测位置)

平面来触发碰撞&#xff0c;胶囊用红色材质方便观察。 脚本挂载到胶囊上方便操作。 目前实现的功能&#xff0c;鼠标左键点击&#xff0c;胶囊就移动到那个位置上。 using System.Collections; using System.Collections.Generic; using UnityEngine;public class c6 : MonoBe…

数据结构-线段树

&#x1f4d1;前言 本文主要是【线段树】——线段树简单使用的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1f304;每日一句&…

将父目录设置为根目录

在用这个这个项目的时候https://github.com/KaiyangZhou/deep-person-reid&#xff0c; 出现了问题 原因是执行python scripts/main.py找不到模块 ModuleNotFoundError: No module named torchreid原因是根目录在当前目录 C:\\Users\\seama\\Documents\\Workspace\\deep-per…

PyCharm Community Edition 2023.3.3,UI界面设置成旧版

File->Settings->Appearance & Behavior->New UI->Enable new UI(取消勾选)->重启PyCharm 旧版UI: 新版UI&#xff1a;

对 JVM 的类加载机制以及寻找字节码文件的“双亲委派模型”的理解

目录 1、JVM 的类加载机制 1.1、加载 1.2、验证 1.3、准备 1.4、解析 1.5、初始化 2、双亲委派模型 2.1、工作过程 1、JVM 的类加载机制 类加载指的是 Java 进程运行的时候&#xff0c;需要把 .class 文件从硬盘读取到内存&#xff0c;并进行一系列的校验解析的过程。…

人民日报:用好“人工智能+” 赋能产业升级

以下文章来源&#xff1a;北京日报 文生视频、智能家居、智慧工厂……近年来&#xff0c;人工智能发展速度之快、应用范围之广备受瞩目。 政府工作报告提出&#xff0c;深化大数据、人工智能等研发应用&#xff0c;开展“人工智能”行动&#xff0c;打造具有国际竞争力的数字产…

力扣589、590、102、107、429、199、637、515、116、117、104、111、226、101-Java刷题笔记

一、589. N 叉树的前序遍历 - 力扣&#xff08;LeetCode&#xff09; 1.1题目 给定一个 n 叉树的根节点 root &#xff0c;返回 其节点值的 前序遍历 。 n 叉树 在输入中按层序遍历进行序列化表示&#xff0c;每组子节点由空值 null 分隔&#xff08;请参见示例&#xff09…

6. 互质

互质 互质 互质 每次测试的时间限制&#xff1a; 3 秒 每次测试的时间限制&#xff1a;3 秒 每次测试的时间限制&#xff1a;3秒 每次测试的内存限制&#xff1a; 256 兆字节 每次测试的内存限制&#xff1a;256 兆字节 每次测试的内存限制&#xff1a;256兆字节 题目描述 给定…

使用Python制作自己的wheel文件

平时自己利用Python制作一个个小工具后想分享给别人&#xff0c;但又嫌分享一堆项目代码很麻烦&#xff0c;那么你可以考虑将自己的项目打包成一个wheel文件&#xff0c;别人拿到文件后只需pip install安装即可使用&#xff0c;非常方便。 在上一篇博文中&#xff0c;利用nvid…

在maven多模块之间调用报错

错误信息为&#xff1a;不能解决maven_02_ssm项目的依赖问题&#xff0c;找不到maven_03_pojo这个jar包。 为什么找不到呢? 原因是Maven会从本地仓库找对应的jar包&#xff0c;但是本地仓库又不存在该jar包所以会报错。 在IDEA中是有maven_03_pojo这个项目&#xff0c;所以…

使用 Python 字典向 SQLite 插入数据

将Python字典数据插入SQLite数据库中其实有很多好处&#xff0c;例如使用字典的结构可以简化插入数据的代码&#xff0c;使其更加紧凑和易于理解。这降低了代码的复杂性&#xff0c;并使代码更易于维护。那么在我们日常使用中会有哪些问题呢&#xff1f;一起看看我是如何解决的…

华为配置DHCP Snooping防止DHCP Server仿冒者攻击示例

配置DHCP Snooping防止DHCP Server仿冒者攻击示例 组网图形 图1 配置DHCP Snooping防止DHCP Server仿冒者攻击组网图 DHCP Snooping简介配置注意事项组网需求配置思路操作步骤配置文件 DHCP Snooping简介 在一次DHCP客户端动态获取IP地址的过程中&#xff0c;DHCP Snoopi…

机器学习知识点复习 上(保研、复试、面试)百面机器学习笔记

机器学习知识点复习上 一、特征工程1. 为什么需要对数值类型的特征做归一化&#xff1f;2. 文本表示模型3. 图像数据不足的处理方法 二、模型评估1.常见的评估指标2.ROC曲线3.为什么在一些场景中要使用余弦相似度而不是欧氏距离&#xff1f;4.过拟合和欠拟合 三、经典算法1.支持…

C语言中的面向切面编程(AOP)

概念 首先给出一段由ChatGPT给出的简短的AOP概念&#xff1a; AOP是一种编程方法&#xff0c;用来将在程序中多处重复出现的代码&#xff08;比如日志、权限控制&#xff09;从主要业务逻辑中抽取出来&#xff0c;提高代码的模块化和可维护性。 抽取后的代码会在原始的业务逻辑…

✅ Windows11 系统 I 卡独显 A770 安装 深度学习 Pytorch 环境

&#x1f4cb; 文献参考 这里非常感谢知乎上的 ‘丢丢’ 的[**Windows系统下英特尔独显Pytorch的历程**] 为我提供了一开始的 I 卡安装想法&#xff01;但是文中并未介绍如何进行额外的环境变量操作问题&#xff0c;导致很多软件直接安装至系统盘&#xff0c;占用系统盘空间&am…

网络、UDP编程

1.网络协议模型: OSI协议模型 应用层 实际发送的数据 表示层 发送的数据是否加密 会话层 是否建立会话连接 传输层 数据传输的方式&#xff08;数据报、流式&#xff09; 网络层 …