我尝试在Yii2高级应用程序中构建REST API,以管理对数据库的简单查询。 在一些教程之后,最后逐步构建指南中的示例,快速入门,并使我的模型适用于GET和HEAD方法。
在模块中创建我的API服务,使用最少的设置正确设置,在backend / main.php上请求JSON解析器,在common / main.php中注册模块并在urlManager中创建规则(在最小的通常下面) rules,enablePrettyUrl,controller / action,...):
['class' => 'yii\rest\UrlRule', 'controller' => ['precapi']]
但每当我尝试其他方法时,通过CURL或Postman REST Client,它总会给我一个 405 错误:
不允许的方法。此网址只能处理以下请求 方法:GET,HEAD。
我想我已经尝试了很多不同的配置和路径试图解决它,但没有任何结果。
在urlManager中只有'enableStrictParsing' => false'
,因为它在某些URL上给出了404错误,而POST也不能用于此,尽管应用程序正常工作。
任何帮助将不胜感激。 问候。
答案 0 :(得分:9)
我认为是复数问题,试试这个
['class' => 'yii\rest\UrlRule', 'controller' => 'precapi', 'pluralize'=>false],
答案 1 :(得分:7)
如果没有关于您的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:
此复合规则中的规则正在处理的控制器ID(例如,用户,后评论)。 如果控制器位于模块内(例如管理员/用户),则应使用模块ID作为前缀。
这可能是问题吗?
答案 2 :(得分:1)
我在这个问题上问,因为我有这个问题并且整天都在寻找解决办法。我非常愚蠢。 这不是YII2框架的问题,但它是一个卷曲问题。 不是某些控制器,操作或行为的问题,而是使用正确的拼写卷曲命令。
这是错误的命令 - 删除或放置不工作并引发405错误:
curl -i -H"接受: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 Content-Type:application / json;字符集= UTF-8 内容长度:0 连接:保持活力 X-Powered-By:PHP / 5.6.22 允许:GET,POST,HEAD,OPTIONS
这是正确和正确的方式curl的命令: curl -i -H"接受: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 Content-Type:application / json;字符集= UTF-8 内容长度:0 连接:保持活力 X-Powered-By:PHP / 5.6.22
这就是全部,祝你好运!
答案 3 :(得分:1)
我想添加我今天遇到的可能的问题和解决方案。它在网址中有额外的/
,例如http://localhost:8080/index.php/module/controller_id/?access-token=_token_here
注意URL中的微妙/
在controller_id
这是我的问题,我通过删除额外的/