【发布时间】: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