0

我正在用 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
         }
  ]
}

我的映射器不支持上述请求所需的嵌套数组。

那么我应该如何解决这个问题呢?我应该让用户传入身体的字典表示吗?有没有其他更好的方法来保持我的方法签名的合理长度,同时为最终用户做尽可能多的事情?

4

1 回答 1

0

恕我直言,这里的问题是您实际上并没有使用这些 API 概念对对象进行建模,因此您不能将责任委托给它们。当我遇到这种情况时,我创建了两个模型:API 的低级 OO 表示和我的域的高级 OO 模型。通过这种方式,应用程序中的所有概念都被表示(API 和域),因此我可以在我认为合适的时候委托给它们。这里有几个类似的问题,我在其中详细解释了这一点:

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

最适合从服务器发出各种请求的应用程序的设计模式

高温高压

于 2013-01-24T12:17:51.107 回答