假设我有一个Python函数,该函数接受多个参数作为输入并返回输出。
现在,我想有一个基于此功能的“ Web服务”(API)。这意味着应该有一个可以使用某些参数调用的URL,该参数应该传递给函数,函数接受它们并计算相应的结果(输出),然后将其传递回Web服务器。反过来,将结果显示给用户(可能是另一个程序)。
如果一个简单的函数接受两个实值参数(例如x
和y
)并返回一个实值结果,则可以将函数的调用组织为throw get参数。例如:
www.my_web_site.org/my_func_name?x=1.234&y=3.456
结果,我期望一个仅包含一个实数的网页。
但是,对于我来说,使用更复杂的输入应该怎么做并不是很明显。假设作为某些参数的值,我们可以具有列表和字典。我应该如何在URL中对它们进行编码。我可以想象这样的事情:
www.my_web_site.org/my_func_name?x=[1,2,3,4]&y={1:'a',2:'b'}
但是,我不确定这是否是一个优雅的解决方案。有什么标准怎么做?也许我应该使用XML或JSON对输入进行编码。
相同的问题适用于输出。假设我们可以有字典或列表,甚至可以有一个集合作为输出。我应该如何代表它。我应该只使用str(output)
还是有另一个“标准”解决方案?
我应该使用
str(output)
吗?
不!首先,您需要使用,repr()
因为它为许多内置的Python类型返回有效的Python代码。但是,要解析该输出,您需要以某种方式执行它。尽管Python具有ast.literal_eval()
可以在不受信任的输入上运行的安全性(它只能处理字符串,数字,元组,列表,字典,布尔值和None
),但它仍然不是很可移植,并且很难传递Python数据代码。
最好的解决方案是使用JSON对其进行编码。您可以使用json.dumps
序列化和json.loads
反序列化来实现。
但是,在发送JSON有效负载时,我会使用POST而不是GET(即使对JSON数据进行URL编码是安全的-但在URL中包含一长串JSON并不是那么好)。这样,您可以简单地将整个JSON结构转储到请求正文中,使用application/json
Content-type,并且在后端,您甚至可以轻松访问它,例如,request.get_json()
如果您使用的是Flask。
如果需要支持JSON本身不支持的变量类型,则可以简单地将JSON编码器/解码器子类化,并将此类转换为所需的任何符号,例如datetime对象的ISO日期字符串。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句