.NET HttpClient. Як POST значення рядка?


174

Як я можу створити за допомогою C # та HttpClient такий запит POST: Користувач-агент: Fiddler Тип вмісту: application / x-www-form-urlencoded Хост: localhost: 6740 Тривалість вмісту: 6

Мені потрібен такий запит для моєї послуги WEB API:

[ActionName("exist")]
[HttpPost]
public bool CheckIfUserExist([FromBody] string login)
{           
    return _membershipProvider.CheckIfExist(login);
}

1
Який клієнт HTTP ви використовуєте для зображення?
сірка


1
Послуга - Web Api MVC. Формат JSON для запиту?
Кікенет

Відповіді:


433
using System;
using System.Collections.Generic;
using System.Net.Http;

class Program
{
    static void Main(string[] args)
    {
        Task.Run(() => MainAsync());
        Console.ReadLine();
    }

    static async Task MainAsync()
    {
        using (var client = new HttpClient())
        {
            client.BaseAddress = new Uri("http://localhost:6740");
            var content = new FormUrlEncodedContent(new[]
            {
                new KeyValuePair<string, string>("", "login")
            });
            var result = await client.PostAsync("/api/Membership/exists", content);
            string resultContent = await result.Content.ReadAsStringAsync();
            Console.WriteLine(resultContent);
        }
    }
}

1
хм, у мого HttpClientExtensions немає таких перевантажень ... я використовую Framework 4.0
Івген Мартинов

1
Яких перевантажень у вас немає? Переконайтеся, що ви встановили Microsoft.AspNet.WebApi.ClientNuGet до свого проекту. HttpClientКлас побудований в .NET 4.5, а не в .NET 4.0. Якщо ви хочете використовувати його в .NET 4.0, вам потрібен NuGet!
Дарин Димитров

1
Перший C # SSSCE Я натрапив. Ніби це був такий вітер, щоб змусити його працювати, якщо ви приїжджаєте з мови з належною IDE.
Буффало

13
Просто до відома , що використання HttpClient у використанні заяви є помилкою
жень

26
Ви повинні приватно статично читати лише HttpClient _client = новий HttpClient (); замість aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong
Sameer Alibhai

35

Нижче наведено приклад для синхронного виклику, але ви можете легко перейти на асинхронізацію, використовуючи функцію await-sync:

var pairs = new List<KeyValuePair<string, string>>
            {
                new KeyValuePair<string, string>("login", "abc")
            };

var content = new FormUrlEncodedContent(pairs);

var client = new HttpClient {BaseAddress = new Uri("http://localhost:6740")};

    // call sync
var response = client.PostAsync("/api/membership/exist", content).Result; 
if (response.IsSuccessStatusCode)
{
}

1
Я не думаю, що це спрацює. ви повинні замінити "вхід" на порожній рядок, це повинен бути KeyValuePair <string, string> ("", "abc"), див. прийняту відповідь.
joedotnot

це працює для мене, робота над php webservice, що викликає $ company_id = $ _POST ("company_id"); щось схоже на те. Якщо я надсилаю як json, php не може працювати.
teapeng

8

На веб-сайті asp.net є стаття про ваше запитання. Я сподіваюся, що це може вам допомогти.

Як зателефонувати в api з мережею asp

http://www.asp.net/web-api/overview/advanced/calling-a-web-api-from-a-net-client

Ось невелика частина із розділу POST статті

Наступний код надсилає запит POST, який містить примірник продукту у форматі JSON:

// HTTP POST
var gizmo = new Product() { Name = "Gizmo", Price = 100, Category = "Widget" };
response = await client.PostAsJsonAsync("api/products", gizmo);
if (response.IsSuccessStatusCode)
{
    // Get the URI of the created resource.
    Uri gizmoUrl = response.Headers.Location;
}


Це форма-урленкодована . У будь-якому випадку, формат JSON для DateTimeвластивостей? проблеми серіалізації?
Кікенет

4
Я, здається, не помічаю вашого методу "PostAsJsonAsync" Він недоступний у моєму екземплярі HttpClient.
Томмі Холман

4

Тут я знайшов цю статтю, яка надсилає поштовий запит за допомогою JsonConvert.SerializeObject()& StringContent()до HttpClient.PostAsyncданих

static async Task Main(string[] args)
{
    var person = new Person();
    person.Name = "John Doe";
    person.Occupation = "gardener";

    var json = Newtonsoft.Json.JsonConvert.SerializeObject(person);
    var data = new System.Net.Http.StringContent(json, Encoding.UTF8, "application/json");

    var url = "https://httpbin.org/post";
    using var client = new HttpClient();

    var response = await client.PostAsync(url, data);

    string result = response.Content.ReadAsStringAsync().Result;
    Console.WriteLine(result);
}

1

Ви могли б зробити щось подібне

HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://localhost:6740/api/Membership/exist");

req.Method = "POST";
req.ContentType = "application/x-www-form-urlencoded";         
req.ContentLength = 6;

StreamWriter streamOut = new StreamWriter(req.GetRequestStream(), System.Text.Encoding.ASCII);
streamOut.Write(strRequest);
streamOut.Close();
StreamReader streamIn = new StreamReader(req.GetResponse().GetResponseStream());
string strResponse = streamIn.ReadToEnd();
streamIn.Close();

І тоді strReponse повинен містити значення, повернені вашою веб-службою


25
Тут було питання про те, як використовувати нове, HttpClientа не старе WebRequest.
Дарин Димитров

Щоправда, я не помітив, я все одно залишу посаду, якщо комусь потрібна стара ...
Axel
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.