//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/")); }