====== Introduzione a libsoup ======
Autore: **//Fabio Di Matteo//** \\ Ultima revisione: **//27/10/2011//** \\ \\
[[http://developer.gnome.org/libsoup/stable/index.html|Libsoup]] รจ una libreria client/server http ideale per interagire con server web preesistenti oppure per realizzare soluzioni client/server personalizzate. In questo articolo vedremo come prelevare del testo(il nostro indirizzo ip) restituito da una pagina web.
===== La nostra pagina web =====
La nostra pagina web che ci restituisce il nostro ip pubblico. \\ \\
**index.php**
===== Il codice =====
#include
int main(int argc, char* argv[])
{
//Inizializziamo i tipi di glib
g_type_init();
//Creiamo una nuova sessione
SoupSession* session = soup_session_async_new ();
//Creiamo il nostro messaggio per il server (che dopo la richiesta conterra' anche la risposta)
SoupMessage *msg;
msg = soup_message_new ("GET", "http://www.freemedialab.org/myip/index.php");
//Inviamo il messaggio al nostro server http e riceviamone la risposta
guint status;
status = soup_session_send_message (session, msg);
//Stampiamo lo stato della richiesta e il contenuto della risposta del server
printf("Stato richiesta->%d\n",status);
printf("reason_phrase->%s\n",msg->reason_phrase);
printf("ResponseBody->%s\n",msg->response_body->data);
return 0 ;
}
E' molto importatnte conoscere la struttura [[http://developer.gnome.org/libsoup/stable/SoupMessage.html|**SoupMessage**]] in quanto il risultato delle nostre richieste, compreso di esito viene salvato in essa.
typedef struct {
const char *method;
guint status_code;
char *reason_phrase;
SoupMessageBody *request_body;
SoupMessageHeaders *request_headers;
SoupMessageBody *response_body;
SoupMessageHeaders *response_headers;
} SoupMessage;
===== Il makefile =====
CPP = gcc
OPTS = `pkg-config --cflags --libs libsoup-2.4`
all:
$(CPP) test.c -o test $(OPTS)
clean:
rm test
===== Inviare dati di un form html con POST =====
Qualora volessimo inviare dei dati di un form via POST basta fare delle piccole modifiche al codice:
...
//Un messaggio soup contenente la pagina a cui inviare i dati
SoupMessage* msg = soup_message_new ("POST", "https://www.dominio.org/miapagina.php");
//Codifico ed invio i campi "name" ed "email" con il loro contenuto
char* formdata= soup_form_encode ("name","Fabio Di Matteo","email","myaddress@mail.com" );
//Specifico il tipo del messaggio nell'header del pacchetto
soup_message_set_request (msg, "application/x-www-form-urlencoded", SOUP_MEMORY_COPY, (const)formdata, strlen(formdata));
//Invio il messaggio soup
guint status;
status = soup_session_send_message (session, msg);
...
===== Un esempio concreto: scaricare i feed della nostra gmail =====
#include
int main(int argc, char* argv[])
{
//Inizializziamo i tipi di glib
g_type_init();
//Creiamo una nuova sessione
SoupSession* session = soup_session_async_new ();
SoupMessage* msg = soup_message_new ("GET", "https://myuser:mypassword@mail.google.com/mail/feed/atom");
//Invio la richiesta
guint status = soup_session_send_message (session, msg);
printf("Stato richiesta->%d\n",status);
printf("reason_phrase->%s\n",msg->reason_phrase);
printf("ResponseBody:\n\n%s\n",msg->response_body->data);
return 0 ;
}