register_rest_route("abc/v1", "/orders", [
  "methods"  => ["GET", "POST"],
  "callback" => "abc_orders_handler",
  "permission_callback" => "__return_true",
]);

用浏览器直接打开插件注册的回调地址,返回 405,响应体里写着 No route was found matching the URL and request method。换成 curl 发 POST 到同一个地址却是通的。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。

原因不复杂,注册路由时 methods 只写了 POST,GET 在匹配阶段就被挡掉,报出来的错看着像路径不存在。REST 服务按方法拆开匹配,同一路径允许哪几种方法要显式列全。

「REST methods 405」改完先别急着全量,挑一台机器放半天,真有问题这段时间就能看出来。改动写完就同步给同事,下一个人踩同一个坑,成本还是你的。

验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。

处理上按这个顺序:把 methods 写成可读和可写两种 或者直接在数组里列出 GET 与 POST;回调里按请求方法分支 别只留一条写库逻辑;改完请求一次 REST 索引 确认 methods 字段里两个方法都在。

改完只确认一件事:浏览器直接打开该地址返回 200,索引接口里这条路由的 methods 显示 GET 和 POST。

作者 9823189