【问题标题】:What is the benefit of using REST API instead of my simplistic approach?使用 REST API 而不是我的简单方法有什么好处?
【发布时间】:2021-10-22 10:51:21
【问题描述】:

我阅读了关于如何创建 REST API 的 article

虽然我的 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_selectdata_deletejson_response当然是我自己的函数,其中前两个允许我避免mysqli准备语句和绑定参数的所有这些行,而后者基本相同json_encode之前只有一些标头(根据布尔值给出 200 或 500 个 HTTP 响应),然后退出脚本以 die 执行。

【问题讨论】:

    标签: php rest soap


    【解决方案1】:

    “为什么有必要这样做和/或这样做更好?”

    您似乎指的是跨域资源共享 (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 主要用于遗留系统中

    【讨论】:

    • 非常感谢。如果我理解正确,将 CORS 标头设置为仅允许来自我的站点的调用意味着我不再需要 API_TOKEN,它是存储在我的 .env 中的随机 MD5 哈希字符串。
    • 啊!不。如果 CORS 验证它是调用 API 的有效网站(即您的网站),则该令牌用于验证它是向 API 发出请求的有效用户(即有权使用您的网站/API 的人)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-08
    • 2019-11-17
    • 1970-01-01
    • 2016-03-27
    • 2020-04-19
    • 2010-09-14
    • 2022-08-03
    相关资源
    最近更新 更多