Create HTTP post request and receive response using C# console application

前端 未结 5 607
抹茶落季
抹茶落季 2020-11-29 04:11

I need to post data to a URL (https://somesite.com) to download file in responseStrem based on the parameters I posted. How can I do that using a C# console application?

相关标签:
5条回答
  • 2020-11-29 04:27
    HttpWebRequest request =(HttpWebRequest)WebRequest.Create("some url");
    request.Method = "POST";
    request.ContentType = "application/x-www-form-urlencoded";
    request.UserAgent = "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 7.1; Trident/5.0)";
    request.Accept = "/";
    request.UseDefaultCredentials = true;
    request.Proxy.Credentials = System.Net.CredentialCache.DefaultCredentials;
    doc.Save(request.GetRequestStream());
    HttpWebResponse resp = request.GetResponse() as HttpWebResponse;
    

    Hope it helps

    0 讨论(0)
  • 2020-11-29 04:35
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Net;
    using System.IO;
    
    namespace WebserverInteractionClassLibrary
    {
        public class RequestManager
        {
            public string LastResponse { protected set; get; }
    
            CookieContainer cookies = new CookieContainer();
    
            internal string GetCookieValue(Uri SiteUri,string name)
            {
                Cookie cookie = cookies.GetCookies(SiteUri)[name];
                return (cookie == null) ? null : cookie.Value;
            }
    
            public string GetResponseContent(HttpWebResponse response)
            {
                if (response == null)
                {
                    throw new ArgumentNullException("response");
                }
                Stream dataStream = null;
                StreamReader reader = null;
                string responseFromServer = null;
    
                try
                {
                    // Get the stream containing content returned by the server.
                    dataStream = response.GetResponseStream();
                    // Open the stream using a StreamReader for easy access.
                    reader = new StreamReader(dataStream);
                    // Read the content.
                    responseFromServer = reader.ReadToEnd();
                    // Cleanup the streams and the response.
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
                finally
                {                
                    if (reader != null)
                    {
                        reader.Close();
                    }
                    if (dataStream != null)
                    {
                        dataStream.Close();
                    }
                    response.Close();
                }
                LastResponse = responseFromServer;
                return responseFromServer;
            }
    
            public HttpWebResponse SendPOSTRequest(string uri, string content, string login, string password, bool allowAutoRedirect)
            {
                HttpWebRequest request = GeneratePOSTRequest(uri, content, login, password, allowAutoRedirect);
                return GetResponse(request);
            }
    
            public HttpWebResponse SendGETRequest(string uri, string login, string password, bool allowAutoRedirect)
            {
                HttpWebRequest request = GenerateGETRequest(uri, login, password, allowAutoRedirect);
                return GetResponse(request);
            }
    
            public HttpWebResponse SendRequest(string uri, string content, string method, string login, string password, bool allowAutoRedirect)
            {
                HttpWebRequest request = GenerateRequest(uri, content, method, login, password, allowAutoRedirect);
                return GetResponse(request);
            }
    
            public HttpWebRequest GenerateGETRequest(string uri, string login, string password, bool allowAutoRedirect)
            {
                return GenerateRequest(uri, null, "GET", null, null, allowAutoRedirect);
            }
    
            public HttpWebRequest GeneratePOSTRequest(string uri, string content, string login, string password, bool allowAutoRedirect)
            {
                return GenerateRequest(uri, content, "POST", null, null, allowAutoRedirect);
            }
    
            internal HttpWebRequest GenerateRequest(string uri, string content, string method, string login, string password, bool allowAutoRedirect)
            {
                if (uri == null)
                {
                    throw new ArgumentNullException("uri");
                }
                // Create a request using a URL that can receive a post. 
                HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(uri);
                // Set the Method property of the request to POST.
                request.Method = method;
                // Set cookie container to maintain cookies
                request.CookieContainer = cookies;
                request.AllowAutoRedirect = allowAutoRedirect;
                // If login is empty use defaul credentials
                if (string.IsNullOrEmpty(login))
                {
                    request.Credentials = CredentialCache.DefaultNetworkCredentials;
                }
                else
                {
                    request.Credentials = new NetworkCredential(login, password);
                }
                if (method == "POST")
                {
                    // Convert POST data to a byte array.
                    byte[] byteArray = Encoding.UTF8.GetBytes(content);
                    // Set the ContentType property of the WebRequest.
                    request.ContentType = "application/x-www-form-urlencoded";
                    // Set the ContentLength property of the WebRequest.
                    request.ContentLength = byteArray.Length;
                    // Get the request stream.
                    Stream dataStream = request.GetRequestStream();
                    // Write the data to the request stream.
                    dataStream.Write(byteArray, 0, byteArray.Length);
                    // Close the Stream object.
                    dataStream.Close();
                }
                return request;
            }
    
            internal HttpWebResponse GetResponse(HttpWebRequest request)
            {
                if (request == null)
                {
                    throw new ArgumentNullException("request");
                }
                HttpWebResponse response = null;
                try
                {
                    response = (HttpWebResponse)request.GetResponse();                
                    cookies.Add(response.Cookies);                
                    // Print the properties of each cookie.
                    Console.WriteLine("\nCookies: ");
                    foreach (Cookie cook in cookies.GetCookies(request.RequestUri))
                    {
                        Console.WriteLine("Domain: {0}, String: {1}", cook.Domain, cook.ToString());
                    }
                }
                catch (WebException ex)
                {
                    Console.WriteLine("Web exception occurred. Status code: {0}", ex.Status);
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
                return response;
            }
    
        }
    }
    
    0 讨论(0)
  • 2020-11-29 04:35

    Insted of using System.Net.WebClient I would recommend to have a look on System.Net.Http.HttpClient which was introduced with net 4.5 and makes your life much easier.

    Also microsoft recommends to use the HttpClient on this article

    http://msdn.microsoft.com/en-us/library/system.net.webclient(VS.90).aspx

    An example could look like this:

    var client = new HttpClient();
    var content = new MultipartFormDataContent
    {
         { new StringContent("myUserId"), "userid"},
         { new StringContent("myFileName"), "filename"},
         { new StringContent("myPassword"), "password"},
         { new StringContent("myType"), "type"}
    };
    
    var responseMessage = await client.PostAsync("some url", content);        
    var stream = await responseMessage.Content.ReadAsStreamAsync();
    
    0 讨论(0)
  • 2020-11-29 04:45

    Take a look at the System.Net.WebClient class, it can be used to issue requests and handle their responses, as well as to download files:

    http://www.hanselman.com/blog/HTTPPOSTsAndHTTPGETsWithWebClientAndCAndFakingAPostBack.aspx

    http://msdn.microsoft.com/en-us/library/system.net.webclient(VS.90).aspx

    0 讨论(0)
  • 2020-11-29 04:52

    For this you can simply use the "HttpWebRequest" and "HttpWebResponse" classes in .net.

    Below is a sample console app I wrote to demonstrate how easy this is.

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Net;
    using System.IO;
    
    namespace Test
    {
        class Program
        {
            static void Main(string[] args)
            {
                string url = "www.somewhere.com";       
                string fileName = @"C:\output.file";
    
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
                request.Timeout = 5000;
    
                try
                {
                    using (WebResponse response = (HttpWebResponse)request.GetResponse())
                    {
                        using (FileStream stream = new FileStream(fileName, FileMode.Create, FileAccess.Write))
                        {
                            byte[] bytes = ReadFully(response.GetResponseStream());
    
                            stream.Write(bytes, 0, bytes.Length);
                        }
                    }
                }
                catch (WebException)
                {
                    Console.WriteLine("Error Occured");
                }
            }
    
            public static byte[] ReadFully(Stream input)
            {
                byte[] buffer = new byte[16 * 1024];
                using (MemoryStream ms = new MemoryStream())
                {
                    int read;
                    while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
                    {
                        ms.Write(buffer, 0, read);
                    }
                    return ms.ToArray();
                }
            }
        }
    }
    

    Enjoy!

    0 讨论(0)
提交回复
热议问题