用Python设计带有大量参数的API客户端

0 投票
1 回答
1373 浏览
提问于 2025-04-17 13:27

我正在用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和领域)都得到了表示,因此我可以根据需要将责任交给它们。这里有几个类似的问题,我详细解释了这个过程:

将远程数据与本地对象映射/解耦

适合一个从服务器发出各种请求的应用的设计模式

希望对你有帮助

撰写回答