OAuth1Session Кодировка URL Джанго
Хорошо, мне нужна помощь с тем, что я считаю простым вопросом, но, покопавшись довольно долго, я оставлю это вам, блестящие люди, чтобы показать мне, почему я не!
Я пытаюсь получить доступ к API провайдера, URL которого я пытаюсь получить: .../proposals/AnotherTestProposal/city_furniture/items?filter=description$CONT"Ag"
:: это способ, которым они хотят, чтобы он прошел, и он должен вернуть все элементы, описания которых содержат строку "Ag". Я знаю, у меня есть два из них в настоящее время.
Я использую Django 1.9.4 и request_oauthlib для создания OAuth1Session, я делаю это также успешно, потому что я могу получить доступ к ресурсам без параметров URL. Беда в том, что я не могу получить "?filter=description..."
часть для правильного кодирования, и это дает мне 401.
Когда я рендеринг.contents в HTML, я получаю:
{"status": 404, "message": "", "data": [], "arguments": {"id": "items?filter=description$CONT\"Ag\"", "collection": "city_furniture"}}
который говорит мне, что часть "АГ" сбежала, чего я не хочу. Как в: я не хочу \"Ag\", я хочу "Ag".
Итак, мой вопрос: как я могу передать URL с параметрами, чтобы они не содержали косую черту, так как они приводят к тому, что URL является недействительным и, следовательно, мешают мне правильно обращаться к данным?
Другая, возможно неактуальная информация:
Часть params строки URL, которую я передаю объекту OAuth1Session, теперь выглядит так:
'/city_furniture/items%3Ffilter%3Ddescription%24CONT%22Ag%22'
Пример фильтрации с сайта API:
proposals/master/roads/items?filter=description$CONT"highway"
Я попытался передать аргумент 'encoding' в.get (чтобы изменить кодировку, используемую to_native_string), но запросы отклонили его, сказав, что это недопустимый аргумент
За комментарии, дополнительный код. Использование имени функции get_protected_code()
чтобы информация OAuth прошла правильно, то в views.py
:
api_filter_url = settings.IW_API_MODEL_COLLECTION + '/' + model_id + '/' + settings.IW_API_PROPOSAL_COLLECTION + '/' + proposal_name + '/city_furniture/items%3Ffilter%3Ddescription%24CONT%22Ag%22'
json_model_info_pull = get_protected_data(api_filter_url)
find_vendor = json_model_info_pull.content
def get_protected_data(url_str):
## ...stuffs to create OAuth1Session...
adsk_pull = OAuth1Session(key,
client_secret=secret,
resource_owner_key=oauth_token_use,
resource_owner_secret=oauth_token_secret_use,
)
headers = {'accept': 'application/vnd.autodesk.infraworks-v1+json'}
api_url = settings.ADSK_IW_INFO_BASE_URL + url_str
json_model_info_pull = adsk_pull.get(api_url, headers=headers)
return json_model_info_pull
1 ответ
Похоже, что вы неправильно передаете параметры, добавляя их в конец URL в URL-кодировке, что requests
считается намеренным, и конечная точка API переводится непреднамеренно.
Из документации дляrequests
, вы должны предоставить params
Ключевой аргумент для requests.get
: dict
содержит пары ключ-значение, которые должны быть закодированы и отправлены как строка запроса для запроса. Например, чтобы выполнить запрос к API GitHub, мы можем передать токен API в качестве параметра запроса:
requests.get('http://api.github.com/user',
params={ 'access_token' : MY_OAUTH_TOKEN })
Результирующий запрос будет содержать строку запроса с access_token
параметр установлен на значение, хранящееся в MY_OAUTH_TOKEN
и сбежал должным образом, по мере необходимости. (Такие токены обычно содержат =
символы, например, недопустимые в значениях строки запроса.)