Отправка GET и POST запросов в C#

Отправка GET и POST запросов в C#
Как делать GET/POST-запросы к интернет-страницам в C#? Элементарно!

Отправка GET-запросов

Здесь все просто — создаем новый объект WebRequest, в конструктор которого передаем URL-адрес нужной страницы, получаем ответ методом GetResponse (). Читаем поток ответа сервера и делаем с ним что дуже угодно :)

System.Net.WebRequest reqGET = System.Net.WebRequest.Create(@"http://site.ru/");
System.Net.WebResponse resp = reqGET.GetResponse();
System.IO.Stream stream = resp.GetResponseStream();
System.IO.StreamReader sr = new System.IO.StreamReader(stream);
string s = sr.ReadToEnd();
Console.WriteLine(s);

Отправка POST-запросов

Здесь немного сложнее. Перед отправкой данных необходимо объекту WebRequest задать ряд опций, определяющих метод запроса и тип содержимого. Затем необходимо закодировать отправляемые данные и записать их в поток запроса. После этого можно прочитать поток ответа.

System.Net.WebRequest reqPOST = System.Net.WebRequest.Create(@"http://site.ru/send.php");
reqPOST.Method = "POST"; // Устанавливаем метод передачи данных в POST
reqPOST.Timeout = 120000; // Устанавливаем таймаут соединения
reqPOST.ContentType = "application/x-www-form-urlencoded"; // указываем тип контента
// передаем список пар параметров / значений для запрашиваемого скрипта методом POST
// здесь используется кодировка cp1251 для кодирования кирилицы и спец. символов в значениях параметров
// Если скрипт должен принимать данные в utf-8, то нужно выбрать Encodinf.UTF8
byte[] sentData = Encoding.GetEncoding(1251).GetBytes("message=" + System.Web.HttpUtility.UrlEncode("отправляемые данные", Encoding.GetEncoding(1251)));
reqPOST.ContentLength = sentData.Length;
System.IO.Stream sendStream = reqPOST.GetRequestStream();
sendStream.Write(sentData, 0, sentData.Length);
sendStream.Close();
//System.Net.WebResponse result = reqPOST.GetResponse();

И на последок пара бонусов:

Базовая HTTP-авторизация

System.Net.WebClient wc = new System.Net.WebClient();
wc.Credentials = new System.Net.NetworkCredential("usr", "mypassword");
byte[] response = wc.DownloadData("http://localhost/testlogin");

Использование куков

CookieContainer cookies = new CookieContainer();
Request.CookieContainer = cookies;
// И после каждого запроса обновляем контейнер:
cookies = Request.CookieContainer;

Скачать пример

Поблагодарить автора

