CyStack logo
  • Sản phẩm & Dịch vụ
  • Giải pháp
  • Bảng giá
  • Công ty
  • Tài liệu
Vi

vi

Trang chủHướng dẫnPython HTTP Client – Cách gửi yêu cầu HTTP và xử lý phản hồi

Python HTTP Client – Cách gửi yêu cầu HTTP và xử lý phản hồi

CyStack blog 5 phút để đọc
CyStack blog30/08/2025
Locker Avatar

Chris Pham

Technical Writer

Locker logo social
Reading Time: 5 minutes

Python HTTP module định nghĩa các lớp cung cấp phía client của các giao thức HTTP và HTTPS. Trong hầu hết các chương trình, HTTP module không được sử dụng trực tiếp mà được kết hợp với urllib module để xử lý các kết nối URL và tương tác với các yêu cầu HTTP. Hôm nay chúng ta sẽ tìm hiểu cách sử dụng Python HTTP client để thực hiện yêu cầu HTTP và sau đó phân tích trạng thái phản hồi và lấy dữ liệu về nội dung phản hồi.

Python HTTP Client

Python HTTP Client

Trong bài đăng này về Python HTTP module, chúng ta sẽ thử tạo kết nối và thực hiện các yêu cầu HTTP như GET, POST và PUT. Hãy cùng tìm hiểu.

Tạo kết nối HTTP

Chúng ta sẽ bắt đầu với điều đơn giản nhất mà HTTP module có thể làm. Chúng ta có thể dễ dàng tạo các kết nối HTTP bằng cách sử dụng module này. Đây là một chương trình mẫu:

import http.client

connection = http.client.HTTPConnection('www.python.org', 80, timeout=10)
print(connection)

Hãy xem đầu ra của chương trình này:

python create connection

Trong tập lệnh này, chúng ta đã kết nối với URL trên Cổng 80 với một thời gian chờ cụ thể.

Python HTTP GET

Bây giờ, chúng ta sẽ sử dụng HTTP client để nhận phản hồi và trạng thái từ một URL. Hãy xem một đoạn code:

import http.client

connection = http.client.HTTPSConnection("www.journaldev.com")
connection.request("GET", "/")
response = connection.getresponse()
print("Status: {} and reason: {}".format(response.status, response.reason))

connection.close()

Trong tập lệnh ở trên, chúng ta đã sử dụng một URL và kiểm tra trạng thái bằng đối tượng kết nối. Hãy xem đầu ra của chương trình này:

python get request

Hãy nhớ đóng kết nối sau khi bạn đã sử dụng xong đối tượng kết nối. Ngoài ra, hãy lưu ý rằng chúng ta đã sử dụng HTTPSConnection để thiết lập kết nối vì trang web được phục vụ qua giao thức HTTPS.

Gặp phải lỗi: SSL: CERTIFICATE_VERIFY_FAILED?

Khi tôi lần đầu thực thi chương trình trên, tôi nhận được lỗi sau liên quan đến SSL certificates (chứng chỉ SSL).

$ python3.6 http_client.py
Traceback (most recent call last):
  File "http_client.py", line 4, in <module>
    connection.request("GET", "/")
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/http/client.py", line 1239, in request
    self._send_request(method, url, body, headers, encode_chunked)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/http/client.py", line 1285, in _send_request
    self.endheaders(body, encode_chunked=encode_chunked)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/http/client.py", line 1234, in endheaders
    self._send_output(message_body, encode_chunked=encode_chunked)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/http/client.py", line 1026, in _send_output
    self.send(msg)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/http/client.py", line 964, in send
    self.connect()
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/http/client.py", line 1400, in connect
    server_hostname=server_hostname)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/ssl.py", line 401, in wrap_socket
    context=self, session=session)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/ssl.py", line 808, in init
    self.do_handshake()
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/ssl.py", line 1061, in do_handshake
    self._sslobj.do_handshake()
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/ssl.py", line 683, in do_handshake
    self._sslobj.do_handshake()
ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:748)
$

