【问题标题】:"405 Method not allowed" in Laravel 5.6.14Laravel 5.6.14 中的“405 方法不允许”
【发布时间】:2018-09-09 05:11:54
【问题描述】:

我只是在学习 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');

这非常适用于 getdelete 方法。但是对于 Post 方法,它会抛出错误“405 Method not allowed”。我正在使用 Postman 来测试 API 调用。

具体来说,下面是 Postman 显示的确切错误

Symfony \ Component \ HttpKernel \ Exception \ MethodNotAllowedHttpException

还附上邮递员的截图

【问题讨论】:

  • 更改路由的任何方法名称。例如,将 post 方法的函数名称从 store 更改为 storeArticle!喜欢:Route::post('article', 'ArticleController@storeArticle');
  • 我已经尝试过将“存储”更改为“保存”。现在也按照您的指示尝试了“storeArticle”,但这也不起作用。事实上,如果我从控制器中删除该方法,它仍然会显示相同的错误
  • @aslamdoctor:给你错误,因为可能 Put 和 Post 方法名称相同
  • @aslamdoctor:请将您的方法名称 store 更改为 storeArticle 并将 url 名称 article 更改为 store-article 并尝试
  • 尝试将postput 替换为Route::match(['post', 'put'], 'article', 'ArticleController@store');。尽管我必须为put 路由添加这一点,但通常的做法是直接处理更新的实体,这意味着您应该将两条路由拆分为单独的控制器方法,并在put 方法中请求{id},就像您为单条获取路线。

标签: php laravel laravel-5


【解决方案1】:

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

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

确保 postman 上的请求设置在 POST

记得在任何路由更改后清除路由缓存:

php artisan route:cache

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

【讨论】:

  • 尝试清除路由缓存。还是同样的问题。检查有问题的屏幕截图,我更新了它。
  • 尝试更改邮递员的设置:不要在标题中发送任何内容 - 我的意思是删除 Content-Type
【解决方案2】:

像这样改变你的存储路线:

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

因为您从 Postman 向

发送 post 请求

/文章/商店

【讨论】:

    【解决方案3】:

    MethodNotAllowedHttpException表示请求的url找不到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::apiResource() 方法,而不是使用 Route::resource() 方法,该方法将排除显示 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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 感谢您的提醒,我已经遇到了这个错误
      猜你喜欢
      • 2017-11-28
      • 2020-07-25
      • 2017-05-31
      • 1970-01-01
      • 2019-05-10
      • 2018-06-15
      • 2023-02-17
      • 2015-10-15
      • 1970-01-01
      相关资源
      最近更新 更多