Languages

Soup - sample using parameters

No votes yet
//compile with: valac --thread --pkg libsoup-2.4 main.vala -o soup_post
using Soup;
class rpc_request
{
	private static rpc_request request_instance;
	private HashTable<string,string> args;
	private rpc_request()
	{
		args=new HashTable<string,string>(str_hash,str_equal);
	}
	public static rpc_request get_instance()
	{
		if(null==request_instance)
		{
			request_instance=new rpc_request();
		}
		return request_instance;
	}
	public void add_parameter(string name,string val)
	{
		args.insert(name,val);
	}
	private string prepare()
	{
		Soup.URI myuri=new Soup.URI("http://localhost");
		myuri.set_query_from_form(args); //Use soup to handle encoding
		string ret=myuri.query;
		myuri=null;
		return ret;
	}
	public string send(string method,string uri)
	{
		if (!Thread.supported()) {
		    stderr.printf("Cannot run without threads.\n");
		    return "";
		}
		string formdata=prepare();
		var session = new Soup.SessionAsync ();
		var message = new Soup.Message (method,uri);
		message.set_request("application/x-www-form-urlencoded",MemoryUse.COPY,formdata,formdata.size());
		session.send_message (message);
		message.response_headers.foreach ((name, val) => {
		        stdout.printf ("Name: %s -> Value: %s\n", name, val);
		    });
		stdout.printf("Msg length: %ld\n%s\n", (long)message.response_body.length, message.response_body.data);
		string response=message.response_body.data;
		message=null;
		session=null;
		return response;
	}
}
static void main(string[] args)
{
	rpc_request rpc=rpc_request.get_instance();
	rpc.add_parameter("name","test");
	rpc.add_parameter("val","My value");
	rpc.add_parameter("test","test value");
	print("response: %s\n",rpc.send("POST","http://localhost/"));
}