Từ đầu ra, rõ ràng là nó có liên quan đến SSL certificates. Nhưng chứng chỉ trang web vẫn ổn, vì vậy phải có điều gì đó liên quan đến thiết lập của tôi. Sau khi tìm kiếm trên Google, tôi thấy rằng trên MacOS, chúng ta cần chạy tệp Install Certificates.command có trong thư mục cài đặt Python để khắc phục sự cố này. Hình ảnh bên dưới cho thấy đầu ra được tạo ra bởi việc thực thi lệnh này, có vẻ như nó đang cài đặt các certificates mới nhất để sử dụng khi tạo các kết nối SSL.

python install certificates command

Lưu ý rằng tôi gặp lỗi này trên Mac OS. Tuy nhiên, trên hệ thống Ubuntu của tôi, nó hoạt động hoàn toàn tốt.

python http client ubuntu

Lấy danh sách Header từ request

Từ phản hồi chúng ta nhận được, các headers (tiêu đề) thường chứa thông tin quan trọng về loại dữ liệu được gửi trở lại từ server và cả trạng thái phản hồi. Chúng ta có thể lấy danh sách các headers từ chính đối tượng phản hồi. Hãy xem một đoạn mã là một phiên bản được sửa đổi một chút của chương trình cuối cùng:

import http.client
import pprint

connection = http.client.HTTPSConnection("www.journaldev.com")
connection.request("GET", "/")
response = connection.getresponse()
headers = response.getheaders()
pp = pprint.PrettyPrinter(indent=4)
pp.pprint("Headers: {}".format(headers))

Hãy xem đầu ra của chương trình này:

python get all headers

Python HTTP POST

Chúng ta cũng có thể POST dữ liệu lên một URL với HTTP module và nhận lại phản hồi. Đây là một chương trình mẫu:

import http.client
import json

conn = http.client.HTTPSConnection('www.httpbin.org')

headers = {'Content-type': 'application/json'}

foo = {'text': 'Hello HTTP #1 **cool**, and #1!'}
json_data = json.dumps(foo)

conn.request('POST', '/post', json_data, headers)

response = conn.getresponse()
print(response.read().decode())

Hãy xem đầu ra của chương trình này:

python post request

Bạn có thể tự do sử dụng HTTP Bin library (thư viện HTTP Bin) để thử nhiều yêu cầu hơn.

Yêu cầu PUT HTTP Python

Tất nhiên, chúng ta cũng có thể thực hiện yêu cầu PUT bằng cách sử dụng chính HTTP module. Chúng ta sẽ sử dụng chương trình cuối cùng. Hãy xem một đoạn mã:

import http.client
import json

conn = http.client.HTTPSConnection('www.httpbin.org')

headers = {'Content-type': 'application/json'}

foo = {'text': 'Hello HTTP #1 **cool**, and #1!'}
json_data = json.dumps(foo)

conn.request("PUT", "/put", json_data)
response = conn.getresponse()
print(response.status, response.reason)

Hãy xem đầu ra của chương trình này:

python put request

Kết luận

Trong bài học này, chúng ta đã nghiên cứu các thao tác HTTP đơn giản có thể được thực hiện bằng cách sử dụng http.client. Chúng ta cũng có thể tạo python http server bằng cách sử dụng SimpleHTTPServer module. Tham khảo: API Doc

0 Bình luận

Đăng nhập để thảo luận

Chuyên mục Hướng dẫn

Tổng hợp các bài viết hướng dẫn, nghiên cứu và phân tích chi tiết về kỹ thuật, các xu hướng công nghệ mới nhất dành cho lập trình viên.

Đăng ký nhận bản tin của chúng tôi

Hãy trở thành người nhận được các nội dung hữu ích của CyStack sớm nhất

Xem chính sách của chúng tôi Chính sách bảo mật.

Đăng ký nhận Newsletter

Nhận các nội dung hữu ích mới nhất