php - 使用 REST API 而不是我的简单方法有什么好处?
问题描述
我阅读了一篇关于如何创建 REST API 的文章。
虽然我的 API(在 /app/api/ 文件夹中)通常只检查$_POST
参数并echo json_encode($response); die;
在进行一些数据库操作之后,但我在文章中发现设置了一些标头,而我通常不会这样做。
为什么这是必要的和/或这样做更好?
如果我将代码转换为 REST API,我是否仍然能够使用 Fetch API 从 JavaScript 获取 JSON 结果?
我也看到了 SOAP 客户端(我也必须对此进行一些阅读),但我很好奇这三种(或可能任何其他)方式中的哪一种通常是最好的。
在我看来,我的方式更容易使用 JavaScript 获取,但也许直接从 PHP 进行 API 调用(使用 CURL?)也足够了。
我常用的例子:
require_once __DIR__ . '/../../init.php';
require_once env('SHOP_ROOT') . '/inc_functions.php';
$cmd = $_REQUEST['cmd'] ?? null;
$token = $_REQUEST['token'] ?? null;
if ($token !== env('API_TOKEN'))
json_response(false, ['Incorrect token']);
/*--------------------------------------------------------*
* cmd : delete *
*--------------------------------------------------------*
* parameters : user, uploadId *
*--------------------------------------------------------*/
if ($cmd == 'delete') {
$email = $_REQUEST['user'] ?? '';
$uploadId = intval($_REQUEST['uploadId'] ?? 0);
$selClientQ = <<<SQL
SELECT id_client
FROM client
WHERE
email = ? AND
is_active = 1 AND
is_banned = 0
SQL;
$clientId = data_select($selClientQ, $email)[0]['id_client'] ?? 0;
$delClientUploadQ = <<<SQL
DELETE FROM client_uploads WHERE client_id = ? AND id = ?
SQL;
$isDeleted = data_delete($delClientUploadQ, $clientId, $uploadId);
json_response($isDeleted, [
'clientId' => $clientId,
'success' => $isDeleted,
]);
}
data_select
,当然是我自己的函数data_delete
,json_response
其中前两个允许我避免所有那些用于 mysqli 准备语句和绑定参数的行,而后者基本上是相同的,json_encode
只是之前有一些标头(基于 200 或 500 HTTP 响应boolean),然后退出脚本执行die
。
解决方案
“为什么有必要和/或这样做更好?”
看起来您指的是跨域资源共享 (CORS) 标头。这些标头用于提高 REST API 的安全性,并允许您控制哪些网站可以实际调用您的 API。基本上,如果您将“Access-Control-Allow-Origin”标头设置为您网站的地址,则只有您的网站可以调用此 API。您还可以查看描述其工作原理的链接:https ://developer.mozilla.org/en-US/docs/Web/HTTP/CORS
“如果我将代码转换为 REST API,我还能使用 Fetch API 从 JavaScript 获取 JSON 结果吗?”
绝对 :) 只要您确保在您的请求中将“接受”HTTP 标头设置为“应用程序/json”,并且您的 API 以“应用程序/json”的“内容类型”标头响应。
这是一个显示其工作原理的链接:https ://javascript.info/fetch
如果您想冒险进入 SOAP 世界,我建议您宁愿研究 GRPC。SOAP 现在主要用于遗留系统
推荐阅读
- arrays - 在matlab中访问3d矩阵中的多个元素
- javascript - 使用 React-Radium 应用 Safari 特定的样式
- package - 错误:无法从 URL 或路径确定包名称
- android - RecyclerView Gridlayout 项填充其父项
- angularjs - 当模型长度是3的倍数时如何在angularjs中调用函数
- angular - Angular:将模板数据映射到其他演示文稿
- python - Django:作为字典的 SQL 结果
- multithreading - 在线程从未被阻塞的情况下,“线程在 STM 事务中无限期阻塞”
- python - 循环遍历 tif 堆栈并提取像素值的最快方法
- r - Shiny - 点击查看下一个情节