【问题标题】:Laravel 5.2: POST request is always returning "405 Method Not Allowed"Laravel 5.2:POST 请求总是返回“405 Method Not Allowed”
【发布时间】:2016-10-16 14:45:45
【问题描述】:

所以我正在使用 Laravel 5.2 开发一个 API,我正面临一个重要问题。

我有一个 UserController 来管理我的应用程序的用户。

这是我的 routes.php 文件:

Route::group(array('prefix' => 'api/v1'), function() {    
   Route::post('user', 'UserController@store');
});

我的 UserController 是这样定义的:

class UserController extends Controller {

   public function index() {
       return 'Hello, API';
   }

   public function create(){
   }

   public function store(Request $request) {
       $user = new User;
       $user->email = $request->email;
       $user->password = $request->password;
       $user->fbId = $request->fbId;
       $user->ggId = $request->ggId;
       $user->firstName = $request->firstName;
       $user->lastName = $request->lastName;
       $user->imageUrl = $request->imageUrl;
       $user->country = $request->country;
       $user->mobile = $request->mobile;
       $user->gender = $request->gender;
       $user->client = $request->client;

       $user->save();

       return Response::json(array(
           'error' => false,
           'userId' => $user->id),
           200
       );
   }

   public function update(Request $request, $id) {
   }
}

这是php artisan route:list的输出

+--------+--------+-------------+------+-------------------------------------------+------------+
| Domain | Method | URI         | Name | Action                                    | Middleware |
+--------+--------+-------------+------+-------------------------------------------+------------+
|        | POST   | api/v1/user |      | App\Http\Controllers\UserController@store | web        |
+--------+--------+-------------+------+-------------------------------------------+------------+

我正在使用 Postman 来测试我的 POST 请求。 每次我向 /api/v1/user 发出 POST 请求时,都会收到“405 Method Not Allowed”错误。

我错过了什么吗?

我应该做些什么来解决这个问题?

【问题讨论】:

  • 你为什么用Route::resource('user', 'UserController');而不是Route::post('user','userController@store')
  • @Kisaragi - 如果我使用Route::post('user', 'UserController@store'),我会得到“405 Method Not Allowed”。
  • 每次都调用索引方法。请只评论一次索引方法并查看结果。也许它有效!
  • @HirenGohel - 我认为它不应该每次都调用 index() 。 Anw,如果我这样做,我会收到“500 内部服务器错误”。
  • 您可以尝试删除组中的“之前”过滤器,看看它是否有效吗?我假设您在来自 Postman 时没有获得授权。

标签: php api laravel post


【解决方案1】:

我和你有同样的问题,我已经在我的 POST 路由中设置了例如“/api/v1/user”,

当我尝试使用 POSTMAN (application to test API) 连接时,它返回 405-Method Not Allowed,

然后我意识到我发送的网址使用的是“http”,然后我将其更改为“https”(后面带有“s”)
然后我的 API 工作正常!

通常如果我们与不同的服务器交互,我们必须使用'https'
但是如果你的应用程序在同一服务器上,
可以使用'http'

我的情况的真正原因是与任何不同服务器的任何交互都必须使用“https”(这是我服务器上的设置)

【讨论】:

  • Omfg...谢谢伙计。这么简单的事情让我浪费了 1 个小时
  • 老兄,你是英雄!白白浪费了这么多时间!它在 curl 中运行良好,因为 CURLOPT_FOLLOWLOCATION=true。在 Postman 中完全忘记它!
【解决方案2】:

你需要分开你的路线,因为所有试图到达你的路线的用户都需要一个开放的会话(登录)

试试这个

Route::group(array('prefix' => 'api/v1'), function() {

    Route::post('/','UserController@store');

    Route::get('/', 'UserController@index');

    Route::group(array('before' => 'auth.basic'), function() {

        Route::post('{user}', 'UserController@update');

    });
});

您的授权用户路由应该在第二组中

您的 405 Method not Allowed 是 $user->id 更改为 $request->user()->id

【讨论】:

  • 是的,您完全正确,但是我刚刚开始了这个项目,我仍然没有将需要身份验证的端点与不需要身份验证的端点分开。
  • 你可能想开始使用中间件Route::group(['middleware' => 'auth'], function () { ... });
  • 我会的:)谢谢
  • @JosephELKHOURY 405 Method not Allowed is $user->id 将其更改为 $request->user()->id
  • @JosephELKHOURY 记得保存$user->save()
