gpt4 book ai didi

node.js - 构建 Restful API 时选择哪种 HTTP 方法

转载 作者:太空宇宙 更新时间:2023-11-04 03:24:11 25 4
gpt4 key购买 nike

我是 Node.js 新手,并且在 hapi.js 框架中构建了我的第一个 Node.js Restful API。所有服务所做的基本上都是数据库查询。服务的示例如下:

let myservice = {
method: "POST",
path: "/updateRule",
config: {
handler: (request, reply) => {
updateRule(request.payload)
.then((result) => {
reply(successResponse(request, result));
})
.catch((err) => reply(failResponse(request, err)).code(500));
},
validate: {
payload: {
ruleId: joi.number().required(),
ruleName: joi.string().required(),
ruleDesc: joi.string().required()
}
},
auth: "jwt",
tags: ["api", "a3i"]
},
}

updateRule(input): Promise<any> {
return new Promise((resolve, reject) => {
let query = `select a3i.update_rule(p_rul_id := ${input.ruleId}, p_rul_name := '${input.ruleName}', p_rul_desc := '${input.ruleDesc}')`;
postgresQuery(lbPostgres, query, (data, commit, rollback) => {
try {
let count = data.rows[0].update_rule.count;
if (count === 1) {
let ruleId = data.rows[0].update_rule.result[0];
let payload: SuccessPayload = {
type: "string",
content: `Rule ${ruleId} has been updated`
};
commit();
resolve(payload);
} else {
let thisErr = new Error("No rule can be found.");
thisErr.name = "4003";
throw thisErr;
}
}
catch (err) {
rollback();
if (err.name === "4003") {
reject(detailError(4003, err.message));
} else {
reject(detailError(4001, err.message));
}
}
}, reject);
});
}

正如您所看到的,当调用该服务时,它会引发数据库调用(查询)并更新数据库表中的指定行。同样,我还有其他名为 createRule/deleteRule 的服务,用于在数据库表中创建/删除记录。 在我看来,服务之间的区别在于执行不同的数据库查询。我读了这篇文章PUT vs. POST in REST但在我的例子中看不到 POST 和 PUT 的任何区别。

这是我的问题:

  1. 在这种情况下我应该使用什么 HTTP 方法?

  2. 大多数 Restful API 示例(例如 https://www.codementor.io/olatundegaruba/nodejs-restful-apis-in-10-minutes-q0sgsfhbd )使用相同的 URL 和不同的 HTTP 方法对同一“资源”执行不同的操作,在我看来,该资源通常是数据库表。与我的一个URL只有一种HTTP方法、只做一种操作的做法相比,这种架构有什么好处?

我知道这个问题不是指问题,也不具体。有些人可能会投反对票。但作为初学者,我真的想知道什么是典型的 Restful API,并确保我的 API 是“最佳实践”。请帮忙!

最佳答案

如果资源已存在,因此您有该资源的特定 URI 并且您想要更新它,则使用 PUT。

如果该资源尚不存在,而您想要创建它,并且您将让服务器选择代表该新资源的 URI,则使用 POST,并且 POST URI 将是通用的“创建新资源”URI,而不是特定资源的 URI,并且它将创建代表该资源的 URI。

如果调用者要创建代表新资源的资源 URI,您还可以使用 PUT 来创建新资源。在这种情况下,您只需 PUT 到该新资源,如果具有该 URI 的资源已存在,则会更新该资源,如果不存在,则会创建该资源。

您不必同时支持两者。您可以决定让您的 API 以仅使用其中之一的方式工作。

<小时/>

在您的具体情况下,对数据库中已存在的特定行的更新几乎总是 PUT,因为它已经存在,因此您要对代表该行的特定 URI 执行 PUT。

What's the benefit of this architecture compared with my practice in which one URL only has one HTTP method and only do one type of operation?

这完全取决于您想要如何呈现您的 API。 REST 背后的一般概念是有几个组件:

resource identifier
data
method

在某些情况下,该方法可以包含在 GET、PUT、POST 或 DELETE 中,因此您只需要资源标识符、数据和 GET、PUT、POST 或 DELETE。

在其他情况或其他设计中,该方法比仅用 PUT 或 POST 表达的方法更详细,因此您实际上在 URL 中拥有一个方法,在这种情况下,您可能不需要那么区分 PUT 和 POST。

例如,操作可能是“购买”。虽然您可以在 URL 的其余部分隐含该方法的 POST 中捕获该信息,但为了清楚起见,您可能希望实际 POST 到其中包含方法的 URL:/buy,然后您可以将相同的端点前缀与其他方法(例如 /addToCart 等)一起使用...这实际上取决于 REST 设计中的对象以及您想要在它们上显示的操作。有时,这些对象仅适用于 GET、PUT、POST 和 DELETE,有时,您希望 URL 中包含有关对该资源执行的特定操作的更多信息。

关于node.js - 构建 Restful API 时选择哪种 HTTP 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46800414/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com