如何在 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 之间做出决定?的主要内容,如果未能解决你的问题,请参考以下文章

结合 REST API 和 RPC

gRPC vs REST:两种API架构风格的对比

在apigility中触发RPC控制器中的REST请求

Web API RPC 与 WCF 和 JSON [重复]

RPC 与 JSON,为啥大家都这么炒作 REST?

api接口,RPC,WebService分别解决啥问题