如何在 TYPO3 8.7中通过GET请求调用控制器动作并返回JSON

老丽吖_9388

老丽吖_9388

2026-03-26

983人浏览

原创

如何在 TYPO3 8.7中通过GET请求调用控制器动作并返回JSON

本文详解在typo3 8.7中为extbase扩展创建无模板的json接口:包括正确构造get url、配置专用ajax页面、禁用html输出、生成合法chash,以及使用postman安全调试的完整流程。

本文详解在typo3 8.7中为extbase扩展创建无模板的json接口:包括正确构造get url、配置专用ajax页面、禁用html输出、生成合法chash,以及使用postman安全调试的完整流程。

在TYPO3中暴露一个纯JSON接口(如供Postman或前端AJAX调用),不能仅依赖echo json_encode()——必须遵循Extbase的调度机制与TYPO3的缓存/安全规则。以下是以test_extension为例的标准化实现方案。

✅ 正确构造GET请求URL

Extbase插件的路由参数需严格遵循命名规范:tx_{extension_key}_{plugin_name}[controller] 和 tx_{extension_key}_{plugin_name}[action]。假设你的扩展键为 test_extension,插件名称(pluginName)为 TestPlugin(通常在ext_localconf.php中注册,如\TYPO3\CMS\Extbase\Utility\ExtensionUtility::configurePlugin(...)),则完整URL格式为:

https://yoursite.com/?id=123&tx_test_extension_testplugin[controller]=TestRequest&tx_test_extension_testplugin[action]=test

⚠️ 注意事项:

  • id=123 是页面UID(即挂载了该插件的TYPO3页面ID),不是你扩展的业务参数;
  • 若需传递自定义参数(如?uid=456),应写作 tx_test_extension_testplugin[uid]=456;
  • cHash是必需的:TYPO3 8.7默认启用cHash校验以防止参数篡改。直接拼接URL会因缺少cHash导致404或空响应。切勿手动计算——应通过Fluid视图助手或PHP API生成。

✅ 推荐实践:创建专用“Ajax页面”并配置JSON输出

为避免干扰主站布局、确保纯净JSON响应,建议创建独立页面专用于API调用:

  1. 新建页面(如命名为 Ajax API),在页属性 → “类型” 中选择 “Shortcut” → “External URL” 或更推荐:“Standard” + 隐藏于菜单;

  2. 在该页面上插入你的插件(Backend → 页面模块 → 编辑内容 → 添加插件);

  3. 配置页面类型为JSON:进入该页面的“常规”属性 → “类型”下拉选 “JSON”(若未显示,请确认已安装fluid_styled_content且config.tx_extbase.features.skipDefaultArguments = 1等基础配置正常);

  4. 关键:禁用所有非JSON输出
    在页面TSConfig或站点配置(config.yaml)中添加:

    page.config {
      disableAllHeaderCode = 1
      xhtml_cleaning = 0
      no_cache = 1
    }

    并在插件的TypoScript setup中强制清除HTML包装:

    Json Repair Kit
    Json Repair Kit

    使用 Node.js 评估修复格式错误的 JSON,自动纠正尾随逗号、单引号、未加引号的键等常见问题,实现文件规范化。

    下载
    plugin.tx_testextension_testplugin {
      view {
        templateRootPaths.0 = EXT:test_extension/Resources/Private/Templates/
        partialRootPaths.0 = EXT:test_extension/Resources/Private/Partials/
        layoutRootPaths.0 = EXT:test_extension/Resources/Private/Layouts/
      }
      settings {
        # 确保不渲染任何Fluid模板
      }
    }

✅ 控制器代码优化(安全 & 兼容)

原始写法存在隐患:直接echo绕过TYPO3响应生命周期,可能被缓冲、压缩或注入HTML头。应改用ResponseInterface(TYPO3 8.7支持):

use Psr\Http\Message\ResponseInterface;
use TYPO3\CMS\Core\Http\JsonResponse;

class TestRequestController extends ActionController
{
    public function testAction(): ResponseInterface
    {
        $data = [
            'test' => 123,
            'timestamp' => time(),
            'extension' => 'test_extension'
        ];
        return new JsonResponse($data);
    }
}

✅ 优势:自动设置Content-Type: application/json、处理字符编码、兼容PSR-7标准,且与cHash校验无缝协同。

✅ 使用Postman调试步骤

  1. 访问你配置好的Ajax页面URL(如 https://yoursite.com/ajax-api/),先在浏览器打开一次,观察地址栏是否自动追加了&cHash=xxxx——这是TYPO3生成的有效哈希;

  2. 复制完整URL(含cHash),粘贴至Postman的GET请求栏;

  3. 发送请求,验证响应状态码为200,响应体为格式化JSON;

  4. 后续开发中,可通过 Fluid标签动态生成带cHash的URL:

    <uri.action controller="TestRequest" action="test" extensionname="test_extension" pluginname="TestPlugin" pageuid="123"></uri.action>

⚠️ 常见错误排查

现象 原因 解决方案
返回空白页或404 URL中缺失cHash,或id指向了未挂载插件的页面 检查插件是否真正在目标页面上;用浏览器首次访问获取有效cHash
JSON被HTML包裹 未禁用disableAllHeaderCode或页面类型非JSON 强制设置page.config.disableAllHeaderCode = 1,确认页面类型为JSON
cHash不匹配报错 参数变动后未刷新cHash(如启用了静态缓存) 清除所有缓存(var/cache/ + 后台“清除全部缓存”),或临时设$GLOBALS['TYPO3_CONF_VARS']['FE']['pageTypeNoCache'] = [100];(100为JSON页面类型ID)

掌握此模式后,你可快速为任意Extbase动作提供RESTful接口,兼顾TYPO3安全性与前端调用灵活性。

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2023.09.01

11484

6

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.11

6641

5

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.11

2175

5

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

2023.10.23

4208

4

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

2023.10.23

4914

6

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.03

3851

9

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.09

5557

8

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.13

4362

8

sprintf函数用法详解
sprintf函数用法详解

sprintf函数的用法:1、格式化字符串;2、指定输出宽度和精度;3、返回值。更多关于sprintf函数用法详解的内容,大家可以阅读下面的文章。

2023.11.27

12302

4

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程