Thursday, March 31, 2011

Remote HTTP Post with CSharp

How do you do a Remote HTTP Post (request) in CSharp?

i really needs this pls. :(

From stackoverflow
  • HttpWebRequest

  • You can use WCF or create a WebRequest

    var httpRequest = (HttpWebRequest)WebRequest.Create("http://localhost/service.svc");
    var httpRequest.Method = "POST";
    
    using (var outputStream = httpRequest.GetRequestStream())
    {
        // some complicated logic to create the message
    }
    
    var response = httpRequest.GetResponse();
    using (var stream = response.GetResponseStream())
    {
        // some complicated logic to handle the response message.
    }
    
  • I use this very simple class:

     public class   RemotePost{
         private  System.Collections.Specialized.NameValueCollection Inputs 
         = new  System.Collections.Specialized.NameValueCollection() ;
    
        public string  Url  =  "" ;
        public string  Method  =  "post" ;
        public string  FormName  =  "form1" ;
    
        public void  Add( string  name, string value ){
            Inputs.Add(name, value ) ;
         }
    
         public void  Post(){
            System.Web.HttpContext.Current.Response.Clear() ;
    
             System.Web.HttpContext.Current.Response.Write( "<html><head>" ) ;
    
             System.Web.HttpContext.Current.Response.Write( string .Format( "</head><body onload=\"document.{0}.submit()\">" ,FormName)) ;
    
             System.Web.HttpContext.Current.Response.Write( string .Format( "<form name=\"{0}\" method=\"{1}\" action=\"{2}\" >" ,
    
            FormName,Method,Url)) ;
                for ( int  i = 0 ; i< Inputs.Keys.Count ; i++){
                System.Web.HttpContext.Current.Response.Write( string .Format( "<input name=\"{0}\" type=\"hidden\" value=\"{1}\">" ,Inputs.Keys[i],Inputs[Inputs.Keys[i]])) ;
             }
            System.Web.HttpContext.Current.Response.Write( "</form>" ) ;
             System.Web.HttpContext.Current.Response.Write( "</body></html>" ) ;
             System.Web.HttpContext.Current.Response.End() ;
         }
    }
    

    And you use it thusly:

    RemotePost myremotepost   =  new   RemotePost()  ;
    myremotepost.Url  =  "http://www.jigar.net/demo/HttpRequestDemoServer.aspx" ;
    myremotepost.Add( "field1" , "Huckleberry" ) ;
    myremotepost.Add( "field2" , "Finn" ) ;
    myremotepost.Post() ;
    

    Very clean, easy to use and encapsulates all the muck. I prefer this to using the HttpWebRequest and so forth directly.

    BobbyShaftoe : Why is this getting downvoted?
    David : If I'm reading this correctly, it doesn't actually post a form, but responds with a form that can be posted.
    CodeMonkey1 : I downvoted because it only works in the context of a web page response and even in that case it kills whatever else you may have wanted to do in that page. Also it only allows for a fire & forget post, and is a convoluted way to do it.
  • Use the WebRequest.Create() and set the Method property.

  • HttpWebRequest HttpWReq = 
    (HttpWebRequest)WebRequest.Create("http://www.google.com");
    
    HttpWebResponse HttpWResp = (HttpWebResponse)HttpWReq.GetResponse();
    Console.WriteLine(HttpWResp.StatusCode);
    HttpWResp.Close();
    

    Should print "OK" (200) if the request was successful

    bendewey : Since the OP is doing a POST you should mention the request stream side as well.
  • Also System.Net.WebClient

  • This is code from a small app I wrote once to post a form with values to a URL. It should be pretty robust.

    _formValues is a Dictionary<string,string> containing the variables to post and their values.

    
    // encode form data
    StringBuilder postString = new StringBuilder();
    bool first=true;
    foreach (KeyValuePair pair in _formValues)
    {
        if(first)
         first=false;
        else
         postString.Append("&");
        postString.AppendFormat("{0}={1}", pair.Key, System.Web.HttpUtility.UrlEncode(pair.Value));
    }
    ASCIIEncoding ascii = new ASCIIEncoding();
    byte[] postBytes = ascii.GetBytes(postString.ToString());
    
    // set up request object
    HttpWebRequest request;
    try
    {
        request = WebRequest.Create(url) as HttpWebRequest;
    }
    catch (UriFormatException)
    {
        request = null;
    }
    if (request == null)
        throw new ApplicationException("Invalid URL: " + url);
    request.Method = "POST";
    request.ContentType = "application/x-www-form-urlencoded";
    request.ContentLength = postBytes.Length;
    
    // add post data to request
    Stream postStream = request.GetRequestStream();
    postStream.Write(postBytes, 0, postBytes.Length);
    postStream.Close();
    
    HttpWebResponse response = request.GetResponse as HttpWebResponse;
    
    
    Liam : Thanks, the details on how to build the POST data really helped!
  • Im using the following piece of code for calling webservices using the httpwebrequest class:

    internal static string CallWebServiceDetail(string url, string soapbody, 
    int timeout) {
        return CallWebServiceDetail(url, soapbody, null, null, null, null, 
    null, timeout);
    }
    internal static string CallWebServiceDetail(string url, string soapbody, 
    string proxy, string contenttype, string method, string action, 
    string accept, int timeoutMilisecs) {
        var req = (HttpWebRequest) WebRequest.Create(url);
        if (action != null) {
         req.Headers.Add("SOAPAction", action);
        }
        req.ContentType = contenttype ?? "text/xml;charset=\"utf-8\"";
        req.Accept = accept ?? "text/xml";
        req.Method = method ?? "POST";
        req.Timeout = timeoutMilisecs;
        if (proxy != null) {
         req.Proxy = new WebProxy(proxy, true);
        }
    
        using(var stm = req.GetRequestStream()) {
         XmlDocument doc = new XmlDocument();
         doc.LoadXml(soapbody);
         doc.Save(stm);
        }
        using(var resp = req.GetResponse()) {
         using(var responseStream = resp.GetResponseStream()) {
          using(var reader = new StreamReader(responseStream)) {
           return reader.ReadToEnd();
          }
         }
        }
    }
    

    This can be easily used to call a webservice

    public void TestWebCall() {
        const string url = 
    "http://www.ecubicle.net/whois_service.asmx/HelloWorld";
        const string soap = 
    @"<soap:Envelope xmlns:soap='about:envelope'>
        <soap:Body><HelloWorld /></soap:Body>
    </soap:Envelope>";
        string responseDoc = CallWebServiceDetail(url, soap, 1000);
        XmlDocument doc = new XmlDocument();
        doc.LoadXml(responseDoc);
        string response = doc.DocumentElement.InnerText;
    }
    
  • The problem when beginning with high-level language like C#, Java or PHP is that people may have never known how simple the underground is in reality. So here’s a short introduction:

    http://reboltutorial.com/blog/raw-http-request/

0 comments:

Post a Comment