我最近使用烧瓶设计了一个示例项目的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)
代码正常。我想知道这是基于终点和执行操作的休息还是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);
}
});
我想知道这是基于终点和执行操作的静止还是RPC。
客户端如何发现端点是什么,以及输入JSON的样子?
在网上,将有一种标准媒体类型来描述表格。表单的表示将包括键和值,目标URI以及使用HTTP方法。处理规则将描述如何获取表格的详细信息以及消费者提供的价值,并从中构建HTTP请求。
那是休息:做我们在网上做的事情。
另一种休息方法是定义链接关系,也许是" http://example.org/calculator"和媒体类型application/prs.calculator+json
,然后在您的上下文中进行" http://示例"中的文档。org/calculator;链接关系表明目标URI对使用有效载荷application/prs.calculator+json
的消息响应。这本质上是原子集团和Atom Pub。
也是休息。
fielding对他设计的API
发表了有趣的评论我还应该指出,上面的尚未完全休息,至少我是如何使用该术语的。我所做的只是描述了服务接口,这不超过任何RPC。为了使其恢复,我需要添加超文本以介绍和定义服务,描述如何使用表单和/或链接模板执行映射,并提供代码以有用的方式组合可视化。
也就是说,如果您要执行与身体的语义安全请求一起进行,那么您可能会被RPC思考所困扰。请注意,在网络上,参数化读取是通过与客户端进行通信如何修改目标uri(例如,通过根据标准化处理规则编码的数据附加查询字符串(来完成的。
REST代表代表性状态转移。您的操作是无状态的,因此没有州可以转移的状态。但是,您的操作确实接受参数并以过程或功能的方式返回结果,并且它是遥远的,因此远程过程调用将是对正在发生的事情的很好描述。毕竟,您为客户提供了一种与语言无关的方式来调用您的calculator_operation
程序。
模型中明显缺少的是服务器端数据。通常,REST API提供了一种与服务器端对象进行交互的方法:查询,创建,替换,更新或删除。您的服务器端没有保留数据:这只是一个回答问题的甲骨文。您有"查询"方面,别无其他。