Нужно отправить POST
запрос с параметрами и прочитать html
в ответе. Вот мой метод :
public string HTMLContent(string uri, string postparametters = null)
{
try
{
var httpWebRequest = (HttpWebRequest)WebRequest.Create(uri);
httpWebRequest.AllowAutoRedirect = false;
using (var httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse())
{
using (var stream = httpWebResponse.GetResponseStream())
{
if (postparametters!= null)
{
System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding();
byte[] postByteArray = encoding.GetBytes(postparametters);
stream.Write(postByteArray,0, postByteArray.Length); //!!!Ошибка
}
using (var reader = new StreamReader(stream, Encoding.GetEncoding(httpWebResponse.CharacterSet)))
{
return reader.ReadToEnd();
}
}
}
}
Вот строка POST параметров postparametters
:
"CountTypeId=1&InGameExchanges=313&InGameIssuerId=185 280&Opener=FORM&UnderlyingType=3&filterBlockClosed=false"
На stream.Write
падает исключение - NotSupportedException
. Поток не поддерживает запись. Как это исправить ?
Мне кажется вы немного путаете get
и post
запросы.
В GET
запросе идет отправка данных путем добавления необходимых параметров в саму адресную строку, что в итоге выглядит примерно так: сайт/resource?param1=value1¶m2=value2
В POST
запросах правильней отправлять данные в теле запроса. Обычно это идет путем создания на сайтах различных форм.
Давайте посмотрим на скажем вот такой код:
public async Task<string> SendRequest(CancellationToken ct)
{
string data;
var baseAddress = new Uri("http...");
string url = "/data.php";
var content = new FormUrlEncodedContent(new[]
{
new KeyValuePair<string, string>("param1", "..."),
new KeyValuePair<string, string>("param2", "..."),
new KeyValuePair<string, string>("param3", "...")
});
using (var client = new HttpClient { BaseAddress = baseAddress })
{
var result = await client.PostAsync(url, content, ct);
var bytes = await result.Content.ReadAsByteArrayAsync();
Encoding encoding = Encoding.GetEncoding("utf-8");
data = encoding.GetString(bytes, 0, bytes.Length);
result.EnsureSuccessStatusCode();
}
return data;
}
Данный код отправит на указанный адрес запрос с телом, которое будет содержать закодированные параметры (param1, param2 и др..).
Пройдемся по порядку:
string data
- нужна нам для дальнейшего возврата ответа от сервера (будь то HTML или API)var baseAddress = new Uri("http...");
- это корневой сайт, то есть http://сайт.ру
. Без дальнейших значений по типу /data.php
.string url = "/data.php";
- тут как раз указываем /data.php
.var content = new FormUrlEncodedContent
- это именно тело запроса, которое хотим отправить. FormUrlEncoderContent
отлично сконвертирует все данные в подходящий для application/x-www-form-urlencoded
запроса формат.POST
запрос с нашим телом и получаем ответ в кодировке utf-8
. По поводу кодировки кстати, можно использовать что то вроде data = await result.Content.ReadAsStringAsync();
, убрав bytes
и encoding
, у меня лично сайт отдавал данные в кодировке utf-8
, а не зарегистрированной utf8
, все падало, пока явно не указал...В общем, ваш запрос должен грамотно создавать тело по стандартам и вам надо узнать что именно должен получить сервер от вас, может это JSON
данные...
Удачи, пробуйте, надеюсь поможет!
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Нужно сделать программу которая показывает: на сколько каждый процесс использует сеть и на какой ИП он отправляет данныеТак сказать аналог...
Доброго дня всем! Очень интересует как поместить внутрь DataGrid несколько TextBox'ов или ComboBox'ов, что бы по ним совершать поиск по строкам или запрос...
Создал приложение в Unity на iOS всё работает, поменял платформу на Android, так всё сразу упало, я сохранял данные при выходе,
Подскажите, как можно подключиться к бд firebird на C#