Làm cách nào tôi có thể thấy toàn bộ yêu cầu HTTP được gửi bởi ứng dụng Python của tôi?


263

Trong trường hợp của tôi, tôi đang sử dụng requeststhư viện để gọi API của PayPal qua HTTPS. Thật không may, tôi đang gặp lỗi từ PayPal và bộ phận hỗ trợ PayPal không thể tìm ra lỗi đó là gì hoặc nguyên nhân gây ra lỗi đó. Họ muốn tôi "Vui lòng cung cấp toàn bộ yêu cầu, bao gồm các tiêu đề".

Làm thế nào tôi có thể làm điều đó?

Câu trả lời:


499

Một phương pháp đơn giản: cho phép đăng nhập vào các phiên bản Yêu cầu gần đây (1.x trở lên.)

Yêu cầu sử dụng cấu hình http.clientloggingmô-đun để kiểm soát mức độ chi tiết đăng nhập, như được mô tả ở đây .

Trình diễn

Mã trích từ tài liệu được liên kết:

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

Ví dụ đầu ra

$ 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
Cảm ơn, @ EmmettJ.Butler =) Mặc dù tôi không chắc thông tin này có sẵn tại thời điểm yêu cầu ban đầu.
hoạt động

9
Lưu ý rằng httplib không có sẵn trên Python 3. Để thực hiện các mã di động, thay thế import httplibbằng import requests.packages.urllib3.connectionpool as httplibhoặc sử dụng sáu và from six.moves import http_client as httplib.
Jason R. Coombs

Trong requests2.18.1 và Python 3, logger logging.getLogger("requests.packages.urllib3")không tồn tại hoặc không có hiệu lực.
Flimm

1
cho Python3 xem tại đây - docs.python-requests.org/en/latest/api/?highlight=debug from http.client import HTTPConnection
shershen

Thật không may, các dòng "send:" "reply:" và "header:" không thực sự được ghi lại, mà chỉ được in ra thiết bị xuất chuẩn. Nhưng tôi muốn có thông tin này trong các tệp nhật ký!
lesnik

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

rlà một phản ứng. Nó có một thuộc tính yêu cầu có thông tin bạn cần.

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 cung cấp cho các tiêu đề:

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

Sau đó r.request.datacó cơ thể như một bản đồ. Bạn có thể chuyển đổi cái này với urllib.urlencodenếu họ thích:

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

tùy thuộc vào loại phản hồi, phân .dataphối có thể bị thiếu và .bodythay vào đó là phân phối.


14
Cái nào trong số này cung cấp cho tôi "toàn bộ yêu cầu, bao gồm các tiêu đề"?
Chris B.

1
thêm một số chi tiết Bạn cần gì khác ngoài các tiêu đề và cơ thể?
Skylar Saveland

8
Tôi không hoàn toàn chắc chắn những gì họ đang tìm kiếm. Tôi đã hy vọng nắm bắt mọi thứ đi qua dây cho họ, ở định dạng chính xác đó, từng byte.
Chris B.

18
Đây là cách làm ưa thích trong trường hợp của tôi. Chỉ có một lưu ý: response.requestdường như là một PreparedRequesttrong trường hợp của tôi; nó không có .data.bodythay vào đó.
Antti Haapala

2
đối với URL đầy đủ (với các tham số chuỗi truy vấn), bạn cũng có thể sử dụng response.url (khác một chút ở chỗ không phải vậyresponse.request...
Chuck van der Linden

7

Bạn có thể sử dụng Bộ công cụ HTTP để làm chính xác điều này.

Điều này đặc biệt hữu ích nếu bạn cần thực hiện việc này nhanh chóng, không thay đổi mã: bạn có thể mở một thiết bị đầu cuối từ Bộ công cụ HTTP, chạy bất kỳ mã Python nào từ đó như bình thường và bạn sẽ có thể thấy toàn bộ nội dung của mỗi HTTP / HTTPS yêu cầu ngay lập tức.

Có một phiên bản miễn phí có thể làm mọi thứ bạn cần và đó là nguồn mở 100%.

Tôi là người tạo ra Bộ công cụ HTTP; Tôi thực sự đã xây dựng nó để giải quyết vấn đề chính xác cho tôi một thời gian trước đây! Tôi cũng đã cố gắng gỡ lỗi tích hợp thanh toán, nhưng SDK của họ không hoạt động, tôi không thể biết tại sao và tôi cần biết điều gì đang thực sự xảy ra để khắc phục chính xác. Thật là bực bội, nhưng có thể thấy lưu lượng truy cập thô thực sự có ích.


5

Nếu bạn đang sử dụng Python 2.x, hãy thử cài đặt công cụ mở urllib2 . Điều đó sẽ in ra các tiêu đề của bạn, mặc dù bạn có thể phải kết hợp nó với các trình mở khác mà bạn đang sử dụng để nhấn HTTPS.

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

2

Các verbosetùy chọn cấu hình có thể cho phép bạn xem những gì bạn muốn. Có một ví dụ trong tài liệu .

LƯU Ý: Đọc các bình luận bên dưới: Các tùy chọn cấu hình dài dòng dường như không còn khả dụng nữa.


3
Có? Không thể thực sự tìm thấy nó.
BastiBen

3
@con mèo xấu. Có một phần "Nhật ký dài dòng" tại thời điểm đó . Có vẻ như nó đã được gỡ bỏ vào tháng 12 .
Bruno

2
Ah, điều đó sẽ giải thích điều đó. :) Tuy nhiên, bây giờ câu hỏi này là hợp lệ một lần nữa, vì tôi không thể tìm cách in toàn bộ lưu lượng giữa máy chủ và máy khách để gỡ lỗi.
BastiBen

1
Có "cách mới" nào được đề xuất để đạt được hiệu quả tương tự như ghi nhật ký chi tiết không?
cbare

1
Câu trả lời của tôi cho thấy phương pháp đúng cho Yêu cầu 1.x trở lên.
hoạt động
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.