一文说清params query body的区别 | 青训营

2,415 阅读3分钟

一文说清params query body的区别| 青训营

当涉及到网络Web编程时,特别是在构建和处理HTTP请求时,"params"、"query"和"body"是常用的术语,用于描述请求中的不同部分。以前我经常搞混,下面让我介绍一下他们的区别

1. Params(路径参数):

  • 定义: 路径参数,也称为"params",是指URL路径中的变量部分,通常以冒号":"开头。例如,/users/:id中的":id"就是一个路径参数。路径参数用于向服务器传递一些标识符或关键信息,服务器可以根据这些信息执行相应的操作。
  • 用途: 路径参数通常用于标识请求的资源或操作。例如,在RESTful API中,使用路径参数来指定要获取、更新或删除的特定资源,如/users/123表示获取ID为123的用户信息。
  • 示例: 对于路径参数/users/:id,如果请求的URL为/users/123,则参数"id"的值为"123"。

2. Query Parameters(查询参数):

  • 定义: 查询参数,也称为"query"参数,是指在URL中以问号"?"开始的键值对。它们用于向服务器传递额外的数据,这些数据通常用于筛选、排序、分页等操作。
  • 用途: 查询参数常用于在HTTP请求中传递一些控制信息,以指定如何处理请求的数据。例如,在一个搜索功能中,查询参数可以用于指定搜索关键字、排序方式和每页显示的数量。
  • 示例: 对于URL/products?category=electronics&page=1&sort=price,查询参数包括"category"、"page"和"sort",分别对应了商品分类、页码和排序方式。

3. Request Body(请求体):

  • 定义: 请求体,也称为"body",是HTTP请求中的数据部分,通常用于传递请求的实际内容,如表单数据、JSON、XML等。

  • 用途: 用于传递客户端向服务器发送的数据。通常在 POST、PUT、PATCH 等请求方法中使用。请求体可以包含各种格式的数据,最常见的是 JSON、XML、表单数据等。

  • 数据格式:请求体可以以多种格式发送数据,包括但不限于:

    • JSON:最常见的数据格式之一,用于表示结构化数据,特别适用于 API 请求。
    • XML:另一种结构化数据格式,用于表示标记式数据。
    • Form Data:通常在 HTML 表单提交中使用,以键值对的形式发送数据。
    • Multipart Form Data:用于上传文件等复杂数据,支持多个键值对和文件上传。
    • Text/Plain:用于发送纯文本数据。
  • 内容类型(Content-Type) :请求体的内容类型通过 HTTP 请求头中的 Content-Type 字段来指定。不同的数据格式对应不同的 Content-Type 值。例如:

    • JSON:Content-Type: application/json
    • XML:Content-Type: application/xml
    • Form Data:Content-Type: application/x-www-form-urlencoded
    • Multipart Form Data:Content-Type: multipart/form-data
    • Text/Plain:Content-Type: text/plain
  • 示例: 对于一个创建新用户的请求,请求体可能包含用户的姓名、电子邮件地址和密码等信息。

POST /api/users
{
    "name": "John Doe",
    "email": "john@example.com"
}

下面是Golang用gin框架的Web实例代码:

package main
​
import (
    "net/http"
    "github.com/gin-gonic/gin"
)
​
func main() {
    router := gin.Default()
    
    // 处理带路径参数的 GET 请求
    router.GET("/api/users/:id", func(c *gin.Context) {
        // 获取路径参数 "id"
        userID := c.Param("id")
​
        // 在实际应用中,可以根据路径参数进行相应的处理
        c.JSON(http.StatusOK, gin.H{
            "userID": userID,
        })
    })
​
    // 处理带查询参数的 GET 请求
    router.GET("/api/products", func(c *gin.Context) {
        category := c.Query("category")
        sort := c.DefaultQuery("sort", "defaultSort")
​
        // 在实际应用中,可以根据查询参数进行相应的处理
        c.JSON(http.StatusOK, gin.H{
            "category": category,
            "sort":     sort,
        })
    })
​
    // 处理带 JSON 请求体的 POST 请求
    router.POST("/api/users", func(c *gin.Context) {
        var user struct {
            Name  string `json:"name"`
            Email string `json:"email"`
        }
​
        if err := c.ShouldBindJSON(&user); err != nil {
            c.JSON(http.StatusBadRequest, gin.H{
                "error": err.Error(),
            })
            return
        }
​
        // 在实际应用中,可以使用解析后的 user 对象进行相应的处理
        c.JSON(http.StatusOK, user)
    })
​
    router.Run(":8080")
}