我是node.js的新手,并在hapi.js框架中创建了我的第一个node.js Restful API。所有的服务基本上都在做数据库查询。该服务的一个例子是这样的:构建Restful API时选择哪种HTTP方法
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的区别。
这里是我的问题:
我应该在这种情况下使用什么HTTP方法?
大部分宁静的API的例子(例如https://www.codementor.io/olatundegaruba/nodejs-restful-apis-in-10-minutes-q0sgsfhbd)使用不同的HTTP方法相同的URL上相同的“资源”,这在我看来是通常一个数据库表做不同的操作。与我的惯例相比,这种体系结构的好处是什么?其中一个URL只有一个HTTP方法,只能执行一种类型的操作?
我知道这个问题没有提到问题,也没有具体说明。有些人可能会给它一个倒票。但作为初学者,我真的很想知道什么是典型的Restful API,并确保我的API是“最佳实践”。请帮忙!
看来我不得不向服务路径添加一个参数,因此每个资源(数据库表中的一行)都有相应的url。例如,当我想要对记录执行操作时,我需要将唯一ID作为url中的参数传递。这是正确的吗? – zhangjinzhou
@ zhangjinzhou - 这将是RESTful的方式。 GET,PUT或DELETE的每个URI应代表一个唯一的资源。 – jfriend00
是的,这是正确的。这被定义为URL中的可选参数。 – Silencer310