Канонический 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
Почему люди используют/записывают последнее?