如何在 API 的 RPC 和 REST 之间做出决定?
Posted
技术标签:
【中文标题】如何在 API 的 RPC 和 REST 之间做出决定?【英文标题】:How to decide between RPC and REST for APIs? 【发布时间】:2018-07-05 10:47:28 【问题描述】:我创建了一个应用程序,用户将使用 C 或 Python 发送程序并通过 STDIN 输入,我的 API 将以 JSON 格式返回程序的输出。 Nodejs/Expressjs 代码:
route.post('/exec', (req, res, next) =>
if(req.body.lang === 'c')
cExec(req, res)
if(req.body.lang === 'py3')
py3Exec(req, res)
)
在py3Exec() and cExec()
中执行代码后,我使用退出代码编写了此代码以发送回输出:
if(code === 0)
if(stdout === req.body.output)
res.send(
"result": "AC",
"output": stdout
)
else
res.send(
"result": "WA",
"output": stdout
)
else
res.send(
"result": "ERR",
"error": stderr
)
https://github.com/vkartik97/Online-IDE-API/blob/master/routes/run.js#L41 所以,这个 API 是 REST。我想知道这是否是此用例的完美方式,或者是否应该使用 RPC,因为 REST 仅用于来自服务器的资源,而 RPC 用于函数调用(可能是我的情况)。
谢谢!
【问题讨论】:
没有直接关系,但我希望你意识到你的方案允许任何人在你的机器上运行任意代码,例如阅读和/或删除所有内容。 谢谢。我计划在这种情况下使用 Docker。 【参考方案1】:在我看来,走哪条路并不是什么大不了的事,很大程度上取决于应用程序的其余部分。如果您的应用程序所做的只是使用代码、运行它并提供输出,那么很可能两者都可以。
您显然可以看到这可能是一个 RPC 调用,例如 /exec
,但它也可以很容易地成为一个 REST 调用,特别是如果您想添加某种形式的日志记录。例如:POST /program
可以设计为使用一些代码,在数据库中创建一个“程序”,运行代码,并将输出与数据库中的程序一起记录。然后您将程序返回给客户端。
如果您实际上只是使用代码、运行代码并通过 HTTP 返回输出,那么为了简单起见,我很想使用 JSON-RPC 类型的端点并揭示意图(只需触发一个动作) .
很大程度上取决于您的应用程序的未来,它可能会变得多大,以及您将拥有哪些其他功能。如果您要拥有 90% 的 RESTful API 和几个作为 JSON-RPC 的端点,那么我将使用 REST API 来确保所有内容的一致性。
【讨论】:
but it could also easily be a REST call, especially if you wanted to add some form of logging.
日志记录会使 REST 调用有状态吗?
把它想象成创建一个程序和响应,而不是记录程序的输出。在这种情况下,它基本上是在制作一个 CRUD 应用程序,您可以稍后在其中查询同一个程序并查看它的运行日期、输出等(如果您决定扩展至此级别)。以上是关于如何在 API 的 RPC 和 REST 之间做出决定?的主要内容,如果未能解决你的问题,请参考以下文章