根据参数构建请求体

时间:2016-11-15 18:20:43

标签: python python-2.7

我想知道构建我将发送请求的主体的最佳方式,具体取决于传递的参数。

这是情景:

你可能首先建立一个像这样的身体:

data={
    'user': user,
    'password': password,
    'somethingelse': somethingelse,
    }

好的,那么这些就是要发布的必填字段。如果API调用有5-10个其他字段,您可以选择填充该怎么办?

如果我传入* args作为我的post函数,我可以将可选字段留空,并用args填充它们,但如果args为空,则总是会失败。有时,即使发布一个没有任何内容的可选字段,API仍会返回错误,因为它需要一个值。

更新 需要更多信息,所以让我试着解释一下。

我现在正在使用不同的REST API进行大量工作,而且我经常与自己讨论,我应该如何设计所有不同的POST / GET功能。

举个例子:

  def search(self, query, ??):
    """
    Executes a searchquery, that is then stored and needs
    to be called again to get results, using the returned
    search_id.
    :param query: Query to be run with the search
    :return: Array of the current searchid, which is needed
             for other functions, and the content of HTTP response.
    """
    search_id = int(round(time.time() * 1000))
    if len(args) > 0:
        response = self._post(
            '/server/search', data={
                'query': query,
                'search_session_id': search_id,
                'user_session_id': self.token,
            })

在此示例中,start_timeend_time可以包含在此请求中,因为参数都是可选的,但如果使用它们都必须存在。

然后我想,我怎么设计这个,所以用户可以选择使用可选参数,或者决定保留默认值。

现在问题是,如果需要或要求,我将如何插入可选参数?我是否永远不会将关键参数存储在函数中,并始终在调用函数时解析所有键和值元素?有人会这么好,也许让我知道几种不同的方法来实现这个目标吗?

如果有人需要有关我的想法的更多信息,请告诉我。

1 个答案:

答案 0 :(得分:0)

这个答案是由@Antti Haapala在python聊天室中提供的。

在帖子请求中保留静态数据本身很好,并且在请求中添加对请求中的关键字参数(** kwargs)的支持可以在python 2.7中通过合并数据然后将其发送到post请求之前的两种方式来完成像这样:

def search(self, query, **kwargs):
    """
    Executes a searchquery, that is then stored and needs
    to be called again to get results, using the returned
    search_id.
    :param query: Query to be run with the search
    :return: Array of the current searchid, which is needed
             for other functions, and the content of HTTP response.
    """
    search_id = int(round(time.time() * 1000))
    data ={
        'query': query,
        'search_session_id': search_id,
        'user_session_id': self.token,
    }
    data.update(kwargs)
    response = self._post('/server/search', data)
    return search_id, response.json()

或者在添加** kwarg值之前将数据更改为dict:

def search(self, query, **kwargs):
    """
    Executes a searchquery, that is then stored and needs
    to be called again to get results, using the returned
    search_id.
    :param query: Query to be run with the search
    :return: Array of the current searchid, which is needed
             for other functions, and the content of HTTP response.
    """
    search_id = int(round(time.time() * 1000))
    if len(args) > 0:
        response = self._post(
            '/server/search', data=dict(
                query=query,
                search_session_id=search_id,
                user_session_id=self.token,
                **kwargs
            ))
    return search_id, response.json()

在python 3中,您可以直接添加它,而不是合并,或将变量更改为dict。