
Как делать GET/POST-запросы к интернет-страницам в C#? Элементарно!
Здесь все просто — создаем новый объект 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);
Здесь немного сложнее. Перед отправкой данных необходимо объекту 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();
И на последок пара бонусов:
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;
|
|
Webmoney Z163628999150, R617151845974
|
Посмотрите содержимое ответа сервера.
Может этот Ваш PHP-скрипт содержит ошибки, или сервер отдает совершенно не ту страницу.
А также проверьте кодировку страницы со скриптом
А как передать через 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 ();
А как быть если я хочу сделать post запрос к сайту написаному на asp.net webforms? там вроде какая-то проблема с _VIEWSTATE есть
Ага, есть.
Чтобы его обработать нужно сделать следующее:
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 ());
}
Спасибо большое за помощь
Все сделал, как мне советовал Кто-то, но почему-то такой запрос работает через раз((
Очень часто сервер возвращает ошибку 500.
Может что-то еще надо добавить в запрос?
500 — это внутренняя ошибка сервера. Проблемы на стороне сервера.
Добрый день!
А как можно отдельно отображать капчу в веббраузере виндовс формс. Или получить сессию капчи?
спасибо
А не подскажете, каким образом можно принять какую нибудь информацию от сервера, к примеру 2 переменные. Заранее благодарен
Валентин, элементарно! Получаете ответ сервера в строку и разпарсиваете ее как душе угодно. Или я что-то не понимаю?
Хотел поблагодарить за полезную заметку!
Правда возникла проблема, надеюсь тема еще жива и Вы сможете подсказать решение или что и где почитать.
Консольное приложение под 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.
Программе запрещено отправлять запросы в сеть какими-то внутренними политиками системы.
Сам с таким не сталкивался, но судя по всему нужно в панели администрирования подкрутить что-то в Microsoft .NET Framework Configuration. Вот хелп —
А подскажите пожалуйста, как это всё будет выглядеть на С++ ?
В C++ для .NET? Или WinAPI? Или что-то универсальное?
Тут подходов много, все зависит от используемых технологий.
Привет! У меня такой вопрос
Сам я только учусь кодить в си шарпе...
вот есть такая штука
как мне передать этой страшной штуке через пост данные... к примеру я хочу отправить имя: User пароль: User
странно но почемуто нету моего хтмл кода который я вам отправил
как-то так:
byte[] sentData = Encoding.GetEncoding (1251).GetBytes («user=User&pass=User»)
просто у меня такое чудо
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»);
ооо, тут Вам сначала нужно проанализировать что делает функция md5hash и перед отправкой выполнять то, что делает она. Судя по названию она скорее всего считает md5 пароля и отправляет его (md5), а не сам пароль.
А вообще подумайте о
Пытаюсь пройти авторизацию на твиттер. Ничего не получается. action="https://..." что делать?
А что пишет? Какие ошибки появляются?
Спасибо за пост, очень заинтересовало, но как только ни старался — не смог сделать отправку картинки, можете показать как сделать заливку картинки методом POST через такую вот форму
_http://img.aengine.ru/index.php
Заранее спасибо!
Предыдущий вопрос снят, но возник новый вопрос, как можно средствами C# определить mime-тип файла ?
Здравствуйте, помогите пожалуйста пройти авторизацию OAuth на гитхабе.
Не могу разобраться с кодом
Если возможно ткните носом или примерный код.
Заранее спасибо.
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;
}
Владимир, Посмотрите вот тут —
Кто-то, спасибо, разобрался.
14:10
Не получается отправить запрос по методу 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, а если не пустая то с тем что есть.
так вот новая запись не добавляется вообще