我只是在学习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
答案 0 :(得分:3)
答案 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
尝试更改邮递员的设置:不要在标题中发送任何内容 - 我的意思是删除内容类型