客户端向服务端传参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 路径,并附加了两个查询参数:nameagename=xxxage=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.namereq.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 路径,并附加了两个查询参数:nameagename=xxxage=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.namereq.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 请求体发送到服务器。

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

复制代码

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 可以构建出易于理解、使用和维护的网络应用程序。

相关推荐
hlsd#19 分钟前
go mod 依赖管理
开发语言·后端·golang
小春学渗透21 分钟前
Day107:代码审计-PHP模型开发篇&MVC层&RCE执行&文件对比法&1day分析&0day验证
开发语言·安全·web安全·php·mvc
四喜花露水22 分钟前
Vue 自定义icon组件封装SVG图标
前端·javascript·vue.js
陈大爷(有低保)23 分钟前
三层架构和MVC以及它们的融合
后端·mvc
亦世凡华、24 分钟前
【启程Golang之旅】从零开始构建可扩展的微服务架构
开发语言·经验分享·后端·golang
河西石头25 分钟前
一步一步从asp.net core mvc中访问asp.net core WebApi
后端·asp.net·mvc·.net core访问api·httpclient的使用
前端Hardy31 分钟前
HTML&CSS: 实现可爱的冰墩墩
前端·javascript·css·html·css3
2401_8574396936 分钟前
SpringBoot框架在资产管理中的应用
java·spring boot·后端
怀旧66638 分钟前
spring boot 项目配置https服务
java·spring boot·后端·学习·个人开发·1024程序员节
落樱坠入星野1 小时前
拿下阿里云之后如何在本地运行镜像进行分析
经验分享·安全·网络安全·阿里云·云计算