用Python设计带有大量参数的API客户端
我正在用Python为一个流行的RESTful API构建客户端,现在我想找出最好的方法来处理那些有很多可选值的接口。
让我来解释一下。
首先,我有一个方法,可以把命名参数转换成合适的json格式。
def map_kwargs_to_payload(self, **kwargs):
payload = {}
for key in kwargs:
payload[key] = kwargs[key]
return payload
这样我就可以创建看起来像这样的函数签名:
def some_rest_method(**kwargs):
payload = map_kwargs_to_payload(**kwargs)
self.transmit('PUT', '/endpoint', payload)
这效果很好——它让我避免在用户可以传入很多选项时,写出复杂的代码。
def some_rest_method(setting_1=None, setting_2=None, setting_3=None, etc...):
但它的缺点是,当请求体需要像下面这样,有几个可选的参数时,就不太好用了:
{
"setting_1" : foo,
"setting_2" : foo,
"setting_3" : [{
"IsEnabled" : 1,
"Type" : x
}, {
"IsEnabled" : 1,
"Type" : x
}
]
}
我的映射器不支持像上面请求那样的嵌套数组。
那么我该怎么解决这个问题呢?我是不是应该让用户传入一个字典格式的请求体?有没有其他更好的方法,可以在保持函数签名简洁的同时,尽量为用户提供便利呢?
1 个回答
0
在我看来,这里问题的关键是你没有用对象来真正建模那些API概念,所以你无法把责任交给它们。当我遇到这种情况时,我会创建两个模型:一个是低级的面向对象的API表示,另一个是高级的面向对象的领域模型。这样,应用程序中的所有概念(包括API和领域)都得到了表示,因此我可以根据需要将责任交给它们。这里有几个类似的问题,我详细解释了这个过程:
希望对你有帮助