Як прочитати відповідь із запитів Python?


83

У мене є два сценарії Python. Один користується бібліотекою Urllib2, а другий - бібліотекою запитів .

Я знайшов запити простішими для реалізації, але я не можу знайти еквівалент для read()функції urlib2 . Наприклад:

...
response = url.urlopen(req)
print response.geturl()
print response.getcode()
data = response.read()
print data

Після того, як я створив URL-адресу свого повідомлення, data = response.read()надаю мені вміст - я намагаюся підключитися до екземпляра api vcloud director, і відповідь показує кінцеві точки, до яких я маю доступ. Однак якщо я використовую бібліотеку запитів наступним чином .....

....

def post_call(username, org, password, key, secret):

    endpoint = '<URL ENDPOINT>'
    post_url = endpoint + 'sessions'
    get_url = endpoint + 'org'
    headers = {'Accept':'application/*+xml;version=5.1', \
               'Authorization':'Basic  '+ base64.b64encode(username + "@" + org + ":" + password), \
               'x-id-sec':base64.b64encode(key + ":" + secret)}
    print headers
    post_call = requests.post(post_url, data=None, headers = headers)
    print post_call, "POST call"
    print post_call.text, "TEXT"
    print post_call.content, "CONTENT"
    post_call.status_code, "STATUS CODE"

....

.... print post_call.textі print post_call.contentнічого не повертає, навіть якщо код стану дорівнює 200 у запитах після дзвінка.

Чому моя відповідь із запитів не повертає жодного тексту чи вмісту?


1
Чи знаєте ви тип відповіді, який ви повинні отримати за URL-адресою? Json, xml тощо? Яку відповідь ви отримуєте від urllib2?
shshank

Запит POST може повертати відповідь на переадресацію. Перевірте заголовки відповідей:post_call.headers
John Keyes

Відповіді:


134

Запити не мають еквівалента Urlib2 read().

>>> import requests
>>> response = requests.get("http://www.google.com")
>>> print response.content
'<!doctype html><html itemscope="" itemtype="http://schema.org/WebPage"><head>....'
>>> print response.content == response.text
True

Схоже, запит POST, який ви робите, не повертає жодного вмісту. Що часто трапляється із запитом POST. Можливо, він встановив cookie? Код стану повідомляє вам, що POST все-таки вдався.


3
добре, дякую. Можливо, я десь плутаюся. urllib2 показує мені вміст, тому мені потрібно зрозуміти, що я роблю не так, і різні дзвінки між двома бібліотеками.
Олі

У певній кінцевій точці я хочу прочитати запит, але я не можу скористатися request.get ("url"). Більше того, для виконання потрібен нерозумний час. Не надаючи аргументів, також виникає помилка, в якій говориться про необхідність 1 аргументу.
Есвар

Перевірте код відповіді. Ймовірно, ви отримуєте час очікування, а не відповідь 2XX. Це пояснювало б, чому це також вимагає такого часу.
aychedee

Ідеальне рішення. Ти врятував мій час. Спасибі
Сохам Навадія

1
У Python 3 response.contentє Bytesекземпляр і response.textє str, тому вони більше не будуть порівнювати рівні безпосередньо (але декодування response.contentз правильним кодуванням має повернутисяresponse.text
snakecharmerb

26

Якщо відповідь у json, ви можете зробити щось на зразок (python3):

import json
import requests as reqs

# Make the HTTP request.
response = reqs.get('http://demo.ckan.org/api/3/action/group_list')

# Use the json module to load CKAN's response into a dictionary.
response_dict = json.loads(response.text)

for i in response_dict:
    print("key: ", i, "val: ", response_dict[i])

Щоб побачити все у відповіді, ви можете використовувати .__dict__:

print(response.__dict__)

1

Якщо ви натискаєте, наприклад, зображення на якийсь API і хочете повернути адресу результату (відповідь), ви можете зробити:

import requests
url = 'https://uguu.se/api.php?d=upload-tool'
data = {"name": filename}
files = {'file': open(full_file_path, 'rb')}
response = requests.post(url, data=data, files=files)
current_url = response.text
print(response.text)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.