.NET HttpClient. Как выставить строковое значение?

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-клиент вы используете в образе?
сера
telerik.com/fiddler
Мартынов
1
Сервис Web Api MVC. JSON формат для запроса?
Kiquenet

Ответы:

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 такой перегрузки нет ... я использую фреймворк 4.0
Евгений Мартынов
1
Какой перегрузки у вас нет? Убедитесь, что вы установили Microsoft.AspNet.WebApi.ClientNuGet в свой проект. HttpClientКласс построен в .NET 4.5, а не в .NET 4.0. Если вы хотите использовать его в .NET 4.0, вам нужен NuGet!
Дарин Димитров
1
Первый C # SSSCE я сталкиваюсь. Как будто это было так просто, чтобы запустить его, если вы используете язык с надлежащей IDE.
Буффало
13
Просто обратите внимание, что использование HttpClient в операторе использования является ошибкой
ren
26
Вам следует закрытое статическое чтение только для HttpClient _client = new HttpClient (); вместо aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong
Самир
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)
{
}
cuongle
источник
1
Я не думаю, что это сработает. Вы должны заменить «логин» пустой строкой, это должно быть KeyValuePair <строка, строка> («», «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, который содержит экземпляр Product в формате 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;
}
oneNiceFriend
источник
Запрос
ChrisFletcher
Это форма-urlencoded . В любом случае, формат JSON для DateTimeсвойств? Проблемы с сериализацией?
Kiquenet
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 должен содержать значения, возвращаемые вашим веб-сервисом

Axel
источник
25
Вопрос здесь был о том, как использовать новое, HttpClientа не старое WebRequest.
Дарин Димитров
Правда я не заметил, я все равно покину пост, если кому-то понадобится старый ...
Аксель