.NET HttpClient. Jak POST wartość ciągu?

174

Jak mogę utworzyć przy użyciu C # i HttpClient następujące żądanie POST: User-Agent: Fiddler Content-type: application / x-www-form-urlencoded Host: localhost: 6740 Content-Length: 6

Potrzebuję takiego żądania dla mojej usługi WEB API:

[ActionName("exist")]
[HttpPost]
public bool CheckIfUserExist([FromBody] string login)
{           
    return _membershipProvider.CheckIfExist(login);
}
Ievgen Martynov
źródło
1
Jakiego klienta HTTP używasz na obrazie?
siarka
telerik.com/fiddler
Ievgen Martynov
1
Usługa to Web Api MVC. Format JSON na żądanie?
Kiquenet

Odpowiedzi:

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);
        }
    }
}
Darin Dimitrov
źródło
1
hm, moje HttpClientExtensions nie ma takiego przeciążenia ... używam frameworka 4.0
Ievgen Martynov
1
Którego przeciążenia nie masz? Upewnij się, że zainstalowano Microsoft.AspNet.WebApi.Clientpakiet NuGet w projekcie. HttpClientKlasa jest zbudowany w .NET 4.5, nie w .NET 4.0. Jeśli chcesz używać go w .NET 4.0, potrzebujesz pakietu NuGet!
Darin Dimitrov
1
Najpierw natknąłem się na C # SSSCE. Jakby to było takie proste, aby go uruchomić, jeśli pochodzisz z języka z odpowiednim IDE.
Buffalo
13
Tylko uwaga, że ​​użycie HttpClient w instrukcji using jest błędem
ren
26
Należy prywatne static readonly HttpClient _client = new HttpClient (); zamiast aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong
Sameer Alibhai
35

Poniżej znajduje się przykład połączenia synchronicznego, ale możesz łatwo zmienić na asynchroniczny, używając 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
źródło
1
Myślę, że to nie zadziała. należy zamienić "login" na pusty ciąg, powinien to być KeyValuePair <string, string> ("", "abc"), zobacz zaakceptowaną odpowiedź.
joedotnot
to działa dla mnie, pracuj na usłudze sieciowej php, która wywołuje $ company_id = $ _POST ("company_id"); tak. Jeśli wyślę jako json, php nie będzie działać.
teapeng
8

W witrynie asp.net znajduje się artykuł dotyczący Twojego pytania. Mam nadzieję, że może ci pomóc.

Jak wywołać interfejs API za pomocą asp net

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

Oto mała część z sekcji POST tego artykułu

Poniższy kod wysyła żądanie POST zawierające wystąpienie produktu w formacie 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
źródło
Żądanie jest
zakodowane w
Jest zakodowany w formie urlenkodowanej . Tak czy inaczej, format JSON dla DateTimewłaściwości? problemy z serializacją?
Kiquenet
4
Wydaje się, że nie zauważam Twojej metody „PostAsJsonAsync”. Nie jest ona dostępna w moim wystąpieniu HttpClient.
Tommy Holman
4

Tutaj znalazłem ten artykuł, który wysyła prośbę o wpis za pomocą JsonConvert.SerializeObject()& StringContent()do HttpClient.PostAsyncdanych

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);
}
Ravi Makwana
źródło
1

Mógłbyś zrobić coś takiego

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();

Następnie strReponse powinno zawierać wartości zwrócone przez Twoją usługę sieciową

Axel
źródło
25
Tutaj chodziło o to, jak używać nowego, HttpClienta nie starego WebRequest.
Darin Dimitrov
To prawda, nie zauważyłem, i tak zostawię post na wypadek, gdyby ktoś potrzebował starego ...
Axel