Introduzione all'HTTP con JAVA


1. Introduzione all'esercitazione

Nelle precedenti esercitazioni abbiamo visto come eseguire invocazioni HTTP utilizzando cURL. In alcune di queste interrogazioni abbiamo utilizzato richieste in formato XML, quindi abbiamo visto in dettaglio la sintassi di questo formato e come descriverlo utilizzando lo Schema XML. Abbiamo quindi portato questi concetti in ambiente Java e visto come costruire e validare messaggi XML.

Continuiamo replicando le richieste HTTP, eseguite nella prima esercitazione con cURL, utilizzando applicazioni Java.

Ebay Developer Account. Nel corso dell'esercitazione utilizzeremo le API di eBay che richiedono una utenza sviluppatore registrata. Se abbiamo già eseguito la registrazione per le esercitazioni precedenti, accedere al proprio account per recuperare la AppID dell'ambiente Sandbox da utilizzare negli esercizi. Se non siamo ancora registrati, accedere al portale di registrazione sviluppatori per creare una nuova utenza ed ottenere le credenziali applicative.

Librerie LAI. Sono fornite alcune classi di utilità che semplificano l'implementazione delle applicazioni richieste nelle esercitazioni. Per utilizzarle, scaricare le librerie Lai e aggiungerle al progetto eclipse (project > properties > Java build path > Add external jar...). La relativa documentazione è disponibile qui.

2. Esercizio: HTTP GET con JAVA

Implementare un'applicazione JAVA che esegua una richiesta HTTP GET allo ShoppingService di eBay per una GetCategoryInfo e stampi la risposta, comprensiva di header HTTP.

La libreria per implementare le applicazioni di rete in java è java.net.

Step 1. Costruire la query string e verificarla con cURL.? La connessione al servizio deve contenere nella query string tutti i parametri richiesti dall'operazione. Costruire quindi la URL di connessione al servizio http://open.api.sandbox.ebay.com/shopping che presenti:

  • appid= la AppID per l'ambiente Sandbox (si recupera dal proprio account sviluppatore)

  • callname= il nome dell'operazione richiesta (GetCategoryInfo)

  • version= la versione del servizio richiesto (867)

  • CategoryID= l'id categoria (-1)

  • IncludeSelector= se valorizzato a ChildCategories, nella risposta sono elencate le categorie figlie

Una volta costruita la URL, verificarla utilizzando il comando cURL come visto nell'esercitazione HTTP.

Step 2. Creare una connessione.Utilizzare la classe URL per creare una nuova connessione

[Suggerimento] Suggerimento

Dal momento la URL delle Web API ha protocollo http, la connessione che verrà creata è di tipo HttpURLConnection. Eseguendo un cast della connessione ottenuta, si dispone dei metodi specifici per questo protocollo.

Step 3. Leggere la risposta. Stampare a video:

  • lo stato HTTP e la reason phrase (getResponseCode e getResponseMessage)

  • l'header HTTP Content-Type (getHeaderField)

  • il messaggio di risposta (getInputStream o, in caso di errore, getErrorStream )

[Suggerimento] Suggerimento

Per leggere un InputStream e convertirlo in testo, è possibile utilizzare il metodo StreamUtils.toString(InputStream is) contenuto nelle librerie Lai

Soluzione

3. Esercizio: HTTP POST in Java

Creare un programma che esegua la stessa richiesta fatta nell'esercizio precedente, ma tramite una richiesta XML inviata tramite POST e stampare a video il risultato.

[Suggerimento] Suggerimento

Abbiamo già eseguito questa richiesta nello STEP 1 dell'esercitazione HTTP utilizzando cURL.

Step 1. Creare una connessione.Creare la connessione al servizio http://open.api.sandbox.ebay.com/shopping senza indicare parametri nella query string che saranno specificati con gli header HTTP.

Step 2. Configurare la connessione. Utilizzando i metodi della classe HttpURLConnection configurare la connessione in modo che:

  • il metodo utilizzato sia POST (setMethod)

  • vengano settati gli Header HTTP richiesti dal servizio e l'header Content-type (addRequestProperty)

  • venga abilitato il traffico in uscita (setDoOutput)

[Suggerimento] Suggerimento

I parametri richiesti dal servizio tramite query string o http header sono gli stessi, ma cambia il nome da utilizzare:

  • X-EBAY-API-APP-ID = la Application ID per l'ambiente Sandbox

  • X-EBAY-API-CALL-NAME = il nome dell'operazione richiesta

  • X-EBAY-API-VERSION = la versione del servizio richiesto (867)

  • X-EBAY-API-REQUEST-ENCODING = il tipo di richiesta (XML)

Step 3. Spedire la richiesta. Inviare la richiesta XML serializzandola nello steam di uscita della connessione (getOutputStream()).

[Suggerimento] Suggerimento

Il codice che costruisce il DOM della richiesta e lo serializza è già stato scritto per risolvere l'esercizio XML con DOM

Step 4. Validare e leggere la risposta. Utilizzare lo XML Schema dello ShoppingService di eBay per eseguire il parsing e validazione della risposta e ottenerne un DOM. La risposta contiene le informazioni sulla categoria ROOT e sulle categorie figlie. Navigare il DOM per recuperare e stampare identificativo e nome delle sole categorie figlie.

[Suggerimento] Suggerimento

Il codice che esegue la validazione e parsing di uno stream di dati è già stato scritto per risolvere l'esercizio Validazione XML con Java

Soluzione

4. Esercizio: Crawler di categorie

Estendere il programma precedente di modo che stampi a video l'albero delle categorie di eBay iterando le richieste HTTP (di seguito un piccolo estratto):

-- (-1) Root
| |-- (20081) Antiques
| | |-- (37903) Antiquities
| | |-- (4707) Architectural & Garden
| | |-- (100927) Periods & Styles
| | |-- (1217) Primitives
| | |-- (22608) Reproduction Antiques
| | |-- (12) Other
| |-- (550) Art
| | |-- (60435) Direct from the Artist
| | |-- (158658) Art from Dealers & Resellers
| | |-- (52524) Wholesale Lots
| |-- (2984) Baby
| | |-- (100223) Baby Gear
| | |-- (20433) Baby Safety & Health
| | |-- (20394) Bathing & Grooming
| | |-- (66692) Car Safety Seats
| | |-- (45455) Diapering
| | |-- (20400) Feeding
[Importante] Importante

Visto che le categorie sono centinaia di migliaia, limitare la costruzione dell'albero ai primi due livelli (CategoryLevel 0 e 1). Inoltre, per non rischiare di sembrare un attacco DOS, inserire una Thread.sleep(500) prima di ogni connessione HTTP in modo di rallentare le richieste

Soluzione

Footer BGFooter BG
Tito Flagella - © 2007-2015