Python http client https

http — HTTP modules¶

http is a package that collects several modules for working with the HyperText Transfer Protocol:

  • http.client is a low-level HTTP protocol client; for high-level URL opening use urllib.request
  • http.server contains basic HTTP server classes based on socketserver
  • http.cookies has utilities for implementing state management with cookies
  • http.cookiejar provides persistence of cookies

The http module also defines the following enums that help you work with http related code:

A subclass of enum.IntEnum that defines a set of HTTP status codes, reason phrases and long descriptions written in English.

>>> from http import HTTPStatus >>> HTTPStatus.OK HTTPStatus.OK >>> HTTPStatus.OK == 200 True >>> HTTPStatus.OK.value 200 >>> HTTPStatus.OK.phrase 'OK' >>> HTTPStatus.OK.description 'Request fulfilled, document follows' >>> list(HTTPStatus) [HTTPStatus.CONTINUE, HTTPStatus.SWITCHING_PROTOCOLS, . ] 

Источник

Модуль HTTP в Python

Модуль HTTP в Python определяет классы, которые обеспечивают клиентскую сторону протоколов HTTP и HTTPS. В большинстве программ модуль HTTP не используется напрямую, он объединен с модулем urllib для обработки URL-соединений и взаимодействия с HTTP-запросами. Сегодня мы узнаем, как использовать HTTP-клиент Python для запуска HTTP-запроса, а затем проанализируем статус ответа и получим данные.

В этом посте мы попробуем установить соединения и сделать HTTP-запросы, такие как GET, POST и PUT.

Читайте также:  String join java пример

Создание HTTP-соединений

С помощью этого модуля мы можем легко устанавливать HTTP-соединения. Вот пример программы:

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

Давайте посмотрим на результат этой программы:

python http connection

В этом скрипте мы подключились к URL-адресу на порту 80 с определенным таймаутом.

GET

Теперь мы будем использовать HTTP-клиент, чтобы получить ответ и статус по URL-адресу. Давайте посмотрим на фрагмент кода:

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

В приведенном выше сценарии мы использовали URL-адрес и проверили статус с помощью объекта подключения. Давайте посмотрим на результат этой программы.

Не забудьте закрыть соединение, как только вы закончите работу с объектом. Также обратите внимание, что мы использовали HTTPSConnection для установления соединения, поскольку веб-сайт обслуживается по протоколу HTTPS.

Получение SSL: ошибка CERTIFICATE_VERIFY_FAILED

Когда я впервые выполнил указанную выше программу, я получил следующую ошибку, связанную с сертификатами SSL.

$ python3.6 http_client.py Traceback (most recent call last): File "http_client.py", line 4, in 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) $

Из вывода было ясно, что он должен что-то делать с сертификатами SSL. Но сертификат веб-сайта в порядке, так что это должно быть что-то с настройкой. После некоторого поиска в Google я обнаружил, что в MacOS нам нужно запустить файл Install Certificates.command, находящийся в каталоге установки в Python, чтобы исправить эту проблему. На изображении ниже показан результат выполнения этой команды, похоже, что он устанавливает последние сертификаты, которые будут использоваться при создании SSL-соединений.

Ошибка ssl CERTIFICATE_VERIFY_FAILED в python

Обратите внимание, что я получил эту ошибку в Mac OS. Однако в моей системе Ubuntu он работал отлично.

HTTP Клиент Ubuntu в Python

Получение списка заголовков из ответа

Заголовки получаемого из ответа обычно также содержат важную информацию о типе данных, отправляемых обратно с сервера, а также о статусе ответа. Мы можем получить список заголовков из самого объекта ответа. Давайте посмотрим на фрагмент кода, который представляет собой немного измененную версию последней программы:

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

Посмотрим на результат этой программы:

Заголовки http-запросов в python

Запрос POST

Мы также можем отправить данные POST в URL-адрес с помощью модуля HTTP и получить ответ. Вот пример программы:

import http.client import json conn = http.client.HTTPSConnection('www.httpbin.org') headers = foo = json_data = json.dumps(foo) conn.request('POST', '/post', json_data, headers) response = conn.getresponse() print(response.read().decode())

