Barra laterale

programmazione:libsoup:introduzione

Introduzione a libsoup

Autore: Fabio Di Matteo
Ultima revisione: 27/10/2011

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

<?php echo @$REMOTE_ADDR;  ?>

Il codice

#include <libsoup/soup.h>
 
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", "https://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 **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 <libsoup/soup.h>
 
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 ;
}

programmazione/libsoup/introduzione.txt · Ultima modifica: 18/04/2018 - 15:49 (modifica esterna)