मैं अपना संपूर्ण HTTP अनुरोध कैसे देख सकता हूं जो मेरे पायथन एप्लिकेशन द्वारा भेजा जा रहा है?


263

मेरे मामले में, मैं requestsHTTPS से अधिक PayPal के API को कॉल करने के लिए लाइब्रेरी का उपयोग कर रहा हूं । दुर्भाग्य से, मुझे पेपाल से एक त्रुटि मिल रही है, और पेपाल समर्थन यह पता नहीं लगा सकता है कि त्रुटि क्या है या क्या कारण है। वे चाहते हैं कि "कृपया संपूर्ण अनुरोध प्रदान करें, हेडर शामिल हैं"।

मैं उसे कैसे कर सकता हूँ?

जवाबों:


498

एक सरल विधि: अनुरोधों के हाल के संस्करणों में लॉगिंग सक्षम करें (1.x और अधिक।)

अनुरोध लॉगिंग वर्बोसिटी को नियंत्रित करने के लिए http.clientऔर loggingमॉड्यूल कॉन्फ़िगरेशन का उपयोग करता है , जैसा कि यहां वर्णित है

प्रदर्शन

लिंक्ड डॉक्यूमेंट से लिया गया कोड:

import requests
import logging

# These two lines enable debugging at httplib level (requests->urllib3->http.client)
# You will see the REQUEST, including HEADERS and DATA, and RESPONSE with HEADERS but without DATA.
# The only thing missing will be the response.body which is not logged.
try:
    import http.client as http_client
except ImportError:
    # Python 2
    import httplib as http_client
http_client.HTTPConnection.debuglevel = 1

# You must initialize logging, otherwise you'll not see debug output.
logging.basicConfig()
logging.getLogger().setLevel(logging.DEBUG)
requests_log = logging.getLogger("requests.packages.urllib3")
requests_log.setLevel(logging.DEBUG)
requests_log.propagate = True

requests.get('https://httpbin.org/headers')

उदाहरण आउटपुट

$ python requests-logging.py 
INFO:requests.packages.urllib3.connectionpool:Starting new HTTPS connection (1): httpbin.org
send: 'GET /headers HTTP/1.1\r\nHost: httpbin.org\r\nAccept-Encoding: gzip, deflate, compress\r\nAccept: */*\r\nUser-Agent: python-requests/1.2.0 CPython/2.7.3 Linux/3.2.0-48-generic\r\n\r\n'
reply: 'HTTP/1.1 200 OK\r\n'
header: Content-Type: application/json
header: Date: Sat, 29 Jun 2013 11:19:34 GMT
header: Server: gunicorn/0.17.4
header: Content-Length: 226
header: Connection: keep-alive
DEBUG:requests.packages.urllib3.connectionpool:"GET /headers HTTP/1.1" 200 226

1
धन्यवाद, @ EmmettJ.Butler =) हालांकि मुझे यकीन नहीं है कि यह जानकारी मूल पूछताछ के समय उपलब्ध थी।
निष्क्रिय

9
ध्यान दें कि पायथॉन 3 पर कैनप्लेब उपलब्ध नहीं है। कोड को पोर्टेबल बनाने के लिए, छह के import httplibसाथ बदलें import requests.packages.urllib3.connectionpool as httplibया उपयोग करें from six.moves import http_client as httplib
जेसन आर। कोम्बस

में requests2.18.1 और अजगर 3, लकड़हारा logging.getLogger("requests.packages.urllib3")मौजूद हैं या कोई प्रभाव नहीं है नहीं है।
फ्लिमल

1
Python3 के लिए यहाँ देखें - docs.python-requests.org/en/latest/api/?highlight=debug from http.client import HTTPConnection
shershen

दुर्भाग्य से "भेजें:" "उत्तर:" और "हेडर:" लाइनें वास्तव में लॉग नहीं होती हैं, लेकिन बस स्टडआउट के लिए मुद्रित होती हैं। लेकिन मैं इस जानकारी को लॉग फाइलों में रखना चाहता हूं!
१२:२२ की

145
r = requests.get('https://api.github.com', auth=('user', 'pass'))

rएक प्रतिक्रिया है। इसमें एक अनुरोध विशेषता होती है जिसमें आपको आवश्यक जानकारी होती है।

r.request.allow_redirects  r.request.headers          r.request.register_hook
r.request.auth             r.request.hooks            r.request.response
r.request.cert             r.request.method           r.request.send
r.request.config           r.request.params           r.request.sent
r.request.cookies          r.request.path_url         r.request.session
r.request.data             r.request.prefetch         r.request.timeout
r.request.deregister_hook  r.request.proxies          r.request.url
r.request.files            r.request.redirect         r.request.verify

r.request.headers हेडर देता है:

