Как сделать HTTP POST веб-запрос

602

Как я могу выполнить HTTP-запрос и отправить некоторые данные с помощью метода POST? Я могу сделать запрос GET, но не знаю, как сделать POST.

Теги:
post
httprequest
httpwebrequest

6 ответов

1258
Лучший ответ

Существует несколько способов выполнения запросов HTTP GET и POST:


Метод A: HttpClient

Доступно в:.NET Framework 4.5+,.NET Standard 1.1+,.NET Core 1.0 +

В настоящее время предпочтительный подход. Асинхронный. Портативная версия для других платформ, доступных через NuGet.

using System.Net.Http;

Настройка

рекомендуется, чтобы создать экземпляр HttpClient для вашего приложения и поделиться им.

private static readonly HttpClient client = new HttpClient();

POST

var values = new Dictionary<string, string>
{
   { "thing1", "hello" },
   { "thing2", "world" }
};

var content = new FormUrlEncodedContent(values);

var response = await client.PostAsync("http://www.example.com/recepticle.aspx", content);

var responseString = await response.Content.ReadAsStringAsync();

GET

var responseString = await client.GetStringAsync("http://www.example.com/recepticle.aspx");

Метод B: Библиотеки сторонних разработчиков

RestSharp

Пробная и протестированная библиотека для взаимодействия с API-интерфейсами REST. Портативный. Доступно через NuGet.

Flurl.Http

Более новая библиотека, в которой есть свободный API и помощники по тестированию. HttpClient под капотом. Портативный. Доступно через NuGet.

using Flurl.Http;

POST

var responseString = await "http://www.example.com/recepticle.aspx"
    .PostUrlEncodedAsync(new { thing1 = "hello", thing2 = "world" })
    .ReceiveString();

GET

var responseString = await "http://www.example.com/recepticle.aspx"
    .GetStringAsync();

Метод C: Наследие

Доступно в:.NET Framework 1.1+,.NET Standard 2.0+,.NET Core 1.0 +

using System.Net;
using System.Text;  // for class Encoding
using System.IO;    // for StreamReader

POST

var request = (HttpWebRequest)WebRequest.Create("http://www.example.com/recepticle.aspx");

var postData = "thing1=hello";
    postData += "&thing2=world";
var data = Encoding.ASCII.GetBytes(postData);

request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = data.Length;

using (var stream = request.GetRequestStream())
{
    stream.Write(data, 0, data.Length);
}

var response = (HttpWebResponse)request.GetResponse();

var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();

GET

var request = (HttpWebRequest)WebRequest.Create("http://www.example.com/recepticle.aspx");

var response = (HttpWebResponse)request.GetResponse();

var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();

Метод D: WebClient (также теперь устаревший)

Доступно в:.NET Framework 1.1+,.NET Standard 2.0+,.NET Core 2.0 +

using System.Net;
using System.Collections.Specialized;

POST

using (var client = new WebClient())
{
    var values = new NameValueCollection();
    values["thing1"] = "hello";
    values["thing2"] = "world";

    var response = client.UploadValues("http://www.example.com/recepticle.aspx", values);

    var responseString = Encoding.Default.GetString(response);
}

GET

using (var client = new WebClient())
{
    var responseString = client.DownloadString("http://www.example.com/recepticle.aspx");
}
  • 0
    Как вы получаете ответ от этого?
  • 2
    @Lloyd: HttpWebResponse response = (HttpWebResponse)HttpWReq.GetResponse();
Показать ещё 29 комментариев
285

Простой запрос GET

using System.Net;

...

using (var wb = new WebClient())
{
    var response = wb.DownloadString(url);
}

Простой запрос POST

using System.Net;
using System.Collections.Specialized;

...

using (var wb = new WebClient())
{
    var data = new NameValueCollection();
    data["username"] = "myUser";
    data["password"] = "myPassword";

    var response = wb.UploadValues(url, "POST", data);
}
  • 7
    +1 Для обычного материала POST здорово иметь такой короткий кусок кода.
  • 3
    Тим - Если вы щелкнете правой кнопкой мыши по литералу, который не может быть разрешен, вы найдете контекстное меню Resolve, которое содержит действия для добавления операторов Using для вас. Если контекстное меню «Разрешить» не отображается, это означает, что сначала нужно добавить ссылки.
Показать ещё 10 комментариев
42

MSDN имеет образец.

using System;
using System.IO;
using System.Net;
using System.Text;

