Writing RESTful JSON services with WCF is fun; in fact I do it for a living. One thing that every developer finds useful is a small program for testing calls, trying new ideas etc so here is my C# test harness for handling POST requests.
private static void PostThis() { const string baseUrl = "http://127.0.0.1"; const string port = ":81/"; const string serviceEndpoint = "Rest.svc/"; const string serviceAction = "Client/[email protected]/"; //Create URL to POST request data too. string url = baseUrl + port + serviceEndpoint + serviceAction; Console.WriteLine("Making POST request to: " + url); Uri address = new Uri(url); //Create webRequest HttpWebRequest request = WebRequest.Create(address) as HttpWebRequest; //the Method property of the request to POST request.Method = "POST"; //Set the ContentType to json //our service is expecting WebMessageFormat.Json request.ContentType = "application/json; charset=utf-8"; //define the parameters string data = "{\"password\":\"S3cretP@ssw0rd\"}"; //Create a byte array from your parameters byte[] byteData = UTF8Encoding.UTF8.GetBytes(data); //Set the content length in the request headers //this may require back end service alterations request.ContentLength = byteData.Length; //Make the request by streaming the data using (Stream dataStream = request.GetRequestStream()) { dataStream.Write(byteData, 0, byteData.Length); dataStream.Close(); } try { //Receive the response HttpWebResponse response = request.GetResponse() as HttpWebResponse; //Get the response stream if (response != null) { StreamReader reader = new StreamReader(response.GetResponseStream()); //Write output to the console Console.WriteLine(); Console.WriteLine("Response: "); Console.WriteLine(reader.ReadToEnd()); //Final cleanup reader.Close(); response.Close(); } } catch (Exception ex) { //Display exceptions Console.WriteLine(ex.ToString()); } Console.WriteLine("Press enter to quit"); Console.ReadLine(); }
Many examples exist on the web for making POST webRequests but most of them specify the incorrect ContentType for JSON WCF services, usually you will find this:
request.ContentType = “application/x-www-form-urlencoded”;
Instead for JSON services you need to use:
request.ContentType = “application/json; charset=utf-8”;
If you use the incorrect ContentType you will get the following http 400 error
“The remote server returned an error: (400) Bad Request”
Simply change the service endpoints constants at the top of the code to your details and test away. I like to run the code in a simple console application. I may do a separate post on the WCF service configuration if I get time.
Also, if you’re looking for a nifty tool to test JSON response data look no further than these guys http://jsonformatter.curiousconcept.com/
but how to use the ContentType whith “application/x-www-form-urlencoded”, and the post data will be
password=S3cretP@ssw0rd
Thanks:)
Hi,
There are loads of examples of using the form-urlencode method for WCF services out there on the web, I specifically wrote this blog post to highlight what is needed when dealing with JSON services and WCF.
Maybe have a look this StackOverflow questions and its links
http://stackoverflow.com/questions/604463/best-way-to-support-application-x-www-form-urlencoded-post-data-with-wcf