34 Responses to Отправка GET и POST запросов в C#

  1. Не получается отправить запрос по методу POST.

    все делаю как написано, но ничего не происходит.

    $name = isset($_POST['Name'])?$_POST['Name']:'123'; $sql= "INSERT INTO boi ( `id` , `id_user` , `name`) VALUES ( NULL, '0', $name)"; mysql_query($sql); mysql_close($dbcnx); echo "$name";

    те если форма пустая в таблицу добавляется запись с именем 123, а если не пустая то с тем что есть.

    так вот новая запись не добавляется вообще

  2. Посмотрите содержимое ответа сервера.

    Может этот Ваш PHP-скрипт содержит ошибки, или сервер отдает совершенно не ту страницу.

  3. А как передать через post файл, т.е. есть на странице форма выбота файла.

  4. Кстати, спасибо за статью, а то я сразу с вопросами полез и не отметил, что она мне помогла ))

  5. Как-то так:

    HttpWebRequest req = (HttpWebRequest)

    WebRequest.Create («http://www.mysite.com/index.php»);

    string boundary =

    Guid.NewGuid ().ToString ().Replace («-»,

    "«);

    req.ContentType = „multipart/form-data; boundary=“ +

    boundary;

    req.Method = „POST“;

    MemoryStream postData = new MemoryStream ();

    string newLine = „\r\n“;

    StreamWriter sw = new StreamWriter (postData);

    sw.Write („--“ + boundary + newLine);

    sw.Write („Content-Disposition: form-data;

    name=\“{0}\»;

    filename=\"{1}\"{2}",

    «upload», «test.jpg», newLine);

    sw.Write ("Content-Type: image/pjpeg " + newLine +

    newLine);

    sw.Flush ();

    postData.Write (contents, 0, contents.Length);

    sw.Write (newLine);

    sw.Write («--{0}--{1}», boundary,

    newLine);

    sw.Flush ();

    req.ContentLength = postData.Length;

    using (Stream s = req.GetRequestStream ())

    postData.WriteTo (s);

    postData.Close ();

    bytes.com/topic/c-sharp/a...t-send-post-data

  6. А как быть если я хочу сделать post запрос к сайту написаному на asp.net webforms? там вроде какая-то проблема с _VIEWSTATE есть

  7. Ага, есть. msdn.microsoft.com/ru-ru/...2976 (en-us).aspx

    Чтобы его обработать нужно сделать следующее:

    1. получить содержимое страницы с формой;

    2. Регулярными выражениями выдернуть из формы содержимое скрытого поля __VIEWSTATE (о регулярных выражениях тут);

    3. Добавить полученное значение __VIEWSTATE к передаваемым данным.

  8. Здравствуйте, спасибо статья очень помогла, но вот вопрос возник, как отловить что произошла ошибка 404?

  9. Если произойдет 404, то WebRequest должен сгенерировать соответствующий WebException:

    WebRequest wr = WebRequest.Create («http://site.ru/404»);

    try

    {

    wr.GetResponse ();

    }

    catch (WebException ex)

    {

    Console.WriteLine (ex.Message);

    Console.WriteLine (ex.Status.ToString ());

    StreamReader sr = new StreamReader (ex.Response.GetResponseStream ());

    Console.WriteLine (sr.ReadToEnd ());

    }

  10. Все сделал, как мне советовал Кто-то, но почему-то такой запрос работает через раз((

    Очень часто сервер возвращает ошибку 500.

    Может что-то еще надо добавить в запрос?

  11. Добрый день!

    А как можно отдельно отображать капчу в веббраузере виндовс формс. Или получить сессию капчи?

    спасибо

  12. А не подскажете, каким образом можно принять какую нибудь информацию от сервера, к примеру 2 переменные. Заранее благодарен

  13. Валентин, элементарно! Получаете ответ сервера в строку и разпарсиваете ее как душе угодно. Или я что-то не понимаю?

  14. Хотел поблагодарить за полезную заметку!

    Правда возникла проблема, надеюсь тема еще жива и Вы сможете подсказать решение или что и где почитать.

    Консольное приложение под 2-м фреймворком, на строке

    System.Net.WebRequest MyRequest = System.Net.WebRequest.Create(@"http://any.url/");

    вылетает с ошибкой

    Request for the permission of type 'System.Net.WebPermission, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed.

  15. Программе запрещено отправлять запросы в сеть какими-то внутренними политиками системы.

    Сам с таким не сталкивался, но судя по всему нужно в панели администрирования подкрутить что-то в Microsoft .NET Framework Configuration. Вот хелп — msdn.microsoft.com/ru-ru/library/Aa302354

  16. А подскажите пожалуйста, как это всё будет выглядеть на С++ ?

  17. В C++ для .NET? Или WinAPI? Или что-то универсальное?

    Тут подходов много, все зависит от используемых технологий.

  18. Привет! У меня такой вопрос

    Сам я только учусь кодить в си шарпе...

    вот есть такая штука

    как мне передать этой страшной штуке через пост данные... к примеру я хочу отправить имя: User пароль: User

  19. просто у меня такое чудо

    method="post" onsubmit="md5hash (vb_login_password, vb_login_md5password, vb_login_md5password_utf, 0)"

    и как туда отправить данные я не знаю))

    byte[] sentData = Encoding.GetEncoding (1251).GetBytes («vb_login_password=user&vb_login_md5password=user»);

  20. ооо, тут Вам сначала нужно проанализировать что делает функция md5hash и перед отправкой выполнять то, что делает она. Судя по названию она скорее всего считает md5 пароля и отправляет его (md5), а не сам пароль.

    А вообще подумайте о WebKit

  21. Пытаюсь пройти авторизацию на твиттер. Ничего не получается. action="https://..." что делать?

  22. Спасибо за пост, очень заинтересовало, но как только ни старался — не смог сделать отправку картинки, можете показать как сделать заливку картинки методом POST через такую вот форму

    _http://img.aengine.ru/index.php

    Заранее спасибо!

  23. Предыдущий вопрос снят, но возник новый вопрос, как можно средствами C# определить mime-тип файла ?

  24. Здравствуйте, помогите пожалуйста пройти авторизацию OAuth на гитхабе.

    http://developer.github.com/v3/oauth/ Не могу разобраться с кодом :(

    Если возможно ткните носом или примерный код.

    Заранее спасибо.

  25. Marker, как-то так:

    private string MimeType (string Filename)

    {

    string mime = «application/octetstream»;

    string ext = System.IO.Path.GetExtension (Filename).ToLower ();

    Microsoft.Win32.RegistryKey rk = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey (ext);

    if (rk != null && rk.GetValue («Content Type») != null)

    mime = rk.GetValue («Content Type»).ToString ();

    return mime;

    }

  26. А вот так можно выполнить HTTP GET запрос в ASP.NET:

    Uri uri = new Uri («http://site.ru/page.aspx»);

    if (uri.Scheme = Uri.UriSchemeHttp) {

    HttpWebRequest request = HttpWebRequest.Create (uri);

    request.Method = WebRequestMethods.Http.Get;

    HttpWebResponse response = request.GetResponse ();

    StreamReader reader = new StreamReader (response.GetResponseStream ());

    string tmp = reader.ReadToEnd ();

    response.Close ();

    Response.Write (tmp);

Оставить комментарий

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>