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

Категория: C# Комментариев: 16

Отправка 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;

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

Автор: Кто-то   @   12 октября 2009 Комментариев: 16
Метки : ,

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

Webmoney Z163628999150, R61715184597

Комментариев: 16

  • Zmei

    Не получается отправить запрос по методу 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, а если не пустая то с тем что есть.

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

  • Кто-то

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

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

  • eugene

    А также проверьте кодировку страницы со скриптом

  • Санек

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

  • Санек

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

  • Кто-то

    Как-то так:

    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

  • den

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

  • Кто-то

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

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

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

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

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

  • Валентин

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

  • Кто-то

    Если произойдет 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 ());

    }

  • Валентин

    Спасибо большое за помощь ;)

  • den

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

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

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

  • Кто-то

    500 — это внутренняя ошибка сервера. Проблемы на стороне сервера.

  • Александр

    Добрый день!

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

    спасибо

  • Валентин

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

  • Кто-то

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


Leave a reply

;) :| :x :twisted: :) 8O :( :roll: :P :oops: :o :mrgreen: :lol: :idea: :D :evil: :cry: 8) :arrow: :? :?: :!:

Предыдущая запись
«
Следующая запись
»