causal / simple_api
服务,将 HTTP/REST 请求路由到您的 TYPO3 控制器。
Requires
- php: >= 5.5.0, <= 7.1.99
- typo3/cms-core: >= 7.6.0, <= 8.9.99
Replaces
- simple_api: 1.0.0
- typo3-ter/simple-api: 1.0.0
This package is auto-updated.
Last update: 2024-09-09 13:04:02 UTC
README
服务,将 HTTP/REST 请求路由到您的控制器。
注意:此扩展预期由 TYPO3 开发者使用,并作为路由请求到您自己的业务逻辑的中心枢纽。
功能
- 支持认证方法调用
- 支持本地化调用(考虑语言因素)
- 支持缓存调用,并在您的 API 处理程序中透明访问 TYPO3 缓存框架
- 如果存在头
HTTP_ACCEPT_ENCODING
并包含gzip
,则支持 gzip 负载 - 支持动态生成您的 API 文档
- 在 Backend 编辑记录时自动刷新缓存条目(在相应的标签列表中使用
<table-name>%<uid>
)
此外,此扩展还支持对您的 API 处理程序进行依赖注入,您只需使用 @inject
或以 inject
前缀的方法即可,就像使用 Extbase 编程时那样。
与 EXT:routing 的区别
与 EXT:routing 不同,此扩展不会强制您将 Extbase 控制器/操作映射到路由段,而是基本上允许您注册一个 "段"(通常是第一个段),然后会将整个请求简单地路由到您控制器中的 handle()
方法。
处理程序注册
首先,您应该在您的 ext_emconf.php
配置文件中添加一个依赖项,可以是实际约束,也可以是建议,具体取决于您的喜好
$EM_CONF[$_EXTKEY] = [
// snip
'constraints' => [
'depends' => [
'php' => '5.5.0-7.1.99',
'typo3' => '7.6.0-8.99.99',
],
'conflicts' => [],
'suggests' => [
'simple_api' => '',
],
],
];
然后在 ext_localconf.php
$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['simple_api']['apiHandlers'][] = [
'route' => '/some-route',
'class' => \VENDOR\YourExt\Api\YourClass::class,
];
您可以注册一个模式而不是固定路由
$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['simple_api']['apiPatternHandlers'][] = [
'route' => '/members/\d+/history',
'class' => \VENDOR\YourExt\Api\YourClass::class,
];
您的处理程序必须扩展 \Causal\SimpleApi\Controller\AbstractHandler
。
处理程序键
注册数组支持各种键
-
route [必填]: 要注册的路由。
-
class [必填]: 处理对应路由请求的类。
-
contentType [可选]: POST 请求接受的负载内容类型,将在调用处理程序之前自动解码。
-
methods [可选]: 处理程序接受的逗号分隔的 HTTP 方法列表(例如,“POST”)。默认为无限制。
-
restricted [可选]: API 调用是否期望经过认证的调用(使用
HTTP_X_AUTHORIZATION
头)。如果限制对 API 部分的访问,您必须注册一个名为/authenticate
的路由,该路由将获取HTTP_X_AUTHORIZATION
头,对其进行操作,并返回一个包含以下键的数组success => true
(或false
)。将作为_authenticated
布尔标志传递给 API 处理程序- 自定义键将使用
_
前缀,并按原样传递给 API 处理程序(例如,user
将成为_user
) - 自定义布尔标志
demo
可用于指定认证成功但具有 "演示" 功能。您需要在 API 控制器中处理它,通过检查预期的布尔标志参数_demo
。
提示:如果存在
HTTP_X_AUTHORIZATION
头,即使没有明确标记处理程序为 "受限制的",也会进行认证并调用您的处理程序,无论调用结果如何。 -
已弃用 [可选]: 标记相应路由在文档中为已弃用的布尔标志。
负载
以下规则适用于您从 API 处理程序返回的负载
- 期望有效载荷是一个数组,并以
application/json
的内容类型返回。如果您想返回其他内容类型(如图像),您应在自己的API处理器中完成,然后调用exit()
。 - 如果抛出异常,它将被捕获并封装成HTTP 500错误。唯一的例外是如果抛出异常
\Causal\SimpleApi\Exception\ForbiddenException
,则会抛出HTTP 403错误。 - 如果没有找到处理器,将返回HTTP 404错误。
已知问题及解决方案
-
可以在API处理器中使用Extbase存储库,但您需要从基类手动调用方法
includeTCA()
,以便返回的对象可以使用Extbase映射。此调用通常应作为您可以在处理器中重写的initialize()
方法的一部分,该方法在调用handle()
之前被调用。注意:如果您不正确地包含域模型的TCA,您可能会通过将不完整的映射定义存储到
extbase_datamapfactory_datamap
的缓存后端(例如,具有默认TYPO3设置的表cf_extbase_datamapfactory_datamap
)来损坏Extbase数据映射缓存。在这种情况下,您需要手动刷新该缓存。
安装
-
将此存储库克隆到
typo3conf/ext/simple_api
cd /path/to/typo3conf/ext/ git clone https://github.com/xperseguers/t3ext-simple_api.git simple_api
或者,您可以通过composer加载它
composer require causal/simple_api
-
转到扩展管理器并激活扩展
simple_api
-
将重写规则添加到您的
.htaccess
文件中。例如,RewriteRule ^api/(.*)$ /index.php?eID=simple_api&route=$1 [QSA,L]
或者,如果您正在使用Nginx
rewrite ^/api/(.*)$ /index.php?eID=simple_api&route=$1 last;
这将导致使用此扩展来处理以
api/
开头的请求。
提示:如果您需要支持本地化(&L=<some-language-uid>
),则应将上述建议的路由更改为包括您网站的根页面UID(&id=<some-uid>
)。这是必需的,因为在复杂环境中,本地化模式和默认语言可能不同,因此无法推断。