Отправить POST запрос

202
18 января 2018, 17:51

Нужно отправить 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. Поток не поддерживает запись. Как это исправить ?

Answer 1

Мне кажется вы немного путаете get и post запросы.

В GET запросе идет отправка данных путем добавления необходимых параметров в саму адресную строку, что в итоге выглядит примерно так: сайт/resource?param1=value1&param2=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 данные...

Удачи, пробуйте, надеюсь поможет!

READ ALSO
Мониторинг ресурсов сети

Мониторинг ресурсов сети

Нужно сделать программу которая показывает: на сколько каждый процесс использует сеть и на какой ИП он отправляет данныеТак сказать аналог...

199
Поиск по DataGrid из внутренних TextBox/ComboBox. Mvvm - C# WPF/.NET 4.x

Поиск по DataGrid из внутренних TextBox/ComboBox. Mvvm - C# WPF/.NET 4.x

Доброго дня всем! Очень интересует как поместить внутрь DataGrid несколько TextBox'ов или ComboBox'ов, что бы по ним совершать поиск по строкам или запрос...

217
При выходе с приложения не сохраняются данные в PlayerPrefs Unity Android

При выходе с приложения не сохраняются данные в PlayerPrefs Unity Android

Создал приложение в Unity на iOS всё работает, поменял платформу на Android, так всё сразу упало, я сохранял данные при выходе,

304
Подключение к базе данных firebird на C# WPF

Подключение к базе данных firebird на C# WPF

Подскажите, как можно подключиться к бд firebird на C#

268