Yii2 REST 在 POST、PUT 等上给出 405

Yii2 REST giving a 405 on POST, PUT, etc

我正在尝试在 Yii2 高级应用程序中构建一个 REST API 来管理对我的数据库的简单查询。 按照一些教程,最终在快速入门指南中逐步构建示例,并让我的模型适用于 GET 和 HEAD 方法。

在模块内创建了我的 API 服务,正确设置,使用最少的设置,请求 backend/main 上的 JSON 解析器。php,在 [= 中注册了模块27=].php 并在 urlManager 中也创建了规则(低于最基本的规则,enablePrettyUrl,controller/action,...):

['class' => 'yii\rest\UrlRule', 'controller' => ['precapi']]

但是每当我通过 CURL 或 Postman REST Client 尝试其他方法时,它总是给我一个 405 错误:

Method Not Allowed. This url can only handle the following request methods: GET, HEAD.

我想我已经尝试了很多不同的配置和路径试图解决它,但没有任何结果。 唯一的问题是 urlManager 中的 'enableStrictParsing' => false',因为它在某些 URL 上给了我一个 404 错误,并且 POST 也不适用于此,尽管应用程序照常工作。

如有任何帮助,我们将不胜感激。 问候。

如果没有关于你的 precapi 控制器基于什么的更多信息,我将假设它来自 \yii\rest\ActiveController?

如果是这样,您可能需要覆盖控制器中的 verbs() 函数: 默认实现是这样的:

protected function verbs()
{
    return [
        'index' => ['GET', 'HEAD'],
        'view' => ['GET', 'HEAD'],
        'create' => ['POST'],
        'update' => ['PUT', 'PATCH'],
        'delete' => ['DELETE'],
    ];
}

我认为,鉴于您的评论,UrlManager 配置确实存在一个小问题,所以我出去阅读了一些东西,看到您将控制器添加到一个模块中。
The manual has this to say:

The controller ID (e.g. user, post-comment) that the rules in this composite rule are dealing with. It should be prefixed with the module ID if the controller is within a module (e.g. admin/user).

这可能是问题所在吗?

我认为是复数问题,试试这个

['class' => 'yii\rest\UrlRule', 'controller' => 'precapi', 'pluralize'=>false],

我在问这个问题,因为我遇到了这个问题,为了找到解决方案整天都在杀人。我非常愚蠢。 不是YII2框架的问题,是curl的问题。 不是某些控制器、动作或行为的问题,而是正确拼写 curl 命令的问题。

这是错误的命令 - 删除或放置不起作用并引发 405 错误:

curl -i -H "Accept:application/json" -H "Content-Type:application/json" -XDELETE "http://test.test.in/test" -d '{"myid": "2"}'

HTTP/1.1 405 方法不允许 服务器:nginx/1.8.1 日期:2016 年 6 月 26 日,星期日 07:47:51 GMT 内容类型:application/json;字符集=UTF-8 内容长度:0 连接:保持活动状态 X-Powered-By:PHP/5.6.22 允许:GET、POST、HEAD、OPTIONS

这是 curl 命令的正确方式: curl -i -H "Accept:application/json" -H "Content-Type:application/json" -XDELETE "http://test.test.in/test/2"

HTTP/1.1 204 无内容 服务器:nginx/1.8.1 日期:2016 年 6 月 26 日,星期日 07:49:19 GMT 内容类型:application/json;字符集=UTF-8 内容长度:0 连接:保持活动状态 X-Powered-By: PHP/5.6.22

就这些,祝你好运!

我想添加我今天遇到的可能的问题和解决方案。它在 URL 中有额外的 / 类似 http://localhost:8080/index.php/module/controller_id/?access-token=_token_here

请注意 URL 中的 / 在 controller_id

之后是多么微妙

这是我的问题,我通过删除额外的 /

解决了