Web klijenti

Web klijent je program koji služi kao intefejs za povezivanje i razmenu podataka sa serverom. Klijent serveru šalje zahteve, koje server obrađuje i klijentu vraća rezultate obrade. Najčešće korišćeni klijenti su brauzeri kao što su Chrome, Firefox, Opera itd.

Brauzeri se koriste kao interfejs i za web aplikacije kojima ćemo se mi baviti. Posebni klijent programi se razvijaju u slučajevima kada server treba da obezbedi podatke koje klijent koristi za dalju obradu.

Jednostavan Python socket (http) klijent

Klijent:

import socket

# Kreiraj uticnicu
uticnica = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

# Povezi se na server
#uticnica.connect(("216.58.208.142",80)) # Google
uticnica.connect(("localhost",8888))
# Pošalji zahtev
uticnica.send(str.encode("GET / HTTP/1.1\n\n"))

# Prihvati odgovor
while True:
            resp = uticnica.recv(2048).decode("utf-8")
            if resp == "": break
            print (resp)

# Zatvori uticnicu
uticnica.close()
print ("\nGotovo")

Detaljan opis socket programiranja možete da nađete ovde: Python socket

Složeniji Python http klijent

U Python standardnoj biblioteci se nalazi još jedan modul pomoću kojeg se mogu programirati klijenstki programi. Taj modul, http.client, korsitimo u sledećem primeru:

import http.client

## GET request
konekcija = http.client.HTTPSConnection("www.python.org")
konekcija.request("GET", "/")
odgovor = konekcija.getresponse()
print(odgovor.status, odgovor.reason)
podaci = odgovor.read()  # This will return entire content.
print (podaci)
konekcija.close()

## POST request
import urllib.parse
params = urllib.parse.urlencode({'@number': 12524, '@type': 'issue',
                                 '@action': 'show'})
headers = {"Content-type": "application/x-www-form-urlencoded",
            "Accept": "text/plain"}
konekcija = http.client.HTTPConnection("bugs.python.org")
konekcija.request("POST", "", params, headers)
odgovor = konekcija.getresponse()
print(odgovor.status, odgovor.reason)
podaci = odgovor.read()
print (podaci)
konekcija.close()

O ovom modulu možete više da saznate ovde: Python HTTP client

Ako vam ova dva načina izgledaju previše komplikovano, pokušajte sa modulom “requests”, koji njie deo standardne Python biblioteke. Opisa ovog modula možete da nađete ovde: Requests: HTTP for Humans

Klijentski program, kao ovaj prikazan gore, mogu se modifikovati da pristupaju raznim api servisima, da od njih preuzimaju podatke za dalju obradu. Jednu listu besplatnih web servisa možete da nađete na ovde: Largest API Directory.

Mi ćemo sada, za vežbu, preuzeti podatke sa dva takva servisa.

Geonames je geografska baza podataka u kojoj ima 10 miliona geografskih toponima.

Program koji sledi pokazuje kako se iz geonames baze mogu dobiti željeni podaci:

## using http.client
import http.client, json
konekcija = http.client.HTTPConnection("api.geonames.org",80)
konekcija.request("GET", "/searchJSON?name=medun&username=milan.popovic")
odgovor = konekcija.getresponse()
print(odgovor.status, odgovor.reason)
podaci = odgovor.read().decode()  # This will return entire content.
print (json.loads(podaci))
konekcija.close()

## using requests
import requests
import urllib.parse
par = urllib.parse.urlencode({'name': 'medun', 'username': 'milan.popovic'})
r = requests.get('http://api.geonames.org/searchJSON', params=par)
#print(r.text)
print(r.json())

Sunrise Sunset daje podatke o izlasku i zalasku sunca za bilo koju lokaciju na zemlji i za bilo koji datum.

Sledeći program pokazuje kako se može pristupiti sunrise-sunset api-ju:

## using requests
import requests
import urllib.parse
par = urllib.parse.urlencode({'lat': 44.818611, 'lng': 20.468056, 'date':'2018-02-17'})
r = requests.get('https://api.sunrise-sunset.org/json', params=par)
#print(r.text)
print(r.json())

Kombinovanjem prethodna dva servisa moguće je dobiti geografske podatke i podatke o izlasku i zalasku sunca za svako naseljeno mesto na planeti,

Domaći zadatak

  1. Napisati program koji traži od korisnika da unese naziv mesta i naziv zemlje, pa štampa geografske podatke o tom mestu i vreme izlaska i zalaska sunca na današnji dan (dan kada se program izvršava).
  2. Napisati program pod 1. u GUI varijanti (Tkinter).
  3. Na sajtu Market nalaze se linkovi na razne api-e. Pronađite neki interesantan api, pa napišite Python program kojim se koristi taj api.