Python - żądania HTTP

Protokół HTTP lub Hyper Text Transfer Protocol działa w modelu klient-serwer. Zwykle przeglądarka internetowa jest klientem, a komputer obsługujący witrynę jest serwerem. W pythonie używamy modułu requestów do tworzenia żądań http. Jest to bardzo potężny moduł, który może obsługiwać wiele aspektów komunikacji http poza prostymi danymi dotyczącymi żądań i odpowiedzi. Może obsługiwać uwierzytelnianie, kompresję / dekompresję, podzielone żądania itp.

Klient HTTP wysyła żądanie HTTP do serwera w postaci komunikatu żądania, który zawiera następujący format:

  • Linia zapytań
  • Zero lub więcej pól nagłówka (General | Request | Entity), po których następuje CRLF
  • Pusty wiersz (tj. Wiersz bez niczego przed CRLF) wskazujący koniec pól nagłówka
  • Opcjonalnie treść wiadomości

W poniższych sekcjach wyjaśniono każdą z jednostek używanych w komunikacie żądania HTTP.

Linia zapytań

Wiersz żądania zaczyna się od tokenu metody, po którym następuje identyfikator URI żądania i wersja protokołu, a kończy się na CRLF. Elementy oddzielone są spacjami SP.

Request-Line = Method SP Request-URI SP HTTP-Version CRLF

Omówmy każdą z części wymienionych w Request-Line.

Metoda żądania

Prośba method wskazuje metodę, która ma zostać wykonana na zasobie określonym przez dane Request-URI. W metodzie rozróżniana jest wielkość liter i zawsze należy ją podawać wielkimi literami. W poniższej tabeli wymieniono wszystkie obsługiwane metody w protokole HTTP / 1.1.

SN Metoda i opis
1 GET

Metoda GET służy do pobierania informacji z danego serwera przy użyciu danego URI. Żądania korzystające z GET powinny tylko pobierać dane i nie powinny mieć żadnego innego wpływu na dane.

2 HEAD

To samo co GET, ale przenosi tylko wiersz stanu i sekcję nagłówka.

3 POST

Żądanie POST służy do wysyłania danych na serwer, na przykład informacji o kliencie, przesyłania plików itp. Za pomocą formularzy HTML.

4 PUT

Zastępuje wszystkie bieżące reprezentacje zasobu docelowego przesłaną treścią.

5 DELETE

Usuwa wszystkie bieżące reprezentacje zasobu docelowego podane przez identyfikator URI.

6 CONNECT

Ustanawia tunel do serwera identyfikowanego przez dany identyfikator URI.

7 OPTIONS

Opisz opcje komunikacji dla zasobu docelowego.

8 TRACE

Wykonuje test zwrotny pętli komunikatów wraz ze ścieżką do zasobu docelowego.

Identyfikator URI żądania

Identyfikator URI żądania jest jednolitym identyfikatorem zasobu i identyfikuje zasób, do którego należy zastosować żądanie. Poniżej przedstawiono najczęściej używane formularze do określenia identyfikatora URI:

Request-URI = "*" | absoluteURI | abs_path | authority
 
SN Metoda i opis
1 Gwiazdka *jest używany, gdy żądanie HTTP nie dotyczy określonego zasobu, ale samego serwera i jest dozwolone tylko wtedy, gdy zastosowana metoda niekoniecznie ma zastosowanie do zasobu. Na przykład:

OPTIONS * HTTP/1.1

2 Plik absoluteURIjest używany, gdy żądanie HTTP jest kierowane do serwera proxy. Proxy jest proszone o przekazanie żądania lub usługi z prawidłowej pamięci podręcznej i zwrócenie odpowiedzi. Na przykład:

GET http://www.w3.org/pub/WWW/TheProject.html HTTP/1.1

3 Najpopularniejszą formą identyfikatora URI żądania jest ta, która służy do identyfikowania zasobu na serwerze pochodzenia lub bramie. Na przykład klient, który chciałby pobrać zasób bezpośrednio z serwera pochodzenia, utworzyłby połączenie TCP z portem 80 hosta „www.w3.org” i wysłałby następujące wiersze:

GET /pub/WWW/TheProject.html HTTP/1.1

Host: www.w3.org

Zwróć uwagę, że ścieżka bezwzględna nie może być pusta; jeśli nie ma go w oryginalnym URI, MUSI być podany jako „/” (root serwera).

Korzystanie z żądań Pythona

Będziemy używać zapytań modułu do nauki o żądaniu http.

pip install requests

W poniższym przykładzie widzimy przypadek prostego żądania GET i wypisuje wynik odpowiedzi. Decydujemy się wydrukować tylko pierwsze 300 znaków.

# How to make http request
import requests as req
r = req.get('http://www.tutorialspoint.com/python/')
print(r.text)[0:300]

Po uruchomieniu powyższego programu otrzymujemy następujące dane wyjściowe -

<!DOCTYPE html>
<!--[if IE 8]><html class="ie ie8"> <![endif]-->
<!--[if IE 9]><html class="ie ie9"> <![endif]-->
<!--[if gt IE 9]><!-->	<html> <!--<![endif]-->
<head>
<!-- Basic -->
<meta charset="utf-8">
<title>Python Tutorial</title>
<meta name="description" content="Python Tutorial