Давайте посмотрим на результат этой программы:

http post

Не бойтесь использовать библиотеку HTTP Bin, чтобы попробовать больше запросов.

HTTP-запрос PUT

Конечно, мы также можем выполнить запрос PUT, используя сам модуль HTTP. Воспользуемся самой последней программой. Давайте посмотрим на фрагмент кода:

import http.client import json conn = http.client.HTTPSConnection('www.httpbin.org') headers = foo = json_data = json.dumps(foo) conn.request("PUT", "/put", json_data) response = conn.getresponse() print(response.status, response.reason)

Посмотрим на результат этой программы:

Запрос по протоколу HTTP

Заключение

В этом уроке мы изучили простые операции HTTP, которые можно выполнить с помощью http.client. Мы также можем создать http-сервер на Python, используя модуль SimpleHTTPServer.

Источник

Python HTTP Client Request — GET, POST

Python HTTP Client Request - GET, POST

While we believe that this content benefits our community, we have not yet thoroughly reviewed it. If you have any suggestions for improvements, please let us know by clicking the “report an issue“ button at the bottom of the tutorial.

Python HTTP module defines the classes which provide the client-side of the HTTP and HTTPS protocols. In most of the programs, the HTTP module is not directly used and is clubbed with the urllib module to handle URL connections and interaction with HTTP requests. Today we will learn how to use a Python HTTP client to fire HTTP request and then parse response status and get response body data.

Python HTTP Client

In this post on python HTTP module, we will try attempting making connections and making HTTP requests like GET, POST and PUT. Let’s get started.

Making HTTP Connections

We will start with the simplest thing HTTP module can do. We can easily make HTTP connections using this module. Here is a sample program:

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

python http connection

Let’s see the output for this program: In this script, we connected to the URL on Port 80 with a specific timeout.

Python HTTP GET

Now, we will use HTTP client to get a response and a status from a URL. Let’s look at a code snippet:

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

In above script, we used a URL and checked the status with the connection object. Let’s see the output for this program: Remember to close a connection once you’re done with the connection object. Also, notice that we used a HTTPSConnection to establish the connection as the website is served over HTTPS protocol.

Getting SSL: CERTIFICATE_VERIFY_FAILED Error?

$ python3.6 http_client.py Traceback (most recent call last): File "http_client.py", line 4, in 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) $ 

From the output, it was clear that it has to do something with the SSL certificates. But website certificate is fine, so it has to be something with my setup. After some googling, I found that on MacOS, we need to run Install Certificates.command file present in the Python installation directory to fix this issue. Below image shows the output produced by this command execution, it looks like it’s installing latest certificates to be used when making SSL connections. python ssl CERTIFICATE_VERIFY_FAILED fixNote that I got this error on Mac OS. However, on my Ubuntu system, it worked perfectly fine. Python HTTP Client Ubuntu

Getting the Header list from Response

From the response we receive, the headers usually also contain important information about the type of data sent back from the server and the response status as well. We can get a list of headers from the response object itself. Let’s look at a code snippet which is a little-modified version of the last program:

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

python http request headers

Let’s see the output for this program:

Python HTTP POST

We can POST data to a URL as well with the HTTP module and get a response back. Here is a sample program:

import http.client import json conn = http.client.HTTPSConnection('www.httpbin.org') headers = foo = json_data = json.dumps(foo) conn.request('POST', '/post', json_data, headers) response = conn.getresponse() print(response.read().decode()) 

python http post

Let’s see the output for this program: Feel free to use the HTTP Bin library to try more requests.

Python HTTP PUT Request

Of course, we can also perform a PUT request using the HTTP module itself. We will use the last program itself. Let’s look at a code snippet:

import http.client import json conn = http.client.HTTPSConnection('www.httpbin.org') headers = foo = json_data = json.dumps(foo) conn.request("PUT", "/put", json_data) response = conn.getresponse() print(response.status, response.reason) 

python http request, python http put example

Let’s see the output for this program:

Conclusion

In this lesson, we studied simple HTTP operations which can be done using http.client . We can also create python http server using SimpleHTTPServer module. Reference: API Doc

Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases. Learn more about us

Источник

Оцените статью