.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);
}
Ievgen Martynov
quelle
1
Welchen HTTP-Client verwenden Sie im Image?
Schwefel
telerik.com/fiddler
Ievgen Martynov
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);
        }
    }
}
Darin Dimitrov
quelle
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)
{
}
cuongle
quelle
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;
}
oneNiceFriend
quelle
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);
}
Ravi Makwana
quelle
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

Axel
quelle
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