.NET HttpClient. Comment POSTER la valeur de la chaîne?

174

Comment puis-je créer en utilisant C # et HttpClient la requête POST suivante: User-Agent: Fiddler Content-type: application / x-www-form-urlencoded Hôte: localhost: 6740 Content-Length: 6

J'ai besoin d'une telle demande pour mon service API WEB:

[ActionName("exist")]
[HttpPost]
public bool CheckIfUserExist([FromBody] string login)
{           
    return _membershipProvider.CheckIfExist(login);
}
Ievgen Martynov
la source
1
Quel client HTTP utilisez-vous dans l'image?
soufre
telerik.com/fiddler
Ievgen Martynov
1
Le service est Web Api MVC. Format JSON pour la demande?
Kiquenet

Réponses:

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
la source
1
hm, mon HttpClientExtensions n'a pas une telle surcharge ... j'utilise le framework 4.0
Ievgen Martynov
1
Quelle surcharge vous n'avez pas? Assurez-vous d'avoir installé le Microsoft.AspNet.WebApi.ClientNuGet dans votre projet. La HttpClientclasse est intégrée à .NET 4.5, pas à .NET 4.0. Si vous souhaitez l'utiliser dans .NET 4.0, vous avez besoin de NuGet!
Darin Dimitrov
1
Premier C # SSSCE que je rencontre. Comme si c'était un jeu d'enfant de le faire fonctionner si vous venez d'une langue avec un IDE approprié.
Buffalo
13
Juste une note que l'utilisation de HttpClient dans l'instruction using est une erreur
ren
26
Vous devez en lecture seule statique privée HttpClient _client = new HttpClient (); au lieu de aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong
Sameer Alibhai
35

Voici un exemple pour appeler de manière synchrone, mais vous pouvez facilement passer à async en utilisant 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
la source
1
Je ne pense pas que cela fonctionnera. vous devez remplacer "login" par une chaîne vide, ce doit être KeyValuePair <string, string> ("", "abc"), voir la réponse acceptée.
joedotnot
cela fonctionne pour moi, travaillez sur le service web php qui appelle $ company_id = $ _POST ("company_id"); comme ça. Si j'envoie en json, php ne peut pas fonctionner.
teapeng
8

Il y a un article sur votre question sur le site Web d'asp.net. J'espère que cela peut vous aider.

Comment appeler une API avec asp net

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

Voici une petite partie de la section POST de l'article

Le code suivant envoie une requête POST qui contient une instance de produit au format 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
la source
La requête est form-urlencoded donc je ne pense pas que JSON fonctionnera
ChrisFletcher
Il est codé par URL de formulaire . Quoi qu'il en soit, format JSON pour les DateTimepropriétés? problèmes de sérialisation?
Kiquenet
4
Je ne semble pas remarquer votre méthode "PostAsJsonAsync" Elle n'est pas disponible dans mon instance HttpClient.
Tommy Holman
4

Ici, j'ai trouvé cet article qui est d'envoyer une demande de publication en utilisant JsonConvert.SerializeObject()& StringContent()aux HttpClient.PostAsyncdonnées

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
la source
1

Tu pourrais faire quelque chose comme ça

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

Et puis strReponse doit contenir les valeurs renvoyées par votre webservice

Axel
la source
25
La question ici était de savoir comment utiliser le nouveau HttpClientet non l'ancien WebRequest.
Darin Dimitrov
C'est vrai que je n'ai pas remarqué, je laisserai le message de toute façon au cas où quelqu'un aurait besoin de l'ancien ...
Axel