使用 REST API 而不是我的简单方法有什么好处?
What is the benefit of using REST API instead of my simplistic approach?
我阅读了一篇关于如何创建 REST API 的 article。
虽然我的 APIs(在 /app/api/ 文件夹中)通常只检查 $_POST
参数和 echo json_encode($response); die;
在进行一些数据库操作后,我在文章中找到,设置了一些 headers,我通常不这样做。
为什么有必要and/or这样做更好吗?
如果我将我的代码转换为 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
基本相同,只是之前有一些 headers(根据布尔值给出 200 或 500 HTTP 响应),然后退出脚本用 die
执行。
“为什么有必要and/or这样做更好吗?”
您似乎指的是 Cross-Origin 资源共享 (CORS) header。这些 header 用于提高 REST API 的安全性,并允许您控制哪些网站可以实际调用您的 API。基本上,如果您将 'Access-Control-Allow-Origin' header 设置为您网站的地址,则只有您的网站可以调用此 API。您还可以查看此 link,其中描述了其工作原理:https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS
“如果我将我的代码转换为 REST API,我是否仍然能够使用 Fetch API 从 JavaScript 获得 JSON 结果?"
绝对 :) 只要您确保根据您的请求将 'Accept' HTTP header 设置为 'application/json',并且您的 API 以 'Content-Type' header 共 'application/json'。
这里有一个 link 展示了它是如何工作的:https://javascript.info/fetch
如果您想涉足 SOAP 世界,我建议您更愿意研究 GRPC。现在 SOAP 主要用于遗留系统
我阅读了一篇关于如何创建 REST API 的 article。
虽然我的 APIs(在 /app/api/ 文件夹中)通常只检查 $_POST
参数和 echo json_encode($response); die;
在进行一些数据库操作后,我在文章中找到,设置了一些 headers,我通常不这样做。
为什么有必要and/or这样做更好吗?
如果我将我的代码转换为 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
基本相同,只是之前有一些 headers(根据布尔值给出 200 或 500 HTTP 响应),然后退出脚本用 die
执行。
“为什么有必要and/or这样做更好吗?”
您似乎指的是 Cross-Origin 资源共享 (CORS) header。这些 header 用于提高 REST API 的安全性,并允许您控制哪些网站可以实际调用您的 API。基本上,如果您将 'Access-Control-Allow-Origin' header 设置为您网站的地址,则只有您的网站可以调用此 API。您还可以查看此 link,其中描述了其工作原理:https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS
“如果我将我的代码转换为 REST API,我是否仍然能够使用 Fetch API 从 JavaScript 获得 JSON 结果?"
绝对 :) 只要您确保根据您的请求将 'Accept' HTTP header 设置为 'application/json',并且您的 API 以 'Content-Type' header 共 'application/json'。
这里有一个 link 展示了它是如何工作的:https://javascript.info/fetch
如果您想涉足 SOAP 世界,我建议您更愿意研究 GRPC。现在 SOAP 主要用于遗留系统