मैं पायथन अनुरोधों की प्रतिक्रिया कैसे पढ़ूं?


83

मेरे पास दो पायथन स्क्रिप्ट हैं। एक Urllib2 पुस्तकालय का उपयोग करता है और एक अनुरोध पुस्तकालय का उपयोग करता है ।

मैंने अनुरोधों को लागू करना आसान पाया है, लेकिन मैं urlib2 के read()फ़ंक्शन के लिए एक समान नहीं पा सकता हूं । उदाहरण के लिए:

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

एक बार जब मैं अपना पोस्ट url बना लेता हूं, तो data = response.read()मुझे वह सामग्री मिल जाती है - मैं एक vcloud निदेशक एपीआई उदाहरण से जुड़ने की कोशिश कर रहा हूं और प्रतिक्रिया उन समापन बिंदुओं को दिखाती है जिनकी मेरे पास पहुंच है। हालाँकि अगर मैं अनुरोध पुस्तकालय का उपयोग निम्नानुसार करता हूं ....।

....

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 से क्या प्रतिक्रिया मिल रही है?
शशांक 15'13

POST अनुरोध पुनर्निर्देशित प्रतिक्रिया लौटा सकता है। प्रतिक्रिया हेडर की जाँच करें:post_call.headers
जॉन कीज

जवाबों:


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 आखिर सफल क्यों हुआ।


3
ठीक है धन्यवाद। शायद मैं कहीं उलझन में हूँ। urllib2 मुझे सामग्री दिखाता है इसलिए मुझे यह समझने की आवश्यकता है कि मैं क्या गलत कर रहा हूं और 2 पुस्तकालयों के बीच अलग-अलग कॉल।
ओली

एक निश्चित समापन बिंदु पर मैं अनुरोध पढ़ना चाहता हूं, लेकिन मैं request.get ("url") का उपयोग करने में असमर्थ हूं। इसके अलावा इसे निष्पादित करने में अनुचित समय लगता है। कोई तर्क नहीं देते हुए यह भी कहते हैं कि 1 तर्क के लिए आवश्यक त्रुटि है।
इस्वर

प्रतिक्रिया कोड की जाँच करें। आपको शायद 2XX प्रतिक्रिया के बजाय टाइमआउट मिल रहा है। यही कारण है कि यह भी इतना लंबा समय लगता है की व्याख्या करेगा।
aychedee

सही समाधान। आपने मेरा समय बचाया। थैंक्यू
सोहम नवदिया

1
पायथन 3 में, response.contentएक Bytesउदाहरण है, और response.textहै str, इसलिए वे अब सीधे बराबर की तुलना नहीं करेंगे (लेकिन response.contentसही एन्कोडिंग के साथ डिकोडिंग वापस आनी चाहिएresponse.text
sankecharmerb

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

यदि आप उदाहरण के लिए छवि को कुछ एपीआई पर धक्का देते हैं और परिणाम का पता (प्रतिक्रिया) चाहते हैं तो आप वापस कर सकते हैं:

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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.