2016-08-09 1 views
0

Чтобы отфильтровать вывод, что я могу отправить JSON в API, как:Отправка полезной нагрузки для запроса GET в Python

curl -X GET https://api.mysite.com/user \ 
    -H "Authorization: XXXXX" \ 
    -H "Content-Type: application/json" 
    -d '{ 
    "q": { 
     "name": { 
      "eq": "0aslam0" 
     }   
    } 
    }' 

Вышеприведенные работает просто отлично. Я пытаюсь отправить тот же с помощью питона кода с помощью requests library.I попытался следующий код:

r = requests.get(url, headers=my_headers, params=payload) 

где

url = "https://api.mysite.com/user" 
my_headers = { 
    'Authorization': 'XXXXX', 
    'Content-Type': 'application/json', 
    'Accept': 'application/json', 
} 
data = { 
    "q": { 
     "name": { 
      "eq": "0aslam0" 
     } 
    } 
} 
payload = json.dumps(data) 

но r.text содержит вывод нормального GET без применения фильтра. Я зарегистрировал запрос и увидел, что получаю перенаправление 301. Я не понимаю свою ошибку.

EDIT 1

Я изменил код:

r = requests.get(url, headers=my_headers, json=payload) 

@Martijn был прав. Использование params было неправильным. Но вышеизложенное также не получилось. Я также добавил заголовок 'User-Agent': 'curl/7.40.0', чтобы узнать, может ли это сработать. Не повезло и там.

EDIT 2

Документация по API говорит, фильтрация может быть сделано другим способом. Изменение адреса на:

GET /user?q%5Bname%5D%5Beq%5D=0aslam0 HTTP/1.1 

Это HTML-код. Поэтому я попытался отформатировать мой URL-адрес в таком формате и не отправлять почтовую информацию, например:

r = requests.get(url, headers=my_headers) 

И это работает! Поэтому, по крайней мере, сейчас у меня есть решение моей проблемы. Но вопрос о том, как отправить полезную нагрузку (метод, описанный выше) для запроса GET, по-прежнему остается.

+0

Как сформирован заголовок авторизации? Существует ли какая-либо подпись, основанная на теле запроса? –

+0

Заголовок авторизации - это токен, созданный для любого разработчика API. Нет ничего такого, как подпись, зависящая от тела запроса. – 0aslam0

+0

Тогда у меня много идей; ниже приведен запрос, близкий к тому, что делает ваша команда 'curl' (что довольно странно * в том, что оно использует GET, а не' POST'). –

ответ

0

При использовании -d, данные отправляются по требованию тело. params отправляет строку запроса URL-адреса, поэтому это неправильный аргумент.

Обратите внимание, что упаковка вдоль тела запроса с использованием метода GET является технически нарушением HTTP-RFC.

Вы должны были бы отправить ваш запрос на data аргумент установлен вместо или передать в словаре аргументу json ключевого слова и requests будет кодировать, что и установить правильный Content-Type заголовок для вас:

my_headers = { 
    'Authorization': 'XXXXX', 
} 
data = { 
    "q": { 
     "name": { 
      "eq": "0aslam0" 
     } 
    } 
} 
r = requests.get(url, headers=my_headers, json=data) 
+0

Я пробовал это. Я все еще получаю нефильтрованный вывод. – 0aslam0

+0

@ 0aslam0: тот же HTTP-запрос генерируется как то, что производит ваша команда 'curl'. Единственное отличие - это заголовок 'User-Agent: curl/7.43.0'. –