【问题标题】:Determining the API is RPC or REST确定 API 是 RPC 还是 REST
【发布时间】:2019-05-24 03:25:14
【问题描述】:

我最近使用flask 为示例项目设计了一个REST API。前端基于 React.JS。但是我从一位同事那里得到反馈,API 不是 REST API 和它的 RPC。

API 基本上接受 3 个参数、2 个数字和一个操作('​​add'、'sub'、'mul'、'div')。在终点http://127.0.0.1:5000/calculator 输入 JSON 将如下所示:

{"value1":"7.1","value2":"8","operator":"mul"}
from flask import Flask, jsonify, request, abort
from flask_cors import CORS

APP = Flask(__name__, static_url_path='')
CORS(APP)  # For cross origin resource sharing
APP.config['CORS_HEADERS'] = 'Content-Type'

@APP.route('/calculator', methods=['POST'])
def calculator_operation():

    if not request.json:
        abort(400)
    try:
        val1 = float(request.json['value1'])
        val2 = float(request.json['value2'])
        operator = request.json['operator']
        if operator == 'add':
            result = val1 + vla2
        elif operator == 'mul':
            result = val1 * val2
        elif operator == 'sub':
            result = val1 - val2
        elif operator == 'div' and val2 == 0:
            result = 'Cant divide by 0'
        elif operator == 'div':
            result = round((val1 / val2), 2)

        return (jsonify({'result': result}), 200)
    except KeyError:

        abort(400)

if __name__ == '__main__':
    APP.run(debug=True)

代码运行良好。我想知道这是基于端点和正在执行的操作的 REST 还是 RPC。

编辑:

Ajax 调用

$.ajax({
            type: "POST",
            url: "http://127.0.0.1:5000/calculator",
            data: JSON.stringify({
                value1: arg1,
                value2: arg2,
                operator: this.state.operation
            }),
            contentType: "application/json",
            dataType: "json",
            success:( data ) => {
                this.setState({ result: data.result, argumentStr: data.result });
            },
            error: (err) => {
                console.log(err);
            }
        });

【问题讨论】:

  • 你上网查过REST是什么意思吗?你会说什么?
  • @hek2mgl 我做到了,我很困惑。这对我来说似乎很平静。如果有更多功能,向每个操作添加端点将使维护变得更加困难。输入中的值是否超过 2 个使其成为 RPC ?
  • 简单场景,客户端如何“知道”或“了解”服务器在向其发送请求时期望作为输入的内容?知识从何而来?客户端开发人员必须通过一些任意文档吗? --> RPC;提供的信息,就像在 Web 中一样,以表单和客户端只是通过链接通过应用程序“冲浪”吗? --> 最有可能的 REST;它是否也尊重多种媒体类型和内容类型协商? --> 更有可能是 REST;在所有其他场景中 --> RPC。

标签: json rest flask


【解决方案1】:

我想知道这是基于端点和正在执行的操作的 REST 还是 RPC。

客户端如何发现端点是什么,以及输入的 json 是什么样的?

在网络上,会有一种描述表单的标准媒体类型;表单的表示将包括键和值、目标 URI 和要使用的 HTTP 方法。处理规则将描述如何获取表单的详细信息,以及消费者提供的值,并从中构造 HTTP 请求。

这就是 REST:做我们在网络上所做的事情。

另一种 REST 方法是定义 link relation,可能是“http://example.org/calculator”和媒体类型 application/prs.calculator+json,然后在您的上下文中记录“http://example .org/calculator" 链接关系表示目标 URI 响应带有负载 application/prs.calculator+json 的 POST 消息。这基本上就是Atom SyndicationAtom Pub

这也是 REST。

菲尔丁对an API he had designed发表了有趣的评论

我还应该注意,上述内容还不是完全 RESTful,至少我是如何使用这个术语的。我所做的只是描述了服务接口,它只不过是任何 RPC。为了使它成为 RESTful,我需要添加超文本来介绍和定义服务,描述如何使用表单和/或链接模板执行映射,并提供代码以有用的方式组合可视化。

也就是说,如果您正在执行 GET-with-a-payload,即语义上带有主体的 safe 请求,那么您可能会陷入 RPC 思维。请注意,在 Web 上,参数化读取是通过向客户端传达如何修改目标 uri 来完成的(例如,通过附加查询字符串以及根据标准化处理规则编码的数据)。

【讨论】:

    【解决方案2】:

    REST 代表 REpresentational State Transfer。您的操作是无状态的,因此没有要转移的状态。但是,您的操作确实接受参数并以过程或函数的方式返回结果,并且它是远程的,因此远程过程调用将是对正在发生的事情的一个很好的描述。毕竟,您为客户提供了一种与语言无关的方式来调用您的calculator_operation 过程。

    您的模型中明显缺少的是服务器端数据。通常,REST API 提供了一种与服务器端对象交互的方法:查询、创建、替换、更新或删除。您的服务器端没有保存任何数据:它只是一个回答问题的预言机。你有“查询”方面,没有别的。

    【讨论】:

    • 小心stateless这个词。 ReST 是无状态的(在服务器端),因为所有应用程序状态都是从客户端传输的。见:restfulapi.net/statelessness
    • 正如您的参考所指出的,存在不止一种状态:它区分 REST 避免的 application 状态(或会话状态)和 resource 状态,REST 允许。我认为资源状态实际上是 REST 的要求,否则“状态转移”指的是什么?此示例没有资源状态。事实上,它没有资源——没有可以操作的实体。它来回传递的值并不代表实体。
    • 状态不止一种;但无国籍只有一种。 :)
    • @TFBW 感谢您的回答。我对构建 REST API 的概念很陌生。我没有得到你提到的“无状态,没有状态可以转移”的部分。这意味着什么?或者我可以改变什么以使其成为状态转移。创建、替换、更新或删除部分不存在,因为正在开发的应用程序不执行与这些相关的任何操作。
    • @Vidhu 如果应用程序没有任何创建、替换、更新或删除的概念,那么您不需要 REST 接口。
    猜你喜欢
    • 1970-01-01
    • 2021-05-18
    • 1970-01-01
    • 2013-05-08
    • 2014-09-17
    • 2012-07-18
    • 2023-02-15
    • 2014-01-18
    • 2017-01-31
    相关资源
    最近更新 更多