Python 요청에서 응답을 읽으려면 어떻게해야합니까?


83

두 개의 Python 스크립트가 있습니다. 하나는 Urllib2 라이브러리 를 사용하고 다른 하나는 요청 라이브러리를 사용합니다. .

Requests를 구현하기가 더 쉽다는 것을 알았지 만 urlib2의 read()기능에 해당하는 것을 찾을 수 없습니다 . 예를 들면 :

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

게시물 URL을 구축 data = response.read()하면 콘텐츠를 제공합니다. vcloud director api 인스턴스에 연결하려고하는데 응답에 액세스 권한이있는 엔드 포인트가 표시됩니다. 그러나 다음과 같이 Requests 라이브러리를 사용하면 .....

....

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"

....

.... the print post_call.textand 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 요청의 경우가 많습니다. 아마도 쿠키를 설정했을까요? 상태 코드는 결국 POST가 성공했음을 알려줍니다.


3
알았어 고마워. 어딘가에서 혼란스러워지는 것 같습니다. urllib2는 콘텐츠를 보여 주므로 내가 뭘 잘못하고 있는지 그리고 두 라이브러리 간의 다른 호출을 이해해야합니다.
Oli

특정 끝점에서 요청을 읽고 싶지만 requests.get ( "url")을 사용할 수 없습니다. 또한 실행하는 데 불합리한 시간이 걸립니다. 인수를 제공하지 않으면 1 개의 인수가 필요하다는 오류가 발생합니다.
Eswar

응답 코드를 확인하십시오. 2XX 응답이 아닌 시간 초과가 발생할 수 있습니다. 그것은 왜 그렇게 오랜 시간이 걸리는지 설명 할 것입니다.
aychedee

완벽한 솔루션. 당신은 내 시간을 절약했습니다. 감사합니다
Soham Navadiya

1
파이썬 3에서, response.contentA는 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)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.