.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);
}

1
Quel client HTTP utilisez-vous dans l'image?
— soufre


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

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)
{
}

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

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

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


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.