HTTP (HyperText Transfer Protocol) , dünya çapında web protokolüdür. Web tarayıcınızla bir web sayfasını ziyaret ettiğinizde, tarayıcı İnternet'in herhangi bir yerindeki web sunucularınabir dizi  HTTP isteğinde bulunur. Bu sunucular HTTP yanıtları ile cevap verecektir. 

Python Requests library, HTTP isteklerini göndermek ve HTTP olarak alma işlemlerini kolaylaştırmaktadır. HTTP protokolünü ayrıntılı olarak anlamak zorunda kalmak yerine, Python nesnelerini kullanarak çok basit HTTP bağlantıları yapabilir ve ardından bu nesnelerin yöntemlerini kullanarak mesaj gönderip alabilirsiniz. Bir örneğe bakalım:

>>> import requests
>>> response = requests.get('https://www.pythoncircle.com')

Bu, bir web sayfası için temel bir istekti!  Belirli bir URL için HTTP GET isteği  yapmak için Requests kütüphanesini kullandık. URL, Requests kütüphanesine kaynağın adını söyler (https://www.pythoncircle.com). Elde ettiğimiz sonuç, request türünde bir nesnedir.

Response:

Yanıt metnini response.text  ile yazdırarak kontrol edebiliriz.

Şimdi  yapacağımız basit bir örnekle biraz daha pekiştirelim. Ve böylece Requests modülünün bizim için bir çok işi üstlendiğini görebiliriz. Web sunucusunu bulmak, ağ bağlantısı kurmak, HTTP mesajı oluşturmak, bir yanıt beklemek veya yanıtın kodunu çözmek için herhangi bir kod yazmamız gerekmiyor. 

>>> response = requests.get('https://www.google.com', stream=True)
>>> print(response.raw.read()[:100])
b'x1fx8bx08x00x00x00x00x00x02xffxc5Zxdbzx9bxc8x96xbexcfS`xf2xb5-xc6Xx02$txc28xe3vxdcxddxeexcexa9xb7xdd;xe9x9dxcexf6W@tx88x11`@>Dxd6x9bxcexe5<xc3xcdxc5xfcxab8x08xc9Nzx1f.&x8e1Uxb5jxd5:xfcxb5jUx15x87;^xe2x16xf7)x97x82bx1ex1dx1dxd2S'

Peki bu yukarıdaki kod ne alama geliyor neden böyle karmaşık diye sorabilirsiniz. Yanıt  gzip  ile  sıkıştırıldı , bu nedenle  biz HTML metnini okuyamadan önce sıkıştırmasının açılması gerekiyordu. Böyle istekler kütüphanesinin bizim için ele aldığı bir şey daha görmüş olduk.

Requests.Response  nesne de bizim için yaratılmış kesin isteği içeriyor. İstekler modülünün web sunucusuna içeriği sıkıştırmanın uygun olduğunu söylediğini görmek için nesnemizde depolanan başlıkları kontrol edebiliriz:

>>> response.request.headers['Accept-Encoding']
'gzip, deflate'

Yukarıdaki komuttan  sonra sunucu bize içeriğin gerçekten sıkıştırıldığını söyleyecektir. Yanıt başlığını kontrol edin.

>>> response.headers['Content-Encoding']
'gzip'

Response Kontrolü Yapmak

Yaptığımız bir talebin başarılı bir yanıt aldığını nasıl anlarız? Bunun için  Response.ok kullanacağız. 

>>> response.ok
True

True ve False sonuçlarını bize döndürecektir. Bunun yerine Response Durum Kodlarını da öğrenmek isteyebilirsiniz. 

>>> response.status_code
200

Gördüğünüz gibi 200 kodunu döndürecektir. 

Yanıtlarınızı daha fazla işlemeye çalışmadan önce başarılı olduklarından emin olmak için kontrol etmek için böyle bir şey yapabilirsiniz.

response = requests.get(url)
if not response.ok:
    raise Exception("GET failed with status code {}".format(response.status_code))
HTTP GET Method:

HTTP GET yöntemi , verilerini geri çağırır veya  alır  URL'de belirtilen kaynağı. Web sunucusuna bir GET isteği göndererek, sunucunun kaynağı sizin için almasını istersiniz. Web'e göz atarken, yaptığınız şeylerin çoğu, tarayıcınızın size göstereceği metin, resim, video vb. İçin bir dizi GET isteği göndermek için web tarayıcınızı kullanmaktır.

Bir GET isteğinin parametreleri olabilir  . Aşağıdaki URL örneğine bakalım.

https://example.com/path/to/api/cat_pictures?search=grey+kitten&max_results=15

Soru işareti, URL kaynağını kaynağın parametrelerinden ayırır. Bu parametreler, sorgu dizesi olarak biçimlendirilmiş bir veya daha fazla anahtar / değer çiftidir. Yukarıdaki örnekte,  arama  parametresi "gray + kitten" ve  max_results  parametresi 15 olarak ayarlanmıştır.

Bunun gibi bir URL oluşturmak için kendi kodunuzu yazmanıza gerek yok. Request.get () ile  bir parametreler sözlüğü sağlayabilirsiniz ve Requests modülü sizin için doğru URL'yi oluşturacaktır! Hemen nasıl olacağına bakalım. 

>>> p = {"search": "grey kitten",
...      "max_results": 15}
>>> response = requests.get("https://example.com/path/to/api", params=p)
>>> response.request.url
'https://example.com/path/to/api?search=grey+kitten&max_results=15'
HTTP POST Method:

Küçük bilgi parçalarını göndermek istediğimizde sorgu dizeleri kullanışlıdır, ancak verilerimiz daha karmaşık hale geldikçe, onu sorgu dizeleri kullanarak temsil etmek zorlaşabilir. 

Bu durumda bir alternatif,  HTTP POST yöntemini kullanmaktır . Bu yöntem bir web servisine veri veya bir mesaj gönderir, Bir web formunu doldurduğunuzda ve göndermek için bir düğmeye bastığınızda, bu verileri web sunucusuna geri göndermek için POST yöntemini kullanırsınız. Bu yöntem, iletilecek bir sürü veri olduğunda kullanılma eğilimindedir.

Komut dosyalarımızda bir POST isteği bir GET isteğine çok benzer.  Bir sorgu dizesine dönüştürülen ve URL'ye eklenen params özniteliğini ayarlamak yerine   , POST isteğinin bir parçası olarak gönderilecek verileri içeren data özniteliğini kullanırız.

>>> p = {"description": "white kitten",
...      "name": "Snowball",
...      "age_months": 6}
>>> response = requests.post("https://example.com/path/to/api", data=p)

Bu istek için oluşturulan URL'yi görelim:

>>> response.request.url
'https://example.com/path/to/api'

Dikkat ettiyseniz tüm parametreler burada URL kısmında oluşmadı. Burada veriler  HTTP mesajının gövdesinin bir parçasıdı durumundadır. Onları body  özelliğini kontrol ederek görebiliriz. 

>>> response.request.body
'description=white+kitten&name=Snowball&age_months=6'

Bir web servisine veri göndermemiz ve almamız gerekirse, verilerimizi sözlüğe dönüştürebilir ve ardından bunu  bir POST isteğinin veri özelliği olarak aktarabiliriz. Verileri özellikle JSON biçiminde göndermek ve almak yaygındır, bu nedenle Requests modülü, JSON  parametresini kullanarak dönüştürmeyi bizim için doğrudan yapabilir. 

>>> response = requests.post("https://example.com/path/to/api", json=p)
>>> response.request.url
'https://example.com/path/to/api'
>>> response.request.body
b'{"description": "white kitten", "name": "Snowball", "age_months": 6}' 

Python ile HTTP protokolünde GET ve POST gönderme ve geri bildirim alma olayları bu şekilde olmaktadır. Esenle kalın...