【问题标题】:laravel API Issue with GET requests (sanctum && JWT) in live server?实时服务器中的 GET 请求(sanctum && JWT)的 laravel API 问题?
【发布时间】:2022-11-11 06:36:25
【问题描述】:

我正在使用 sanctum 创建 API,并且在使用 GET 方法调用任何端点来检索如下数据时,我遇到了 GET 请求问题:

Route::group(['middleware'=>'auth:sanctum'], function(){

       Route::get('/index', [CardController::class, 'index']);

});

此端点的控制器:

    public function index()
{
    try {
         $authId = auth('sanctum')->id();
         $cards = Card::with('contact.provider')->whereUserId($authId)->get();
        if(!$cards){
            return $this->jsonResponse('', true, 'There are no cards', 404);
        }
        return $this->jsonResponse(CardResource::collection($cards), false, '', 200);
    } catch (\Exception $e) {
        return $e;
    }
}

jsonResponse() 方法:

function jsonResponse($responseObject,$Err_Flag,$message,$statusCode){
    $responseJson = ['Err_Flag' => $Err_Flag, 'message' => $message, 'data'=>$responseObject ];
    return response()->json($responseJson,$statusCode);
}

要访问此端点,我必须登录并在邮递员授权中传递不记名令牌,从数据库中成功检索数据像那样:

    {
    "Err_Flag": false,
    "message": "",
    "data": [
        {
            "id": 93,
            "name": "Name",
            "qr_url": "URL",
        },
        {
            "id": 94,
            "name": "Name",
            "qr_url": "URL",
        },

    ]
}

当通过调用此端点从此 json 中删除一个项目时,例如具有 id (93) 的项目:

    Route::group(['middleware'=>'auth:sanctum'], function(){

      Route::get('/delete/{93}', [CardController::class, 'delete']); //for example i removed 93

});

id (93) 的项目已成功从数据库中删除但问题是:

删除项目后再次调用(索引)端点以显示数据时:

    Route::group(['middleware'=>'auth:sanctum'], function(){

       Route::get('/index', [CardController::class, 'index']);
});
  • 它应该返回没有 id (93) 项的数据,但它再次返回旧数据?!!并且仍然永远保留旧数据而没有任何影响!!?像这样:

          {
      "Err_Flag": false,
      "message": "",
      "data": [
          {
              "id": 93,
              "name": "Name",
              "qr_url": "URL",
          },
          {
              "id": 94,
              "name": "Name",
              "qr_url": "URL",
          },
    
      ]
    

    }

  • 当再次登录并为 auth 用户生成新令牌并将其传递到邮递员的同一端点时,它会返回没有 id (93) 项的数据,如下所示:

           {
      "Err_Flag": false,
      "message": "",
      "data": [
          {
              "id": 94,
              "name": "Name",
              "qr_url": "URL",
          },
    
      ]
    

    }

所以我必须生成新令牌才能使用 GET 方法访问此端点中的新更改??!!

当将此端点从 GET 更改为 POST 方法时,如下所示:

Route::group(['middleware'=>'auth:sanctum'], function(){

       Route::POST('/index', [CardController::class, 'index']);
});
  • 一切正常,但问题仅在实时服务器的 GET 方法中显示??!
  • 此外,在 localhost 中一切正常,没有任何问题??!

我认为在 laravel root 中的 public/.hacess 中的 .haccess 中的问题是我的配置,如下所示:

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews -Indexes
    </IfModule>

    RewriteEngine On
    RewriteCond %{HTTP:Authorization} ^(.+)$
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
    
    # Handle Authorization Header

    
    # Redirect Trailing Slashes If Not A Folder...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} (.+)/$
    RewriteRule ^ %1 [L,R=301]

    # Send Requests To Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>

我认为 sanctum 包本身存在问题,但我使用了 JWT 包,但同样的问题仍然仅在 GET 请求中显示在实时服务器中??

请有任何帮助

【问题讨论】:

  • 你能在你的控制器中添加你的方法jsonResponse()存在(或继承)的内容吗
  • 感谢重播,我在控制器之后更新了 jsonResponse() 函数的实现
  • 您的服务器缓存有问题。您需要以某种方式禁用 API 调用的缓存。你使用的是哪个路由文件,默认的 web.php 或 api.php ,你可以添加一些东西来全局删除缓存。

标签: php laravel api laravel-sanctum


【解决方案1】:

在 appProvidersRouteServiceProvider.php 的 RouteServiceProvider 类中,使用中间件 cache.headers 添加缓存删除

protected function mapApiRoutes()
{
    Route::prefix('api')
        ->middleware('api')
        ->middleware('cache.headers:private;no_cache;max_age=3600') // added this line
        ->namespace($this->namespace)
        ->group(base_path('routes/api.php'));
}

【讨论】:

  • 我尝试了您的解决方案,但仍然是同样的问题
  • @MahmoudDiab 您的项目中添加了缓存包吗?
  • 不,我没有缓存包,我曾经清除所有缓存(配置路由)
  • @MahmoudDiab 我建议您在每一步都使用dd() 开始大量调试,并检查错误结果的来源。
  • 谢谢,我会尝试,当我尝试更改此端点中的任何内容(例如 dd() 某些内容)时出现的问题,它只显示旧数据!我必须生成新令牌才能看到端点的新变化
【解决方案2】:

还有两个地方可以检查这个问题:

【讨论】:

    猜你喜欢
    • 2021-08-25
    • 1970-01-01
    • 2018-11-29
    • 1970-01-01
    • 1970-01-01
    • 2011-06-04
    • 1970-01-01
    • 2023-03-27
    • 2016-01-03
    相关资源
    最近更新 更多