.NET HttpClient. Wie POST String Wert?


175

Wie kann ich mit C # und HttpClient die folgende POST-Anfrage erstellen: User-Agent: Fiddler Inhaltstyp: application / x-www-form-urlencoded Host: localhost: 6740 Inhaltslänge: 6

Ich benötige eine solche Anfrage für meinen WEB-API-Service:

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

1
Welchen HTTP-Client verwenden Sie im Image?
Schwefel


1
Der Dienst ist Web Api MVC. JSON-Format für Anfrage?
Kiquenet

Antworten:


431
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
hm, meine HttpClientExtensions haben keine solche Überlastung ... Ich benutze Framework 4.0
Ievgen Martynov

1
Welche Überlastung haben Sie nicht? Stellen Sie sicher, dass Sie Microsoft.AspNet.WebApi.ClientNuGet in Ihrem Projekt installiert haben . Die HttpClientKlasse ist in .NET 4.5 erstellt, nicht in .NET 4.0. Wenn Sie es in .NET 4.0 verwenden möchten, benötigen Sie das NuGet!
Darin Dimitrov

1
Erste C # SSSCE, auf die ich stoße. Als wäre es ein Kinderspiel, es zum Laufen zu bringen, wenn Sie aus einer Sprache mit einer richtigen IDE kommen.
Buffalo

13
Nur ein Hinweis, dass die Verwendung von HttpClient in using-Anweisung ein Fehler ist
ren

26
Sie sollten statisch schreibgeschützt privat HttpClient _client = new HttpClient (); stattdessen aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong
Sameer Alibhai

35

Im Folgenden finden Sie ein Beispiel für einen synchronen Aufruf. Sie können jedoch mithilfe von await-sync problemlos zu asynchron wechseln:

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
Ich denke nicht, dass das funktionieren wird. Sie sollten "login" durch eine leere Zeichenfolge ersetzen. Es sollte KeyValuePair <string, string> ("", "abc") sein. Die akzeptierte Antwort finden Sie hier.
Joedotnot

das funktioniert bei mir, arbeite am PHP-Webservice, der $ company_id = $ _POST ("company_id") aufruft; so wie das. Wenn ich als json sende, kann PHP nicht funktionieren.
Teapeng

8

Es gibt einen Artikel über Ihre Frage auf der Website von asp.net. Ich hoffe es kann dir helfen.

Wie man eine API mit asp net aufruft

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

Hier ist ein kleiner Teil aus dem POST-Abschnitt des Artikels

Der folgende Code sendet eine POST-Anforderung, die eine Produktinstanz im JSON-Format enthält:

// 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;
}

Die Anfrage ist formular-urlencodiert, daher glaube ich nicht, dass JSON funktionieren wird
ChrisFletcher

Es ist form-urlencodiert . Wie auch immer, JSON-Format für DateTimeEigenschaften? Serialisierungsprobleme?
Kiquenet

4
Ich scheine Ihre Methode "PostAsJsonAsync" nicht zu bemerken. Sie ist in meiner HttpClient-Instanz nicht verfügbar.
Tommy Holman

4

Hier habe ich diesen Artikel gefunden, der eine Postanfrage mit JsonConvert.SerializeObject()& StringContent()an HttpClient.PostAsyncDaten sendet

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

    var json = Newtonsoft.Json.JsonConvert.SerializeObject(param);
    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);
}

0

Sie könnten so etwas tun

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

Und dann sollte strReponse die von Ihrem Webservice zurückgegebenen Werte enthalten


25
Die Frage hier war, wie man das Neue HttpClientund nicht das Alte benutzt WebRequest.
Darin Dimitrov

Es stimmt, ich habe es nicht bemerkt, ich werde die Post trotzdem verlassen, falls jemand die alte braucht ...
Axel
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.