Php Laravel 5.2:POST请求总是返回;405“不允许使用方法”;

Php Laravel 5.2:POST请求总是返回;405“不允许使用方法”;,php,api,laravel,post,Php,Api,Laravel,Post,所以我正在用Laravel5.2开发一个API,我面临一个重要的问题 我有一个UserController,它将管理我的应用程序的用户 这是我的routes.php文件: Route::group(array('prefix' => 'api/v1'), function() { Route::post('user', 'UserController@store'); }); 我的UserController定义如下: class UserController extend

所以我正在用Laravel5.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        |
+--------+--------+-------------+------+-------------------------------------------+------------+
我用邮递员来测试我的邮件请求。 每次我向/api/v1/user发出POST请求时,都会出现“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');

    });
});
您的授权用户路由应在第二组中


不允许您的405方法是
$user->id
将其更改为
$request->user()->id

以前遇到过类似的情况,调试后发现这是邮递员问题,与代码无关

因此,打开终端并尝试使用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"
如果这起作用,意味着你必须改变邮递员本身的一些设置。
真的不记得我对它做了什么!但这就像更改一些默认标题或删除授权类型一样简单…

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

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


无论如何,感谢所有在这方面尽力帮助的人:)干杯

如果对任何人都有帮助的话,我也有同样的问题;出于某种原因,多种因素综合起来解决了这个问题

  • 显而易见的一点是,它将在RouteCollection.php第161行返回一个
    NotFoundHttpException
    ,这是因为我没有在post请求中发送我的“api_令牌”
  • 出于某种原因(我不知道这是否有什么不同),但链接我的中间件起了作用,而不是把它放在路线上:我做了;


  • 此错误也可能由请求正文太大引起。在我的例子中,我无意中发送了一个包含许多子对象的对象,这些子对象都有许多其他子对象。删减我的请求数据解决了这个问题。

    我与您有相同的问题,我已经在我的发布路线中设置了这些问题,例如“/api/v1/user”,

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

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

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


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

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

    检查两侧的请求类型
    GET/POST/PUT/PATCH
    i、 e.前端
    Javascript/Typescript等
    )以及后端
    Laravel Passport
    )应该相同。

    缺少CSRF令牌 在创建
    webhook
    routes时,我在Laravel5.8上遇到了同样的问题

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

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

    添加CSRF异常 为了解决这个问题,我需要为web hooks路由使用VerifyCsrfToken中间件。(参考
    app/Http/Middleware/VerifyCsrfToken.php

    使用API中间件 上述解决方案适用于使用web中间件的情况。但是,如果要创建API路由,最好使用API中间件,因为此中间件中不使用CSRF验证。(参考
    app/Providers/RouteServiceProvider.php


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

    为什么要使用
    Route::resource('user','UserController')而非
    路由::post('user','userController@store)
    ?@Kisaragi-如果我使用
    Route::post('user','UserController@store)
    我得到“405方法不允许”。每次都是调用索引方法。请只评论一次索引方法,然后查看结果。也许它有用@我认为它不应该每次都调用index()。还有,如果我这样做,我会得到一个“500内部服务器错误”。你能试着删除组中的“之前”过滤器,看看它是否有效吗?我假设你从邮递员那里来时没有得到授权。是的,你完全正确,但我刚开始这个项目,我仍然没有将需要身份验证的端点与不需要身份验证的端点分开。你可能需要开始使用中间件
    Route::group(['middleware'=>'auth'],function(){…})我会:)谢谢you@JosephELKHOURY405不允许的方法是<代码> $USER > ID\代码>更改它为<代码> $Quest-USER()-> ID  @ JojEffelkHouy记得保存<代码> $Up> > Save](代码)> MMM尝试查看HTTP中间件或启用COSs,您应该考虑将您的答案切换到正确的答案,谢谢。你是什么意思?删除一个Laravel实例,从头开始,从你得到的所有答案来看,这将是最好的答案?我对此表示怀疑。删除你的答案,然后选择一个可行的答案。没有一个答案能解决这个问题。我绝对不会将它们标记为“正确”答案并误导用户。没有人建议你标记错误的答案,你的逻辑是错误的。你选择了自己的答案,上面写着“cre
    
    Route::group(['prefix'=>'api/v1'], function () {
        Route::post('/', 'IndexController@index')->middleware('auth:api');
    });
    
    /**
     * The URIs that should be excluded from CSRF verification.
     *
     * @var array
     */
    protected $except = [
        'web-hooks/*'
    ];
    
        Route::prefix('api')
            ->middleware('api')
            ->namespace($this->namespace)
            ->group(base_path('routes/api.php'));