- curl pro Windows: http://curl.haxx.se/dlwiz/?type=bin
- 10. cvičení z předchozího kurzu 4IZ268 - Formuláře
- 11. cvičení z předchozího kurzu 4IZ268 - Ajax
- 12. cvičení z předchozího kurzu 4IZ268 - API
- 11. cvičení z tohoto kurzu - XML, JSON
- http://api.jquery.com/jquery.ajax/
- What is REST - http://www.restapitutorial.com/lessons/whatisrest.html#
- Representational State Transfer(REST) - http://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm
CRUD = Create, Read, Update, Delete = programový přístup/idiom pro práci s daty. Často ve vztahu k nějakému objektu, který jde Vytvořit, Číst, Aktualizovat a Mazat.
REST = REpresentational State Transfer = architektonický přístup, který umožňuje pracovat se stránkami a měnit jejich stav. URI stránky je typicky namapováno na nějaký objekt a pomocí HTTP metod (GET, POST, PUT, DELETE) měníme stav tohoto objektu. REST není protokol, jen způsob komunikace. REST se často používá pod HTTP protokolem.
Jako formát dat se obvykle používá XML nebo JSON.
Příklad:
- GET https://hradil.vse.cz/api/clients/1.json - zobrazí detail pro klienta s ID 1.
- GET https://hradil.vse.cz/api/clients.json - zobrazí výpis všech klientů
- POST https://hradil.vse.cz/api/clients.json - založí nového klienta, v těle HTTP metody jsou data (jméno: Adam, příjmení: Shelby)
- PUT https://hradil.vse.cz/api/clients/1.json - aktualizuje klienta s ID 1, v těle HTTP metody jsou nová data (jméno: Adam, příjmení: Shelby)
- DELETE https://hradil.vse.cz/api/clients/1.json - smaže klienta Adama
Typické a přímočaré propojení s CRUD:
- POST = Create
- GET = Read
- PUT = Update
- DELETE = Delete
- Jaké HTTP metody můžeme používat v HTML?
- Jak byste vyřešili odeslání nějakých dat přes HTTP metodu, kterou HTML nepodporuje (např. jak poslat HTTP PUT pro update záznamu pomocí HTML formuláře)? Zajímá mě řešení na serveru (jako autoři API) a řešení na klientovi (HTML).
- API = Application Program Interface = aplikační programové rozhraní = popis, jak pracovat s cizím programem tak, jak to jeho autor dovolil. Umožňuje napojit se na nějakou aplikaci typicky zvenčí a propojit ji s naší aplikací nebo ji na dálku ovládat. V případě webu je API typicky třeba, abychom dokázali využívat nějaké služby, které jsme sami nenapsali, ale chceme je mít v naší aplikaci, např. použít mapy od Google pro plánovaní trasy v naší aplikaci, posílat automaticky příspěvky na Twitter, komentáře uživatelů v naší aplikaci ukládat rovnou na zeď ve Facebooku, ověřit uživatele pomocí jiné služby, apod.
- API píše autor původního programu.
- API jako jedno z mála potřebuje dobrou a podrobnou (programátorskou) dokumentaci.
- API není pro koncové uživatele, ale pro programátory.
- API je dálkový ovladač k cizímu programu.
- API "voláme" pomocí nějaké služby, dnes typicky přes REST skrze HTTP request.
Opakování z kurzu 4IZ268: https://github.com/4iz268/cviceni/tree/master/12-api
Pokud budete psát vlastní API, je třeba ho dobře zdokumentovat. Následuje příklad dokumentace k existujícímu API včetně ukázek.
https://hradil.vse.cz/api/clients
Aplikace má i HTML rozhraní, ve kterém lze provádět všechny popsané akce.
Aplikace nemá autentizaci ani autorizaci. Všichni mají přístup ke všemu a data lze sdílet mezi sebou.
Pro filtrování dat lze použít parametr xname.
curl -H "Content-Type: application/json" -X GET https://hradil.vse.cz/api/clients.json?xname=xhraj18
curl -H "Content-Type: application/json" -X GET https://hradil.vse.cz/api/clients/1.json
curl -H "Content-Type: application/json" -X POST -d '{"first_name":"Jimmy","last_name":"Hendrix", "street":"Heaven Gate 1","town":"LA","xname":"xhraj18","zip":"10000"}' https://hradil.vse.cz/api/clients.json
curl -H "Content-Type: application/json" -X PUT -d '{"first_name":"Jimmy","last_name":"Page", "street":"3651 Lindell Rd. Suite D1024","town":"Las Vegas","xname":"xhraj18","zip":"89103"}' https://hradil.vse.cz/api/clients/1.json
curl -H "Content-Type: application/json" -X DELETE https://hradil.vse.cz/api/clients/1.json
- id - String, generuje se automaticky při uložení
- xname - String, nepovinné, identifikace studenta
- first_name - String, nepovinné, jméno klienta
- last_name - String, nepovinné, příjmení klienta
- street - String, nepovinné, ulice klienta
- zip - String, nepovinné, PSČ klienta
- town - String, nepovinné, město klienta
Pro filtrování záznamů pro konkrétního uživatele (studenta) lze použít parametr xname.
V příkladu jsme jako xname použili xhraj18, student použije svoje vlastní.
curl -H "Content-Type: application/json" -X GET https://hradil.vse.cz/api/clients.json?xname=xhraj18
Vrací pole:
[{"first_name":"Jimmy","id":1,"last_name":"Hendrix","street":"Heaven Gate 1","town":"LA","xname":"xhraj18","zip":"10000"}]
Vyžaduje id klienta.
curl -H "Content-Type: application/json" -X GET https://hradil.vse.cz/api/clients/1.json
Vrací 1 záznam:
{"first_name":"Jimmy","id":1,"last_name":"Hendrix","street":"Heaven Gate 1","town":"LA","xname":"xhraj18","zip":"10000"}
Id klienta se generuje automaticky při uložení, neposíláme.
Jako xname použije student svoje xname, v příkladu používáme xhraj18.
curl -H "Content-Type: application/json" -X POST -d '{"first_name":"Jimmy","last_name":"Hendrix", "street":"Heaven Gate 1","town":"LA","xname":"xhraj18","zip":"10000"}' https://hradil.vse.cz/api/clients.json
Vrací 1 záznam včetně právě vygenerovaného id:
{"first_name":"Jimmy","id":1,"last_name":"Hendrix","street":"Heaven Gate 1","town":"LA","xname":"xhraj18","zip":"10000"}
Vyžaduje id klienta.
curl -H "Content-Type: application/json" -X PUT -d '{"first_name":"Jimmy","last_name":"Page", "street":"3651 Lindell Rd. Suite D1024","town":"Las Vegas","xname":"xhraj18","zip":"89103"}' https://hradil.vse.cz/api/clients/1.json
Nevrací nic.
Vyžaduje id klienta.
curl -H "Content-Type: application/json" -X DELETE https://hradil.vse.cz/api/clients/1.json
Nevrací nic.
Server musí do response přidávat hlavičku:
Access-Control-Allow-Origin: *
Jinak browser vyhodí bezpečnostní chybu:
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at https://hradil.vse.cz/api/clients.json?xname=xhraj18. (Reason: CORS header 'Access-Control-Allow-Origin' missing).
V Apache se hlavička přidá do souboru .htaccess, v Nginx pod location v souboru nginx.conf, např.
location ~ ^/api(/.*|$) {
alias /home/xhraj18/api/current/public$1; # <-- be sure to point to 'public'!
passenger_base_uri /api;
passenger_app_root /home/xhraj18/api/current/;
passenger_document_root /home/xhraj18/api/current/public;
passenger_enabled on;
add_header 'Access-Control-Allow-Origin' '*';
}
Ukázka správné a kompletní hlavičky:
curl -I -k -H "Content-Type: application/json" -X GET https://hradil.vse.cz/api/clients.json?xname=xhraj18
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Status: 200 OK
X-UA-Compatible: IE=Edge,chrome=1
ETag: "971100cf91d23a3fa9771f89ccc1a716"
Cache-Control: max-age=0, private, must-revalidate
X-Request-Id: 0131a2bb6730b9b5c472fed270334d19
X-Runtime: 0.157872
Date: Thu, 17 Dec 2015 16:07:05 GMT
X-Rack-Cache: miss
X-Powered-By: Phusion Passenger 4.0.57
Server: nginx/1.6.2 + Phusion Passenger 4.0.57
Access-Control-Allow-Origin: *
Vstupní podmínkou k této části jsou znalosti:
- AJAX funkcí pomocí jQuery, viz 11. cvičení z předchozího kurzu 4IZ268 - Ajax
- JSON, viz 11. cvičení - JSON, XML
Všimněte si, že pro klienta nepotřebujeme PHP, vše děláme jen v HTML a jQuery.
Výchozí zdroják k serverové části
Request & response: http://eso.vse.cz/~xhraj18/12-server.php
Hlavička:
curl -I http://eso.vse.cz/~xhraj18/12-server.php
HTTP/1.1 200 OK
Date: Mon, 09 May 2016 20:32:08 GMT
Server: Apache/2.4.16 (Fedora) OpenSSL/1.0.1k-fips mod_nss/2.4.10 NSS/3.17.1 Basic ECC PHP/5.6.15 mod_perl/2.0.9 Perl/v5.18.4
X-Powered-By: PHP/5.6.15
Content-Type: application/json;charset=utf-8
Tělo:
curl -I http://eso.vse.cz/~xhraj18/12-server.php
[{"id":1,"first_name":"Jimmy","last_name":"Hendrix","address":"All Along the Watchtower 1, Los Angeles, CA"},{"id":2,"first_name":"John","last_name":"Frusciante","address":"Californication & Hump de Bumb Street 33, Venice Beach, CA"}]
2. Upravte server API 12-server.php tak, aby přijímalo tyto requesty:
- GET: Data se budou načítat z DB (dle formátu statických dat v příkladu vytvořte vhodnou DB strukturu).
- POST: Bude možno přidat nový záznam pomocí HTTP POST (data odeslaná z formuláře z klientské části, kterou si sami dopíšete, viz. bod 3.)
Do toho :).
- Napište pomocí HTML a jQuery klienta pro jakékoli další volně dostupné API (Google Maps, Seznam Mapy, Twitter, Facebook, Pinterest, Instagram... nebo i jakékoli jiné).