Laravel 5.2:POST请求总是返回" 405方法不允许"

时间:2016-06-15 13:01:06

标签: php api laravel post

所以我正在使用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"错误。

我错过了什么吗?

我有什么办法可以解决这个问题吗?

10 个答案:

答案 0 :(得分:13)

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

当我尝试使用POSTMAN(应用程序测试API)进行连接时,它返回405-Method Not Allowed,

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

通常如果我们与不同的服务器进行交互,我们必须使用' https '但如果您的应用程序位于同一台服务器上,则可以使用' http

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

答案 1 :(得分:6)

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

试试这个

    <!DOCTYPE html5>
<html>
    <head>
    </head>
    <body>

        <script>
        var arr = new Array("pro","pro1","pro2");
        for(var i =0 ;i<arr.length;i++)
        {
          document.getElementById("txt").innerHTML = arr[i];
          //document.write(arr[i]);
        }
        </script>
        <div id = "txt">
        </div>
    </body>
</html>

您的授权用户路线应位于第二组

您的405方法不允许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'); }); }); 更改$user->id

答案 2 :(得分:2)

缺少CSRF令牌

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

这些路由使用网络中间件,因此,还包括了 VerifyCsrfToken路由中间件组。 (参考app/Http/Kernel.php

因为我的POST请求不包含 CSRF令牌,所以我们得到了这种奇怪的行为。

添加CSRF例外

要解决此问题,我需要 add an exception到VerifyCsrfToken中间件以获取网络钩子路由。 (参考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'));

答案 3 :(得分:0)

之前面对类似的东西,经过调试后发现它的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本身更改一些设置。 真的不记得我做了什么!但它就像更改一些默认标题或删除授权类型一样简单......

答案 4 :(得分:0)

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

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

无论如何,感谢所有试图帮助的人:)干杯!

答案 5 :(得分:0)

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

  1. 显而易见的一点是它会返回NotFoundHttpException in RouteCollection.php line 161这是因为我没有发送我的&#34; api_token&#34;在我的帖子请求中。
  2. 出于某种原因(我不知道这是否会产生影响)但链接我的中间件而不是把它放在Route:group中我做了;

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

答案 6 :(得分:0)

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

答案 7 :(得分:0)

更改为https将使其起作用。至少,这就是我所经历的。将POSTman与http一起使用始终具有这种效果。

答案 8 :(得分:0)

在两侧检查您的请求类型GET/POST/PUT/PATCH前端Javascript/Typescript etc...)和后端Laravel Passport)应该相同。

答案 9 :(得分:0)

就我而言,我没有在控制器名称中添加控制器词