jQuery $.post通过REST路由请求时$_SERVER['REQUEST_METHOD']异常
jQuery $.post 请求自定义REST路由出现REQUEST_METHOD匹配异常
基础配置与报错现象
我的REST端点路由配置如下:
'foo/bar'=>[ 'GET'=>[ 'controller'=>$fooController, 'action'=>'baz' ], 'POST'=>[ 'controller'=>$fooController, 'action'=>'barSave' ] ],
使用jQuery 3.6.0版本的$.post()发起请求的代码如下:
$.post({ url: '/foo/bar', data: data, success: function(data, status, jqXHR){ alert('Post successful'); }, error: function (jqXHR, status){ alert('Post failed: ' + jqXHR.responseText) }, dataType: "JSON" });
请求返回的jqXHR.responseText提示入口文件存在undefined index POST错误,报错代码行为:
$controller = $routes[$this->route][$this->method]['controller'];
其中$this->method的取值直接来自$_SERVER['REQUEST_METHOD']。
该异常仅出现在jQuery发起的POST请求中,所有原生表单提交的POST请求走同一套路由逻辑均能正常运行,查阅jQuery官方接口文档未找到相关问题说明。
补充路由逻辑与异常细节
现有路由实现逻辑
入口文件index.php中的初始化代码如下:
$route = ltrim(strtok($_SERVER['REQUEST_URI'], '?'), '/'); $method = $_SERVER['REQUEST_METHOD']; $entrypoint = new \Entrypoint($route, new \Routes(), $method); $entrypoint->enter();
Routes类构造方法会初始化所有依赖的模型实例并存为类变量,通过getRoutes()方法基于已实例化的模型生成对应控制器,返回格式与上文展示的路由配置一致的$routes数组:以controller/action格式的URI为键,对应值包含该路径支持的请求方法、绑定的控制器实例与动作方法。Entrypoint->enter()方法首先校验请求URI并存入$this->route,完成用户重认证逻辑后,通过以下代码匹配当前请求对应的控制器与动作:
$controller = $routes[$this->route][$this->method]['controller']; $action = $routes[$this->route][$this->method]['action'];
匹配完成后初始化视图实例,调用$view->output($model)输出响应结果,整套逻辑已在多个过往项目中稳定运行无异常。
异常具体表现
首次使用jQuery $.post()方法测试功能时即出现异常,具体现象包括:
- 向配置好的
/foo/bar地址发起POST请求失败,向不存在的/foo/foo/bar地址发起请求反而能命中处理逻辑 - 响应会返回未手动配置的303状态码
- 错误请求不会按照原有逻辑返回自定义404响应
- 异常出现一段时间后,Chrome开发者工具的网络面板甚至不再显示这些jQuery发起的请求
- 清空浏览器缓存后上述异常仍然存在
- 将POST处理动作迁移到当前页面对应的控制器后,
$.post()请求可以稳定运行,因此曾怀疑是REST路由触发了未知的回退逻辑
已确认请求URL填写的是绝对路径'/foo/bar'而非相对路径'foo/bar',甚至尝试过通过var absUrl = window.location.origin+"/foo/bar"拼接完整绝对地址发起请求,问题仍然复现。
本人前端基础薄弱,日常可独立完成常规功能开发,这是第一次使用jQuery,目前排查思路受阻,无法理解异常产生的逻辑,希望能定位问题根本原因。
内容的提问来源于stack exchange,提问作者jgtokyo
相关产品推荐
相关产品推荐