【解决方案3】:

缺少 CSRF 令牌

在创建 web-hooks 路由时,我在 Laravel 5.8 上遇到了同样的问题。

这些路由使用 web 中间件,因此也包含 VerifyCsrfToken 路由中间件组。 (参考app/Http/Kernel.php

因为我的 POST 请求不包含 CSRF 令牌,我们会遇到这种奇怪的行为。

添加 CSRF 异常

要解决这个问题,我需要 add an exception 到 VerifyCsrfToken 中间件 以获取 web-hooks 路由。 (参考app/Http/Middleware/VerifyCsrfToken.php

/**
 * The URIs that should be excluded from CSRF verification.
 *
 * @var array
 */
protected $except = [
    'web-hooks/*'
];

使用 API 中间件

上面的解决方案是针对使用web中间件的时候。但是,如果您正在创建 API 路由,最好使用 api 中间件,因为在此中间件中不使用 CSRF 验证。 (参考app/Providers/RouteServiceProvider.php

    Route::prefix('api')
        ->middleware('api')
        ->namespace($this->namespace)
        ->group(base_path('routes/api.php'));

【讨论】:

    【解决方案4】:

    更改为 https 将使其工作。至少,这是我所经历的。使用带有 http 的 POSTman 总是有这种效果。

    【讨论】:

      【解决方案5】:

      之前遇到过类似的情况,调试后发现是Postman问题,和代码无关!

      所以打开你的终端并尝试使用 curl 发出相同的请求:

      curl -X POST -H "Accept: application/json" -F "email=test@test.com" -F "password=secret" -F "firstName=Mahmoud"  -F "lastName=Zalt" ....... "http://your-domain.com/api/v1/user"
      

      如果这行得通,则意味着您必须更改 Postman 本身的一些设置。 真的不记得我对它做了什么!但这就像更改一些默认标头或删除授权类型一样简单...

      【讨论】:

      • mmm 尝试检查您的 HTTP 中间件或启用 CORS
      【解决方案6】:

      此错误也可能是由太大的请求正文引起的。就我而言,我不小心发送了一个包含许多子对象的对象,这些子对象都有许多其他子对象。修剪我的请求数据解决了这个问题。

      【讨论】:

        【解决方案7】:

        如果它对我有同样问题的任何人有帮助;出于某种原因,一些事情的组合修复了它。

        1. 明显的一点是它会返回 NotFoundHttpException in RouteCollection.php line 161 这是因为我没有在我的帖子请求中发送我的“api_token”。
        2. 出于某种原因(我不知道这是否有所不同),但链接我的中间件而不是把它放在我所做的 Route:group 中;

          Route::group(['prefix'=>'api/v1'], function () {
              Route::post('/', 'IndexController@index')->middleware('auth:api');
          });
          

        【讨论】:

          【解决方案8】:

          在我的例子中,我没有在控制器名称中添加控制器词

          【讨论】:

            【解决方案9】:

            在两侧检查您的请求类型GET/POST/PUT/PATCHfrontend(Javascript/Typescript etc...) 和 backend(Laravel Passport) 应该是一样的。

            【讨论】:

              【解决方案10】:

              经过长时间的挖掘和挖掘,我找不到任何解决问题的方法。

              我必须从头开始创建一个新的 Laravel 项目,并添加我在旧项目中的所有内容。令我惊讶的是,一切都很完美,但我仍然不明白为什么!

              无论如何,感谢所有为此提供帮助的人 :) 干杯!

              【讨论】:

              • 你应该考虑把你的答案换成正确的答案,谢谢。
              • 什么意思?
              • 删除一个 Laravel 实例并从头开始,从你得到的所有答案中,这将是最好的答案吗?我对此表示怀疑。只需删除您的答案并选择一个可行的答案。
              • 没有一个答案解决了这个问题。我绝对不会将它们标记为“正确”答案并误导用户。
              • 没有人建议你应该标记错误的答案,你的逻辑是错误的。您选择了自己的答案,指出“创建一个新的 laravel 项目”就是答案,这也是错误的逻辑。这将与有人对驱动器 C:/> 有问题进行比较,您会提出将其格式化作为解决方案。
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2016-12-04
              • 2014-09-03
              • 2014-11-26
              • 1970-01-01
              • 2015-07-01
              • 2011-05-14
              • 2011-09-25
              相关资源
              最近更新 更多