Python请求表单编码的参数,但不请求URL

时间:2019-05-20 23:30:36

标签: python-3.x python-requests microsoft-graph

我正在通过Python 3和Requests使用Microsoft Graph API。以下代码有效:

r = graph_session.get(graph_endpoint + '''/groups?$filter=groupTypes/any(c:c+eq+'Unified')''')
print(r.url)

>>> https://graph.microsoft.com/v1.0/groups?$filter=groupTypes/any(c:c+eq+'Unified')

但是,这不起作用:

parameters = {'$filter': '''groupTypes/any(c:c+eq+'Unified')'''}
r = graph_session.get(graph_endpoint + '/groups', params=parameters)
print(r.url)

>>> https://graph.microsoft.com/v1.0/groups?%24filter=groupTypes%2Fany%28c%3Ac%2Beq%2B%27Unified%27%29

为什么后一种方法看起来更干净,却会产生400错误(错误请求)?似乎是编码问题。

1 个答案:

答案 0 :(得分:1)

  

似乎是编码问题。

实际上是这样,在这种情况下,对过滤器表达式进行编码(即by design),并且Microsoft Graph返回以下错误:

{
    "error": {
        "code": "BadRequest",
        "message": "Invalid filter clause",
        //...
    }
}

如果将params参数作为string传递,则可以防止编码:

parameters = {'$filter': '''groupTypes/any(c:c+eq+'Unified')'''}
parameters_str = "&".join("%s=%s" % (k, v) for k, v in parameters.items())
r = graph_session.get(graph_endpoint + '/groups', params=parameters_str, headers=headers)

有关其他选项,请参考this answer