Python запрашивает форму-кодирует параметры, но не URL-адреса - PullRequest
1 голос
/ 21 мая 2019

Я работаю с Microsoft Graph API через Python 3 и запросы. Работает следующий код:

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 Ответ

1 голос
/ 24 мая 2019

Кажется, это проблема кодирования.

Действительно, в этом случае выражение фильтра кодируется (что является по дизайну ), и 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)

См. этот ответ длядругие варианты.

...