.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.