1477 votes

Comment faire une requête web HTTP POST

Canonical
Comment puis-je faire une requête HTTP et envoyer des données en utilisant la fonction POST méthode ?

Je peux faire un GET mais je n'ai aucune idée de la manière dont on peut faire une POST demande.

9voto

Ohad Cohen Points 384

La solution la plus simple que j'aie trouvée jusqu'à présent (une seule ligne, pas de vérification des erreurs, pas d'attente de réponse) :

(new WebClient()).UploadStringAsync(new Uri(Address), dataString);‏

A utiliser avec précaution !

9voto

user8803505 Points 96

Si vous aimez une API fluide, vous pouvez utiliser Tiny.RestClient . Il est disponible à l'adresse suivante NuGet .

var client = new TinyRestClient(new HttpClient(), "http://MyAPI.com/api");
// POST
var city = new City() { Name = "Paris", Country = "France" };
// With content
var response = await client.PostRequest("City", city)
                           .ExecuteAsync<bool>();

9voto

Contango Points 7976

Cette solution n'utilise que des appels standard .NET.

Testé :

  • Utilisé dans une application WPF d'entreprise. Utilise async/await pour éviter de bloquer l'interface utilisateur.
  • Compatible avec .NET 4.5+.
  • Testé sans paramètres (nécessite un "GET" en coulisses).
  • Testé avec des paramètres (nécessite un "POST" en coulisses).
  • Testé avec une page web standard telle que Google.
  • Testé avec un service web interne basé sur Java.

Référence :

// Add a Reference to the assembly System.Web

Code :

using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
using System.Web;

private async Task<WebResponse> CallUri(string url, TimeSpan timeout)
{
    var uri = new Uri(url);
    NameValueCollection rawParameters = HttpUtility.ParseQueryString(uri.Query);
    var parameters = new Dictionary<string, string>();
    foreach (string p in rawParameters.Keys)
    {
        parameters[p] = rawParameters[p];
    }

    var client = new HttpClient { Timeout = timeout };
    HttpResponseMessage response;
    if (parameters.Count == 0)
    {
        response = await client.GetAsync(url);
    }
    else
    {
        var content = new FormUrlEncodedContent(parameters);
        string urlMinusParameters = uri.OriginalString.Split('?')[0]; // Parameters always follow the '?' symbol.
        response = await client.PostAsync(urlMinusParameters, content);
    }
    var responseString = await response.Content.ReadAsStringAsync();

    return new WebResponse(response.StatusCode, responseString);
}

private class WebResponse
{
    public WebResponse(HttpStatusCode httpStatusCode, string response)
    {
        this.HttpStatusCode = httpStatusCode;
        this.Response = response;
    }
    public HttpStatusCode HttpStatusCode { get; }
    public string Response { get; }
}

Pour appeler sans paramètres (utilise un "GET" en coulisse) :

 var timeout = TimeSpan.FromSeconds(300);
 WebResponse response = await this.CallUri("http://www.google.com/", timeout);
 if (response.HttpStatusCode == HttpStatusCode.OK)
 {
     Console.Write(response.Response); // Print HTML.
 }

Pour appeler avec des paramètres (utilise un "POST" dans les coulisses) :

 var timeout = TimeSpan.FromSeconds(300);
 WebResponse response = await this.CallUri("http://example.com/path/to/page?name=ferret&color=purple", timeout);
 if (response.HttpStatusCode == HttpStatusCode.OK)
 {
     Console.Write(response.Response); // Print HTML.
 }

7voto

SLaks Points 391154

Vous devez utiliser le WebRequest et la classe GetRequestStream méthode.

Ici est un exemple.

7voto

S4NNY1 Points 174

Lorsque vous utilisez Windows.Web.Http pour POST, au lieu de FormUrlEncodedContent, on écrit HttpFormUrlEncodedContent. De même, la réponse est de type HttpResponseMessage. Le reste est comme Evan Mulawski l'a écrit.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X