Issuing HTTP GET Requests
The key classes here are HttpWebRequest and HttpWebResponse from System.Net.
The following method issues a request and returns the entire response as one long string:
static string HttpGet(string url) { HttpWebRequest req = WebRequest.Create(url) as HttpWebRequest; string result = null; using (HttpWebResponse resp = req.GetResponse() as HttpWebResponse) { StreamReader reader = new StreamReader(resp.GetResponseStream()); result = reader.ReadToEnd(); } return result; }
Remember that if the request URL includes parameters, they must be properly encoded (e.g., a space is %20, etc.). The System.Web namespace has a class called HttpUtility, with a static method called UrlEncode for just such encoding.
Issuing HTTP POST Requests
URL encoding is also required for POST requests -- in addition to form encoding, as shown in the following method:
static string HttpPost(string url, string[] paramName, string[] paramVal) { HttpWebRequest req = WebRequest.Create(new Uri(url)) as HttpWebRequest; req.Method = "POST"; req.ContentType = "application/x-www-form-urlencoded"; // Build a string with all the params, properly encoded. // We assume that the arrays paramName and paramVal are // of equal length: StringBuilder paramz = new StringBuilder(); for (int i = 0; i < paramName.Length; i++) { paramz.Append(paramName[i]); paramz.Append("="); paramz.Append(HttpUtility.UrlEncode(paramVal[i])); paramz.Append("&"); } // Encode the parameters as form data: byte[] formData = UTF8Encoding.UTF8.GetBytes(paramz.ToString()); req.ContentLength = formData.Length; // Send the request: using (Stream post = req.GetRequestStream()) { post.Write(formData, 0, formData.Length); } // Pick up the response: string result = null; using (HttpWebResponse resp = req.GetResponse() as HttpWebResponse) { StreamReader reader = new StreamReader(resp.GetResponseStream()); result = reader.ReadToEnd(); } return result; }
For more examples, see this page on the Yahoo! Developers Network.
Your code for GET request has a slight typo - instead of "response" it should say "result".
ReplyDeleteRegards
Simon.
Thanks Simon! I've fixed it now.
ReplyDelete"params" is a keyword in C# now.
ReplyDeletehttp://msdn.microsoft.com/en-us/library/w5zay9db%28VS.71%29.aspx
Maybe you could modify the code (POST example) to avoid using it.
Thanks Amr! I've changed it to "paramz". Hopefully, that won't become a keyword anytime soon...
ReplyDeleteJust use @param as the variable name
DeleteAwesome! Thanks Dr. M!
ReplyDeleteGreat work Elkstein
ReplyDeleteVery well written...thanks!
ReplyDeleteNice Post Doc, will you provide some samples in Xquery
ReplyDeleteIt's a better idea to use System.Uri.EscapeUriString to encode URL's instead of UrlEncode. UrlEncode doesn't encode spaces as their hex representation %20. An old post, but still relevant: http://blogs.msdn.com/b/yangxind/archive/2006/11/09/don-t-use-net-system-uri-unescapedatastring-in-url-decoding.aspx. EscapeUriString MSDN doc: http://msdn.microsoft.com/en-us/library/system.uri.escapeuristring.aspx
ReplyDeleteMake sure to capitalize the "Append", "ToString", and "ContentLength". It didnt like that it was lower case.
ReplyDeleteThanks, Kyle J. I've fixed the code now.
ReplyDeleteHi,
ReplyDeleteThanks a lot for the tutorial. i was breaking my head before. this helped me a lot specially with C#. can i also request you to post some example methods for ALM(QC)
thanks
Bhargav
Hi,
ReplyDeleteThanks a lot for the tutorial. i was breaking my head before. this helped me a lot specially with C#. can i also request you to post some example methods for ALM(QC)
thanks
Bhargav
Thank you for such a helpful tutorial, recently I am gathering knowledge about WS testing, your documentations helped me a lot!
ReplyDeleteCould you explain the byte lenght you're passing into the request and why this is needed?
ReplyDeleteHello LaRae,
ReplyDeleteIt's for the HTTP Content-Length request header (see here for details about it).
Thanks a lot for this amazing article!
ReplyDeleteHello!
ReplyDeleteI dont understand about POST-request.
Should i send xml into service? *service written at java*
or, i shoult fill string[] paramName, string[] paramVal just like Dictionary?
Very Helpful , Thank you!
ReplyDeleteparamz.remove((paramz.length - 1), 1) should be added after the for loop in the example post request above to take off the "&" that is currently being left on the end of the StringBuilder object.
ReplyDelete