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 является недействительным и, следовательно, мешают мне правильно обращаться к данным?

Другая, возможно неактуальная информация:

  1. Часть params строки URL, которую я передаю объекту OAuth1Session, теперь выглядит так: '/city_furniture/items%3Ffilter%3Ddescription%24CONT%22Ag%22'

  2. Пример фильтрации с сайта API: proposals/master/roads/items?filter=description$CONT"highway"

  3. Я попытался передать аргумент '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 и сбежал должным образом, по мере необходимости. (Такие токены обычно содержат = символы, например, недопустимые в значениях строки запроса.)

Другие вопросы по тегам