Python uygulamam tarafından gönderilen HTTP isteğinin tamamını nasıl görebilirim?


263

Benim durumumda, requestskütüphaneyi PayPal'ın API'sını HTTPS üzerinden aramak için kullanıyorum . Ne yazık ki, PayPal'dan bir hata alıyorum ve PayPal desteği hatanın ne olduğunu veya neye neden olduğunu bulamıyor. Benden "Lütfen tüm istek, başlıklar dahil" sağlamak istiyorum.

Bunu nasıl yapabilirim?

Yanıtlar:


499

Basit bir yöntem: İsteklerin son sürümlerinde (1.x ve üstü) günlüğe kaydetmeyi etkinleştirin.

İstekler, burada açıklandığı gibi günlük ayrıntı düzeyini kontrol etmek için http.clientve loggingmodül yapılandırmasını kullanır .

gösteri

Bağlantı verilen belgelerden alıntılanan kod:

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')

Örnek Çıktı

$ 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
Teşekkürler, @ EmmettJ.Butler =) Gerçi bu bilginin orijinal soruşturma sırasında mevcut olduğundan emin değilim.
Aktif Olmayan

9
Httplib'in Python 3'te mevcut olmadığını unutmayın. Kodu taşınabilir yapmak için altı ve import httplibile değiştirin import requests.packages.urllib3.connectionpool as httplibveya kullanın from six.moves import http_client as httplib.
Jason R. Coombs

In requests2.18.1 ve Python 3, kaydedici logging.getLogger("requests.packages.urllib3")yok veya hiçbir etkisi olmaz.
Flimm

1
Python3 için buraya bakın - docs.python-requests.org/en/latest/api/?highlight=debug from http.client import HTTPConnection
shershen

Ne yazık ki "send:" "answer:" ve "header:" satırları gerçekte günlüğe kaydedilmez, sadece stdout'a yazdırılır. Ama bu bilgilerin günlük dosyalarında olmasını istiyorum!
lesnik

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

rbir yanıttır. İhtiyacınız olan bilgileri içeren bir istek özelliğine sahiptir.

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 başlıkları verir:

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

Sonra r.request.databir haritalama olarak vücuda sahiptir. İstedikleri urllib.urlencodetakdirde bunu dönüştürebilirsiniz :

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

cevabın türüne bağlı olarak .data-attribute eksik olabilir ve .bodybunun yerine bir -attribute olabilir.


14
Bunlardan hangisi bana "tüm istek, başlıklar dahil" veriyor?
Chris B.

1
biraz daha ekledi. Üstbilgilerin ve gövdenin dışında başka neye ihtiyacınız var?
Skylar Saveland

8
Ne aradıklarından tam olarak emin değilim. Onlar için tel üzerinden geçen her şeyi, tam olarak byte-byte-byte-byte için yakalamayı umuyordum.
Chris B.

18
Benim durumumda bunu yapmanın tercih edilen yolu budur. Sadece bir not: benim durumumda response.requestbir gibi görünüyor PreparedRequest; değil .dataama .bodyonun yerine.
Antti Haapala

2
URL'nin tamamı için (sorgu dizesi parametreleriyle) kullanabilirsiniz response.url (ki bu biraz farklı değilresponse.request...
Chuck van der Linden

7

Tam olarak bunu yapmak için HTTP Araç Kiti'ni kullanabilirsiniz .

Bunu, kod değişikliği olmadan hızlı bir şekilde yapmanız gerekirse özellikle yararlıdır: HTTP Araç Kiti'nden bir terminal açabilir, herhangi bir Python kodunu normal olarak çalıştırabilir ve her HTTP / HTTPS'nin tam içeriğini görebilirsiniz hemen isteyin.

İhtiyacınız olan her şeyi yapabileceğiniz ücretsiz bir sürüm var ve% 100 açık kaynak.

Ben HTTP Araç Kiti'nin yaratıcısıyım; Aslında bir süre önce aynı problemi çözmek için kendim yaptım! Ben de bir ödeme entegrasyonunda hata ayıklamaya çalışıyordum, ancak SDK'ları işe yaramadı, nedenini anlayamadım ve düzgün bir şekilde düzeltmek için neler olduğunu bilmem gerekiyordu. Bu çok sinir bozucu, ancak ham trafiği görebilmek gerçekten yardımcı oluyor.


5

Python 2.x kullanıyorsanız, bir urllib2 açıcı kurmayı deneyin . HTTPS'yi vurmak için kullandığınız diğer açıcılar ile birleştirmeniz gerekebilir, ancak bu başlıklarınızı yazdırmalıdır.

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

2

verboseYapılandırma seçeneği istediğini görmelerine olanak verebilir. Belgelerde bir örnek var .

NOT: Aşağıdaki yorumları okuyun: Ayrıntılı yapılandırma seçenekleri artık mevcut görünmüyor.


3
Var? Gerçekten bulamıyorum.
BastiBen


2
Ah, bunu açıklar. :) Yine de, şimdi bu soru yine geçerli, çünkü hata ayıklama için sunucu ve istemci arasındaki tüm trafiği yazdırmanın bir yolunu bulamadım.
BastiBen

1
Ayrıntılı günlük kaydı ile aynı etkiyi elde etmenin önerilen bir "yeni yolu" var mı?
cbare

1
Cevabım İstekler 1.x ve üstü için doğru yöntemi göstermektedir.
İnaktivist
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.