请求和响应 Requests and Responses

了解有关最流行的无头 CMS Strapi 的请求和响应的更多信息。

Strapi 后端服务器基于 Koa。当您通过 REST API 发送请求时,上下文对象 (ctx) 会传递给 Strapi 后端的每个元素(例如 policiescontrollersservices)。

ctx 包含 3 个主要对象:

  • ctx.request 用于获取客户端发出 API 请求时发送的请求信息,
  • ctx.state 用于获取 Strapi 后端内请求状态信息,
  • ctx.response 用于获取服务器将返回的响应信息。

还可以使用 strapi.requestContext 函数 从代码中的任何位置访问请求的上下文。

除了以下文档中描述的概念和参数外,您还可以在 Koa 请求文档Koa Router 文档Koa 响应文档 中找到更多信息。

简化的 Strapi 后端图,突出显示了请求和响应

该图表示请求如何通过 Strapi 后端的简化版本,其中突出显示了请求和响应。后端定制介绍页面包含一个完整的交互式图表

ctx.request

ctx.request 对象包含以下参数:

参数描述类型
ctx.request.body解析后的主体版本。Object
ctx.request.files随请求发送的文件。Array
ctx.request.headers随请求发送的标头。Object
ctx.request.hostURL 的主机部分,包括端口。String
ctx.request.hostnameURL 的主机部分,不包括端口。String
ctx.request.href请求资源的完整 URL,包括协议、域、端口(如果指定)、路径和查询参数。String
ctx.request.ip发送请求的人的 IP。String
ctx.request.ips当存在 X-Forwarded-For 并且启用了 app.proxy 时,将返回一个 IP 数组,从上游到下游排序。

例如,如果值为“client, proxy1, proxy2”,您将收到 ["client", "proxy1", "proxy2"] 数组。
Array
ctx.request.method请求方法(例如 GETPOST)。String
ctx.request.origin第一个 / 之前的 URL 部分。String
ctx.request.paramsURL 中发送的参数。

例如,如果内部 URL 是 /restaurants/:id,则您在实际请求中替换 :id 的任何内容都可以通过 ctx.request.params.id 访问。
Object
ctx.request.path请求资源的路径,不包括查询参数。String
ctx.request.protocol使用的协议(例如,httpshttp)。String
ctx.request.queryStrapi 特定的 查询参数Object
ctx.request.subdomainsURL 中包含的子域。

例如,如果域是 tobi.ferrets.example.com,则值为以下数组:["ferrets", "tobi"]
Array
ctx.request.url请求资源的路径和查询参数,不包括协议、域和端口。String

协议、来源、url、href、路径、主机和主机名之间的区别:

给定一个发送到 https://example.com:1337/api/restaurants?id=123 URL 的 API 请求,以下是 ctx.request 对象返回的不同参数:

参数返回值
ctx.request.hrefhttps://example.com:1337/api/restaurants?id=123
ctx.request.protocolhttps
ctx.request.hostlocalhost:1337
ctx.request.hostnamelocalhost
ctx.request.originhttps://example.com:1337
ctx.request.url/api/restaurants?id=123
ctx.request.path/api/restaurants

ctx.request.query

ctx.request 提供了一个 query 对象,可以访问 Strapi 查询参数。下表列出了可用的参数,并附有简短说明和相关 REST API 文档部分的链接(有关更多信息,请参阅 REST API 参数):

参数说明类型
ctx.request.query
ctx.query
整个查询对象。对象
ctx.request.query.sort用于 对响应进行排序 的参数StringArray
ctx.request.query.filters用于 过滤响应 的参数Object
ctx.request.query.populate用于 填充关系、组件或动态区域 的参数StringObject
ctx.request.query.fields用于 仅选择与响应一起返回的特定字段 的参数Array
ctx.request.query.pagination用于 翻阅条目 的参数Object
ctx.request.query.publicationState选择草稿和发布状态 的参数String
ctx.request.query.locale选择一个或多个语言环境 的参数StringArray

ctx.state

ctx.state 对象允许访问 Strapi 后端内请求的状态,包括有关 用户身份验证路由 的特定值:

参数说明类型
ctx.state.isAuthenticated返回当前用户是否以任何方式进行了身份验证。Boolean

ctx.state.user

ctx.state.user 对象允许访问有关执行请求的用户的信息,并包含以下参数:

参数说明类型
ctx.state.user用户信息。仅填充一个关系。Object
ctx.state.user.role用户角色Object

ctx.state.auth

ctx.state.auth 对象允许访问与身份验证相关的信息,并包含以下参数:

参数说明类型
ctx.state.auth.strategy有关当前使用的身份验证策略的信息(用户和权限插件API 令牌Object
ctx.state.auth.strategy.name当前使用的策略的名称String
ctx.state.auth.credentials用户的凭据String

ctx.state.route

ctx.state.route 对象允许访问与当前路由相关的信息,并包含以下参数:

参数说明类型
ctx.state.route.method用于访问当前路由的方法。String
ctx.state.route.path当前路由的路径。String
ctx.state.route.config当前路由的配置信息。Object
ctx.state.route.handler当前路由的处理程序(控制器)。Object
ctx.state.route.info当前路由的其他信息,例如 apiName 和 API 请求类型。Object
ctx.state.route.info.apiName使用的 API 的名称。String
ctx.state.route.info.type使用的 API 的类型。String

ctx.response

ctx.response 对象可以访问并返回服务器的响应信息,并包括以下参数:

参数描述类型
ctx.response.body响应主体。任何
ctx.响应.状态响应的状态代码。整数
ctx.response.message响应的状态消息。

默认情况下,response.messageresponse.status相关联。
字符串
ctx.response.header
ctx.response.headers
与响应一起发送的标头。对象
ctx.响应.长度Content-Length 标头值(如果存在)为数字,或从 ctx.body (如果可能);否则返回 undefinedInteger
ctx.response.redirect
ctx.response.redirect(url, [alt])
执行 302 重定向至URL。字符串“back”是特殊情况,用于提供 Referrer 支持;当 Referrer 不存在时,将使用 alt 或“/”。

示例:ctx.response.redirect('back ', '/index.html');
函数
ctx.response.attachment

ctx.response.attachment([filename], [options])
设置 Content-Disposition 标头添加到“附件”以通知客户端提示下载。可选择指定下载的文件名和一些 选项Function
ctx.response.typeContent-Type 标头,没有“charset”等参数。String
ctx.response.lastModifiedLast-Modified 标头作为日期(如果存在)。DateTime
ctx.response.etag设置响应的 ETag,包括包装的“s”。
没有相应的 response.etag getter。
String

在任何地方访问请求上下文

✨ v4.3.9 中的新功能

strapi.requestContext 适用于 Strapi v4.3.9+。

Strapi 公开了一种从代码中的任何位置访问当前请求上下文的方法(例如生命周期函数)。

您可以按如下方式访问请求:

js
const ctx = strapi.requestContext.get()

您只应在 HTTP 请求上下文中调用的函数内部使用它。

ts
// correct

const service = {
  myFunction() {
    const ctx = strapi.requestContext.get()
    console.log(ctx.state.user)
  },
}

// incorrect
const ctx = strapi.requestContext.get()

const service = {
  myFunction() {
    console.log(ctx.state.user)
  },
}

Example:

./api/test/content-types/article/lifecycles.js
js
module.exports = {
  beforeUpdate() {
    const ctx = strapi.requestContext.get()

    console.log('User info in service: ', ctx.state.user)
  },
}

Strapi 使用名为 AsyncLocalStorage 的 Node.js 功能来使上下文可在任何地方使用。