我正在通过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错误(错误请求)?似乎是编码问题。
答案 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。