Laravel 5.6.14中的“405方法不允许”

时间:2018-03-30 06:43:35

标签: php laravel laravel-5

我只是在学习laravel资源方法来构建基本API。以下是我的 api.php 文件的代码,其中显示了所有API路由。

// List Articles
Route::get('articles', 'ArticleController@index');

// List Single Article
Route::get('article/{id}', 'ArticleController@show');

// Create New Article
Route::post('article', 'ArticleController@store');

// Update Article
Route::put('article', 'ArticleController@store');

// Delete Article
Route::delete('article/{id}', 'ArticleController@destroy');

这完全适用于获取删除方法。但对于Post方法,它抛出错误“405 Method not allowed”。我正在使用Postman来测试API调用。

具体而言,以下是Postman显示的确切错误

Symfony \ Component \ HttpKernel \ Exception \ MethodNotAllowedHttpException

还附上邮递员的截图 enter image description here

4 个答案:

答案 0 :(得分:3)

更改您的商店路线,如下所示:

Route::post('article/store', 'ArticleController@store');

因为您将帖子请求从邮递员发送到

  

/条/存储

enter image description here

答案 1 :(得分:3)

MethodNotAllowedHttpException表示找不到所请求网址的POST路由,但其他方法可用。

这可能是因为你没有(正确地)定义它,或者它与你配置中的另一条路线有冲突。

您可以使用php artisan route:list

查看当前路线

如果您想使用资源控制器,而不是自己定义所有资源路由和操作,为什么不使用Route::resource()方法?

Route::resource('article', ArticleController::class);

这将为您生成所有资源路径:

Verb        Path                    Action  Route Name
GET         /article                index   article.index
GET         /article/create         create  article.create
POST        /article                store   article.store
GET         /article/{article}      show    article.show
GET         /article/{article}/edit edit    article.edit
PUT/PATCH   /article/{article}      update  article.update
DELETE      /article/{article}      destroy article.destroy

该操作转换为控制器中的操作名称,例如,对POST /article的请求将调用控制器操作:ArticleController@store

在您的情况下,我发现您没有使用创建或编辑视图,因此您可以使用Route::resource()方法而不是使用Route::apiResource()方法,这将排除呈现HTML视图的路由用于创建和编辑文章。

Route::apiResource('article', Api\ArticleController::class);

这将创建您的路线,如:

Verb        Path                    Action  Route Name
GET         /article                index   article.index
POST        /article                store   article.store
GET         /article/{article}      show    article.show
PUT/PATCH   /article/{article}      update  article.update
DELETE      /article/{article}      destroy article.destroy

您还可以自动生成资源控制器以匹配您的资源路由,这将为您生成控制器文件。

php artisan make:controller Api/ArticleController --api

这将在Http/Controllers/Api/ArticleController中生成该文件,并模拟您可以使用的路线定义的所有操作。

More info on resource controllers

PS。

您的PUT路由不带id并且它调用store,最好在控制器中分割POST(创建新)和PUT / PATCH(现有对象的完全/部分更新)的操作。

原因是按照惯例,POST会创建一个新实体并再次发布一个帖子(很可能)会创建另一个,因此每个请求都会有不同的结果。

另一方面,

PUT请求是幂等的,这意味着您应该能够在同一个对象上多次执行PUT请求,并且所有这些请求的输出应该相同。 PATCH在这里有点奇怪,它可以是幂等的,但不是必需的。但是当使用Laravel时,PATCH请求通常由处理PUT请求的相同控制器操作处理,并且(取决于实现)将是幂等的。

PSS。

我不建议使用POST /article/store并遵循REST约定,即在资源名称本身上执行POST。 POST /article

答案 2 :(得分:1)

如果 sll 在您的域中处于活动状态,您应该像 HTTPS://yourdomain.com 这样的请求。你应该检查一下,然后再试一次。

答案 3 :(得分:0)

methodNotAllowed异常表示您请求的HTTP方法不存在路由。

您的表单已设置为发出POST请求,因此您的路由需要使用Route::post()才能收到此请求。

确保在POST

上设置邮递员上的请求

请记住在路由更改后清除路由缓存:

php artisan route:cache

尝试更改邮递员的设置:不要在标题中发送任何内容 - 我的意思是删除内容类型