Archive

Posts Tagged ‘request’

something more about HTTP requests and erlang

September 7, 2009 1 comment

Un paio di posts fa vi ho introdotto le API di Twitter e vi ho mostrato come ottenere la timeline di un utente. In tale post ho  utilizzato il modulo gen_tcp fornito da erlang, e utilizzato tale modulo per spedire le mie requests al web server di twitter.

In questo post cercherò di utilizzare il modulo http, che mette a disposizione il metodo request, questo modulo ci dovrebbe risparmiare un sacco di codice!

La prima cosa da fare quando si lavora con il modulo http  consiste nell’avviare l’applicazione inets, tale applicazione mette a disposizione tra le varie cose delle funzioni utili nella scrittura di client e server web.

Iniziamo quindi richiamando la nostra applicazione inets ed eseguiamo una richiesta tramite la funzione request/1 del modulo http. Tale richiesta ci permetterà ti recuperare gli ultimi posts provenienti dalla timeline pubblica. Essendo appunto tale timeline pubblica, non abbiamo bisogno di alcuna autenticazione.

Erlang (BEAM) emulator version 5.6.5  [async-threads:0]
[kernel-poll:false]

Eshell V5.6.5  (abort with ^G)
1> application:start(inets).
ok
2> http:request("http://twitter.com/statuses/public_timeline.xml").

Come specificato nel post precedente, nell’indirizzo utilizzato per la richiesta, possiamo specificare una diversa estensione tra quelle consentite, a seconda dei nostri gusti o bisogni.

Quale funzione dobbiamo utilizzare invece se vogliamo richiedere una timeline associata ad uno specifico utente? Beh in questo caso la procedura da seguire è la seguente:

Erlang (BEAM) emulator version 5.6.5  [async-threads:0]
[kernel-poll:false]

Eshell V5.6.5  (abort with ^G)
1> application:start(inets).
ok
2> Aut = lists:flatten(["Basic ", base64:encode("user:password")]).
[66,97,115,105,99,32,<<"dXNlcjpwYXNzd29yZA==">>]
3> http:request(get,
                {"http://twitter.com/statuses/user_timeline.xml",
                    [{"Authorization", Aut}]
                }, [], []).

Come vedete la funzione request/4 all’interno del modulo http ci permette di risparmiare un sacco di codice!

Tale funzione prende 4 parametri: il primo indica metodo che si vuole effettuare (nel nostro caso get, ma avrebbe potuto essere anche uno qualsiasi tra head, get, put, post, trace, options, delete come vedremo tra poco). il secondo parametro è una tupla rappresentante la richiesta vera e propria al web server. Tale richiesta è composta da una stringa che identifica la risorsa che vogliamo ottenere/modificare e da una lista di headers. Vi consiglio di andare alla pagina http://erlang.org/doc/man/http.html per avere maggiori informazioni.  🙂

Per autenticarci al server inseriamo un nuovo header di tipo Authentication e gli assegniamo il valore ottenuto dall’operazione di unione tra la stringa “Basic ” (ricordatevi di lasciare una spazio prima delle virgolette finali) e il risultato ottenuto dall’encoding delle nostre credentials.

Se avete fatto tutto come si deve, dovreste ottenere la timeline del utente che avete utilizzato per l’autenticazione, altrimenti riceverete un messaggio di errore dal server (come è capitato a me che avevo lasciato user:password 🙂 )

Gli ultimi due valori dati in ingresso alla funzione request/4 sono due liste vuote; la prima identifica le HTT Options (ad esempio un timeout per la richiesta o la versione dell’HTTP) mentre la seconda lista identifica altre options che vi invito a controllare nel link sopra riportato.

Ora vediamo qualcosa di diverso: proviamo ad aggiornare lo status di un utente!

La documentazione sulle API di Twitter dice che per aggiornare lo status di un utente, bisogna utilizzare nella richista il metodo POST e la URL http://twitter.com/statuses/update.format dove format può essere scelto fra xml e json.  A tale URL possono essere aggiunti altri parametri, il cui unico obbligatorio è status, che rappresenta l’effettivo status che vogliamo postare.

Se ad esempio volessimo modificare il nostro status in “erlang rules” dovremmo utilizzare il seguente codice:

Erlang (BEAM) emulator version 5.6.5  [async-threads:0]
[kernel-poll:false]

Eshell V5.6.5  (abort with ^G)
1> application:start(inets).
ok
2> Aut = lists:flatten(["Basic ", base64:encode("user:password")]).
[66,97,115,105,99,32,<<"dXNlcjpwYXNzd29yZA==">>]
3> http:request(post,{"http://twitter.com/statuses/update.xml",
       [{"Authorization", Aut}],
        "application/x-www-form-urlencoded",
         "status=erlang rules"}, [], []).

Come vedete alcune cose sono rimaste uguali e altre sono cambiate: rimane l’autorizzazione, e le liste vuote alla fine. Cambia il tipo di richiesta (si passa ad un post). E’ stata aggiunta una nuova stringa che specifica che si tratta di codice che va codificato come URL. Cosa più importante è stato aggiunto un body: in questo caso il parametro status che viene fatto coincidere con il la stringa erlang rules.

Molto semplice direi…la cosa che mi piace di questo modulo è che la nostra stringa viene codificata in URL senza grandi sforzi da parte nostra…infatti se volessimo fare lo stesso tipo di operazione tramite un gen_tcp send, dovremmo codificare da soli la nostra stringa in URL, ad esempio sostituendo ogni spazio con un %20.

Ultima cosa importante per chi vuole sperimentare: ricordatevi che la lunghezza del messaggio può essere al massimo 140 caratteri!

Categories: Erlang Tags: , ,