TYPO3 10.4如何接入外部API?求基础实现示例或指引
TYPO3扩展中调用外部API的基础实现示例
TYPO3推荐使用框架内置的HttpClientInterface处理HTTP请求,下面是一个在扩展Service类中调用外部GET API的完整实现示例:
1. 创建API Service类
在你的扩展目录下新建Classes/Service/ExternalApiService.php,编写API请求逻辑:
<?php declare(strict_types=1); namespace Vendor\YourExtensionKey\Service; use Psr\Http\Client\ClientInterface; use Psr\Http\Message\RequestFactoryInterface; use TYPO3\CMS\Core\Utility\GeneralUtility; class ExternalApiService { protected ClientInterface $httpClient; protected RequestFactoryInterface $requestFactory; // 构造函数注入依赖(TYPO3 10+ 支持) public function __construct( ClientInterface $httpClient, RequestFactoryInterface $requestFactory ) { $this->httpClient = $httpClient; $this->requestFactory = $requestFactory; } /** * 调用外部GET API并返回解析后的JSON数据 * @param string $apiUrl 完整API请求地址 * @param array $queryParams URL查询参数(可选) * @return array|null */ public function fetchApiData(string $apiUrl, array $queryParams = []): ?array { // 拼接查询参数到URL if (!empty($queryParams)) { $apiUrl .= '?' . http_build_query($queryParams); } try { // 创建GET请求 $request = $this->requestFactory->createRequest('GET', $apiUrl); // 按需添加请求头,比如授权信息 // $request = $request->withHeader('Authorization', 'Bearer ' . $yourApiToken); // 发送请求并获取响应 $response = $this->httpClient->sendRequest($request); // 检查响应状态码 if ($response->getStatusCode() !== 200) { GeneralUtility::devLog( 'API请求失败', 'your_extension_key', 3, ['status_code' => $response->getStatusCode(), 'url' => $apiUrl] ); return null; } // 解析JSON响应 $responseData = json_decode((string)$response->getBody(), true); if (json_last_error() !== JSON_ERROR_NONE) { GeneralUtility::devLog( 'API响应解析失败', 'your_extension_key', 3, ['error' => json_last_error_msg(), 'response' => (string)$response->getBody()] ); return null; } return $responseData; } catch (\Exception $e) { // 捕获网络类异常 GeneralUtility::devLog( 'API请求异常', 'your_extension_key', 3, ['error' => $e->getMessage(), 'url' => $apiUrl] ); return null; } } }
2. 依赖注入配置(TYPO3 11+可省略)
如果你的TYPO3版本低于11,需要在扩展的Configuration/Services.yaml中注册Service:
services: Vendor\YourExtensionKey\Service\ExternalApiService: arguments: $httpClient: '@typo3.http.client' $requestFactory: '@typo3.http.request_factory'
TYPO3 11及以上版本会自动识别构造函数依赖并完成注入,无需手动配置。
3. 在控制器/其他类中调用Service
示例:在前端控制器中注入并使用该Service:
<?php declare(strict_types=1); namespace Vendor\YourExtensionKey\Controller; use Vendor\YourExtensionKey\Service\ExternalApiService; use TYPO3\CMS\Extbase\Mvc\Controller\ActionController; class ExampleController extends ActionController { protected ExternalApiService $externalApiService; public function __construct(ExternalApiService $externalApiService) { $this->externalApiService = $externalApiService; } public function showApiDataAction() { // 从扩展配置读取API地址(推荐,避免硬编码) $apiUrl = $GLOBALS['TYPO3_CONF_VARS']['EXTENSIONS']['your_extension_key']['api_base_url'] . '/data'; // 可选:添加查询参数 $params = ['category' => 'news', 'limit' => 10]; $apiData = $this->externalApiService->fetchApiData($apiUrl, $params); $this->view->assign('apiData', $apiData); } }
关键注意事项
- 敏感信息配置:将API密钥、基础URL等存入扩展配置(可通过扩展配置模块设置),通过
$GLOBALS['TYPO3_CONF_VARS']['EXTENSIONS']['your_extension_key']读取,禁止硬编码。 - 错误处理:必须捕获请求异常、状态码错误、JSON解析错误等场景,通过
devLog记录错误便于调试,避免页面崩溃。 - 请求头定制:如果API需要授权(如Bearer Token),在创建请求时添加对应请求头即可。
内容的提问来源于stack exchange,提问作者yonea
相关产品推荐
相关产品推荐

