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

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

Отправка 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 Комментариев: 33
Метки : ,

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

Webmoney Z163628999150, R617151845974

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

Комментарии
Ноя 22, 2009
14:10
#1 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, а если не пустая то с тем что есть.

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

Автор Ноя 22, 2009
23:17

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

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

Дек 6, 2009
19:36
#3 eugene :

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

Янв 14, 2010
15:01
#4 Санек :

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

Янв 14, 2010
15:17
#5 Санек :

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

Автор Янв 14, 2010
20:15

Как-то так:

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

Фев 4, 2010
0:45
#7 den :

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

Автор Фев 4, 2010
20:34

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

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

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

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

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

Фев 10, 2010
4:21

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

Автор Фев 10, 2010
19:39
#10 Кто-то :

Если произойдет 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, 2010
21:37

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

Фев 14, 2010
0:39
#12 den :

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

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

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

Автор Фев 14, 2010
21:34
#13 Кто-то :

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

Фев 14, 2010
23:33

Добрый день!

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

спасибо

марта 26, 2010
23:26

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

Автор марта 28, 2010
20:42
#16 Кто-то :

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

Окт 6, 2010
9:47
#17 Alexy :

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

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

Консольное приложение под 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.

Автор Окт 6, 2010
19:43
#18 Кто-то :

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

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

Дек 4, 2010
3:12
#19 Маздай :

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

Автор Дек 21, 2010
22:41
#20 Кто-то :

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

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

Дек 27, 2010
22:53
#21 Руслан :

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

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

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

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

Дек 27, 2010
23:04
#22 Руслан :

странно но почемуто нету моего хтмл кода который я вам отправил

Автор Дек 28, 2010
12:04
#23 Кто-то :

как-то так:

byte[] sentData = Encoding.GetEncoding (1251).GetBytes («user=User&pass=User»)

Дек 28, 2010
16:14
#24 Руслан :

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

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»);

Автор Янв 2, 2011
17:49
#25 Кто-то :

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

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

Апр 28, 2011
14:32
#26 Dmitri :

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

Автор мая 5, 2011
8:18
#27 Кто-то :

А что пишет? Какие ошибки появляются?

июля 22, 2011
0:45
#28 Marker :

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

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

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

июля 23, 2011
22:23
#29 Marker :

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

Сен 8, 2011
2:56
#30 Владимир :

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

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

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

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

Автор Сен 16, 2011
21:29
#31 Кто-то :

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;

}

Автор Сен 16, 2011
21:30
#32 Кто-то :

Владимир, Посмотрите вот тут — oauth.net/code/

Сен 22, 2011
5:22
#33 Владимир :

Кто-то, спасибо, разобрался.

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

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