{'Accept': '*/*',
 'Accept-Encoding': 'identity, deflate, compress, gzip',
 'Authorization': u'Basic dXNlcjpwYXNz',
 'User-Agent': 'python-requests/0.12.1'}

फिर r.request.dataएक मानचित्रण के रूप में शरीर है। यदि आप urllib.urlencodeचाहें तो आप इसे बदल सकते हैं:

import urllib
b = r.request.data
encoded_body = urllib.urlencode(b)

प्रतिसाद के प्रकार के आधार पर .data-दोष गायब हो सकता है और .bodyइसके बजाय एक- कुटुंब हो सकता है।


14
इनमें से कौन मुझे "संपूर्ण अनुरोध, हेडर शामिल है" देता है?
क्रिस बी

1
कुछ और जोड़ा। हेडर और बॉडी के अलावा आपको और क्या चाहिए?
स्काइलर सावलैंड

8
मुझे पूरी तरह से यकीन नहीं है कि वे क्या देख रहे हैं। मैं उन सभी चीजों पर कब्जा करने की उम्मीद कर रहा था जो उनके लिए तार पर चले गए, उस सटीक प्रारूप में, बाइट-फॉर-बाइट।
क्रिस बी

18
यह मेरे मामले में ऐसा करने का पसंदीदा तरीका है। केवल एक नोट: मेरे मामले में response.requestऐसा प्रतीत होता है PreparedRequest; यह नहीं है .dataबल्कि .bodyइसके बजाय।
अंती हापला

2
पूर्ण URL (क्वेरिस्ट्रिंग मापदंडों के साथ) के लिए भी आप उपयोग कर सकते हैं response.url (जो इसमें थोड़ा अलग है कि यह नहीं हैresponse.request...
चक वैन डेर लिंडेन

6

ऐसा करने के लिए आप HTTP टूलकिट का उपयोग कर सकते हैं ।

यह विशेष रूप से उपयोगी है अगर आपको इसे जल्दी से करने की आवश्यकता है, जिसमें कोई कोड परिवर्तन नहीं है: आप HTTP टूलकिट से एक टर्मिनल खोल सकते हैं, वहां से किसी भी पायथन कोड को सामान्य रूप से चला सकते हैं, और आप हर HTTP / HTTPS की पूरी सामग्री देख पाएंगे। तुरंत अनुरोध करें।

एक मुफ़्त संस्करण है जो आपकी ज़रूरत का सब कुछ कर सकता है, और यह 100% खुला स्रोत है।

मैं HTTP टूलकिट का निर्माता हूं; मैंने वास्तव में कुछ समय पहले मेरे लिए उसी समस्या को हल करने के लिए इसे खुद बनाया था! मैं भी एक भुगतान एकीकरण डिबग करने की कोशिश कर रहा था, लेकिन उनका एसडीके काम नहीं कर रहा था, मैं क्यों नहीं बता सकता था, और मुझे यह जानने की जरूरत थी कि वास्तव में इसे ठीक करने के लिए क्या चल रहा था। यह बहुत निराशाजनक है, लेकिन कच्चे यातायात को देखने में सक्षम होने से वास्तव में मदद मिलती है।


5

यदि आप Python 2.x का उपयोग कर रहे हैं, तो urllib2 ओपनर इंस्टॉल करने का प्रयास करें । आपको अपने हेडर का प्रिंट आउट लेना चाहिए, हालाँकि आपको उस अन्य सलामी बल्लेबाज के साथ गठबंधन करना होगा जो आप HTTPS को हिट करने के लिए उपयोग कर रहे हैं।

import urllib2
urllib2.install_opener(urllib2.build_opener(urllib2.HTTPHandler(debuglevel=1)))
urllib2.urlopen(url)

2

verboseविन्यास विकल्प आपको आप क्या चाहते हैं को देखने के लिए अनुमति दे सकते हैं। नहीं है दस्तावेज में एक उदाहरण

नोट: नीचे दिए गए टिप्पणियों को पढ़ें: क्रिया विन्यास विकल्प अब उपलब्ध नहीं हैं।


3
वहाँ है? वास्तव में यह नहीं मिल सकता है।
बस्तीबेन


2
आह, कि यह समझा जाएगा। :) फिर भी, अब यह सवाल फिर से मान्य है, क्योंकि मुझे डिबगिंग के लिए सर्वर और क्लाइंट के बीच पूरे ट्रैफिक को प्रिंट करने का तरीका नहीं मिला।
बस्तीबेन

1
क्या क्रिया लॉगिंग के समान प्रभाव को प्राप्त करने के लिए एक "नया तरीका" सुझाया गया है?
cbare

1
मेरा उत्तर अनुरोधों के लिए सही तरीका दर्शाता है। 1.x और उच्चतर।
निष्क्रिय
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.