namespace Examples.System.Net
{
    public class WebRequestPostExample
    {
        public static void Main()
        {
            // Create a request using a URL that can receive a post. 
            WebRequest request = WebRequest.Create("http://www.contoso.com/PostAccepter.aspx");
            // Set the Method property of the request to POST.
            request.Method = "POST";
            // Create POST data and convert it to a byte array.
            string postData = "This is a test that posts this string to a Web server.";
            byte[] byteArray = Encoding.UTF8.GetBytes(postData);
            // Set the ContentType property of the WebRequest.
            request.ContentType = "application/x-www-form-urlencoded";
            // Set the ContentLength property of the WebRequest.
            request.ContentLength = byteArray.Length;
            // Get the request stream.
            Stream dataStream = request.GetRequestStream();
            // Write the data to the request stream.
            dataStream.Write(byteArray, 0, byteArray.Length);
            // Close the Stream object.
            dataStream.Close();
            // Get the response.
            WebResponse response = request.GetResponse();
            // Display the status.
            Console.WriteLine(((HttpWebResponse)response).StatusDescription);
            // Get the stream containing content returned by the server.
            dataStream = response.GetResponseStream();
            // Open the stream using a StreamReader for easy access.
            StreamReader reader = new StreamReader(dataStream);
            // Read the content.
            string responseFromServer = reader.ReadToEnd();
            // Display the content.
            Console.WriteLine(responseFromServer);
            // Clean up the streams.
            reader.Close();
            dataStream.Close();
            response.Close();
        }
    }
}
  • 0
    По какой-то причине это не сработало, когда я отправлял большое количество данных
4

Вам нужно использовать класс WebRequest и GetRequestStream.

Здесь приведен пример.

1

Это полный рабочий пример отправки/приема данных в формате JSON, я использовал VS2013 Express Edition

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.OleDb;
using System.IO;
using System.Linq;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using System.Web.Script.Serialization;

namespace ConsoleApplication1
{
    class Customer
    {
        public string Name { get; set; }
        public string Address { get; set; }
        public string Phone { get; set; }
    }

    public class Program
    {
        private static readonly HttpClient _Client = new HttpClient();
        private static JavaScriptSerializer _Serializer = new JavaScriptSerializer();

        static void Main(string[] args)
        {
            Run().Wait();
        }

        static async Task Run()
        {
            string url = "http://www.example.com/api/Customer";
            Customer cust = new Customer() { Name = "Example Customer", Address = "Some example address", Phone = "Some phone number" };
            var json = _Serializer.Serialize(cust);
            var response = await Request(HttpMethod.Post, url, json, new Dictionary<string, string>());
            string responseText = await response.Content.ReadAsStringAsync();

            List<YourCustomClassModel> serializedResult = _Serializer.Deserialize<List<YourCustomClassModel>>(responseText);

            Console.WriteLine(responseText);
            Console.ReadLine();
        }

        /// <summary>
        /// Makes an async HTTP Request
        /// </summary>
        /// <param name="pMethod">Those methods you know: GET, POST, HEAD, etc...</param>
        /// <param name="pUrl">Very predictable...</param>
        /// <param name="pJsonContent">String data to POST on the server</param>
        /// <param name="pHeaders">If you use some kind of Authorization you should use this</param>
        /// <returns></returns>
        static async Task<HttpResponseMessage> Request(HttpMethod pMethod, string pUrl, string pJsonContent, Dictionary<string, string> pHeaders)
        {
            var httpRequestMessage = new HttpRequestMessage();
            httpRequestMessage.Method = pMethod;
            httpRequestMessage.RequestUri = new Uri(pUrl);
            foreach (var head in pHeaders)
            {
                httpRequestMessage.Headers.Add(head.Key, head.Value);
            }
            switch (pMethod.Method)
            {
                case "POST":
                    HttpContent httpContent = new StringContent(pJsonContent, Encoding.UTF8, "application/json");
                    httpRequestMessage.Content = httpContent;
                    break;

            }

            return await _Client.SendAsync(httpRequestMessage);
        }
    }
}
1

Простой (однострочный, без проверки ошибок, без ожидания ответа) решение, которое я нашел до сих пор

(new WebClient()).UploadStringAsync(new Uri(Address), dataString);‏

используйте с осторожностью!

  • 4
    Это довольно плохо. Я не рекомендую это, поскольку нет никакой обработки ошибок и отладка, это - боль. Кроме того, на этот вопрос уже есть отличный ответ.
  • 1
    @ Да, другие могут быть заинтересованы в ответах такого типа, даже если они не самые лучшие.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню