আমার পাইথন অ্যাপ্লিকেশন দ্বারা প্রেরিত পুরো HTTP অনুরোধটি কীভাবে আমি দেখতে পাব?


263

আমার ক্ষেত্রে, আমি requestsএইচটিটিপিএসের মাধ্যমে পেপালের এপিআই কল করতে পাঠাগারটি ব্যবহার করছি । দুর্ভাগ্যক্রমে, আমি পেপাল থেকে ত্রুটি পেয়েছি, এবং পেপাল সমর্থনটি ত্রুটিটি কী তা বা এর কারণ কী তা নির্ধারণ করতে পারে না। তারা আমাকে "দয়া করে পুরো অনুরোধটি প্রদান করুন, শিরোনাম অন্তর্ভুক্ত করুন" চান।

আমি এটা কিভাবে করবো?

উত্তর:


498

একটি সহজ পদ্ধতি: অনুরোধগুলির সাম্প্রতিক সংস্করণগুলিতে লগিং সক্ষম করুন (1.x এবং উচ্চতর higher)

অনুরোধগুলি এখানে বর্ণিত হিসাবে লগিং ভার্বোসিটি নিয়ন্ত্রণ করতে 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
ধন্যবাদ, @ এমমেটজে.বাটলার =) যদিও আমি নিশ্চিত নই যে মূল তদন্তের সময় এই তথ্যটি ছিল।
অ্যাক্টিভিস্ট

9
লক্ষ্য করুন httplib কোড পোর্টেবল করতে, প্রতিস্থাপন করতে পাইথন 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")অস্তিত্ব বা কোনো প্রভাব নেই না।
Flimm

1
পাইথন 3 এর জন্য এখানে দেখুন - docs.python-requests.org/en/latest/api/?hightlight=debug from http.client import HTTPConnection
শেরশান

দুর্ভাগ্যক্রমে "প্রেরণ:" "জবাব:" এবং "শিরোনাম:" লাইনগুলি আসলে লগ হয় না, তবে কেবল স্টডআউটতে মুদ্রিত হয়। তবে আমি লগ ফাইলগুলিতে এই তথ্যটি পেতে চাই!
লেসনিক

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
আরও কিছু যুক্ত। হেডার এবং দেহ ছাড়া আপনার আর কী দরকার?
Skylar Saveland

8
আমি তারা পুরোপুরি নিশ্চিত নই যে তারা কী সন্ধান করছে। আমি আশা করছিলাম যে তার জন্য যা কিছু ছিল তার জন্য, সেই সঠিক ফর্ম্যাটে, বাইট-বাই-বাইট capture
ক্রিস বি।

18
এটি আমার ক্ষেত্রে এটি করার পছন্দের উপায়। কেবল একটি নোট: আমার ক্ষেত্রে এটি response.requestমনে হয় PreparedRequest; এটা নেই .dataকিন্তু .bodyপরিবর্তে।
অ্যান্টি হাপালা

2
পুরো ইউআরএলের জন্য (ক্যোরিস্টিং প্যারামিটার সহ) আপনিও ব্যবহার করতে পারেন response.url (যা এটির চেয়ে কিছুটা আলাদাresponse.request...
চক ভ্যান ডের লিন্ডেন

6

এটি করার জন্য আপনি HTTP টুলকিট ব্যবহার করতে পারেন ।

কোনও কোড পরিবর্তন না করে আপনার যদি এটি দ্রুত করার দরকার হয় তবে এটি বিশেষভাবে কার্যকর: আপনি এইচটিটিপি টুলকিট থেকে একটি টার্মিনাল খুলতে পারেন, সেখান থেকে যে কোনও পাইথন কোডটি স্বাভাবিক হিসাবে চালাতে পারেন এবং আপনি প্রতিটি এইচটিটিপি / এইচটিটিপিএসের সম্পূর্ণ সামগ্রী দেখতে সক্ষম হবেন অবিলম্বে অনুরোধ।

এখানে একটি নিখরচায় সংস্করণ রয়েছে যা আপনার প্রয়োজনীয় সমস্ত কিছু করতে পারে এবং এটি 100% মুক্ত উত্স।

আমি এইচটিটিপি টুলকিটের নির্মাতা; কিছুক্ষণ আগে আমার ঠিক একই সমস্যাটি সমাধান করার জন্য আমি নিজে এটি তৈরি করেছি! আমিও পেমেন্ট ইন্টিগ্রেশনটি ডিবাগ করার চেষ্টা করছিলাম, কিন্তু তাদের এসডিকে কাজ হয়নি, আমি কেন বলতে পারলাম না, এবং এটি সঠিকভাবে ঠিক করার জন্য আসলে আমার কী প্রয়োজন তা জানতে হবে। এটি অত্যন্ত হতাশার, তবে কাঁচা ট্র্যাফিকটি দেখতে সক্ষম হওয়া সত্যিই সহায়তা করে।


5

আপনি যদি পাইথন ২.x ব্যবহার করছেন তবে একটি urllib2 ওপেনার ইনস্টল করার চেষ্টা করুন । এটি আপনার শিরোনাম মুদ্রণ করা উচিত, যদিও আপনি এইচটিটিপিএস হিট করতে ব্যবহার করছেন এমন অন্যান্য ওপেনারদের সাথে এটি একত্রিত করতে হতে পারে।

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

2

verboseকনফিগারেশন বিকল্পটি কি আপনি চান দেখতে দেবে না। নেই ডকুমেন্টেশনে একটি উদাহরণ

দ্রষ্টব্য: নীচের মন্তব্যগুলি পড়ুন: ভার্বোজ কনফিগারেশন বিকল্পগুলি আর উপলভ্য বলে মনে হচ্ছে না।


3
এখানে? সত্যিই এটি খুঁজে পাচ্ছি না।
বস্টিবেন


2
আহ, এটি ব্যাখ্যা করবে। :) তবুও, এখন এই প্রশ্নটি আবার বৈধ, কারণ আমি ডিবাগিংয়ের জন্য সার্ভার এবং ক্লায়েন্টের মধ্যে পুরো ট্র্যাফিক প্রিন্ট করার কোনও উপায় খুঁজে পাইনি।
বস্টিবেন

1
ভার্বোজ লগিংয়ের মতো একই প্রভাব অর্জনের জন্য কি কোনও প্রস্তাবিত "নতুন উপায়" রয়েছে?
cbare

1
আমার উত্তর অনুরোধগুলির জন্য সঠিক পদ্ধতিটি প্রদর্শন করে 1.x এবং তারও বেশি।
নিষ্ক্রিয়
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.