Канонический HTTP-код POST?

Я видел так много реализаций отправки сообщения http, и, по общему признанию, я не полностью понимаю базовые данные, чтобы знать, что нужно.

Что такое сжатый/правильный/канонический код для отправки HTTP POST в С#.NET 3.5?

Мне нужен общий метод, например

public string SendPost(string url, string data)

который может быть добавлен в библиотеку и всегда используется для публикации данных и будет возвращать ответ сервера.

Ответы

Ответ 1

Я считаю, что простой версией этого было бы

var client = new WebClient();
return client.UploadString(url, data);

В классе System.Net.WebClient есть другие полезные методы, которые позволяют загружать или выгружать строки или файл или байты.

К сожалению, существуют (нередко) ситуации, когда вам нужно больше работать. Вышеприведенное, например, не заботится о ситуациях, когда вам необходимо пройти аутентификацию против прокси-сервера (хотя он будет использовать конфигурацию прокси-сервера по умолчанию для IE).

Также WebClient не поддерживает загрузку нескольких файлов или установочных (определенных) заголовков, и иногда вам нужно идти глубже и использовать

System.Web.HttpWebRequest и System.Net.HttpWebResponse.

Ответ 2

Как говорили другие, WebClient.UploadString (или UploadData) - это путь.

Однако встроенный WebClient имеет большой недостаток: у вас почти нет контроля над WebRequest, который используется за сценой (файлы cookie, аутентификация, пользовательские заголовки...). Простой способ решить эту проблему - создать свой собственный WebClient и переопределить метод GetWebRequest. Затем вы можете настроить запрос до его отправки (вы можете сделать то же самое для ответа, переопределив GetWebResponse). Вот пример файла cookie WebClient. Это так просто, что заставляет меня задаться вопросом, почему встроенный WebClient не справляется с этим из-за-коробки...

Ответ 3

Для сравнения:

// create a client object
using(System.Net.WebClient client = new System.Net.WebClient()) {
    // performs an HTTP POST
    client.UploadString(url, xml);  

}

к

string HttpPost (string uri, string parameters)
{ 
   // parameters: name1=value1&name2=value2 
   WebRequest webRequest = WebRequest.Create (uri);
   webRequest.ContentType = "application/x-www-form-urlencoded";
   webRequest.Method = "POST";
   byte[] bytes = Encoding.ASCII.GetBytes (parameters);
   Stream os = null;
   try
   { // send the Post
      webRequest.ContentLength = bytes.Length;   //Count bytes to send
      os = webRequest.GetRequestStream();
      os.Write (bytes, 0, bytes.Length);         //Send it
   }
   catch (WebException ex)
   {
      MessageBox.Show ( ex.Message, "HttpPost: Request error", 
         MessageBoxButtons.OK, MessageBoxIcon.Error );
   }
   finally
   {
      if (os != null)
      {
         os.Close();
      }
   }

   try
   { // get the response
      WebResponse webResponse = webRequest.GetResponse();
      if (webResponse == null) 
         { return null; }
      StreamReader sr = new StreamReader (webResponse.GetResponseStream());
      return sr.ReadToEnd ().Trim ();
   }
   catch (WebException ex)
   {
      MessageBox.Show ( ex.Message, "HttpPost: Response error", 
         MessageBoxButtons.OK, MessageBoxIcon.Error );
   }
   return null;
} // end HttpPost 

Почему люди используют/записывают последнее?