web-dev-qa-db-fra.com

C # - Contenu du corps dans la demande POST

J'ai besoin de faire des appels api en C #. J'utilise Web API Client de Microsoft pour ce faire. J'ai réussi à faire quelques POST requêtes, mais je ne sais pas comment ajouter le champ "Body" dans mes requêtes. Une idée? Voici mon code:

    static HttpClient client = new HttpClient();
    public override void AwakeFromNib()
    {
        base.AwakeFromNib();
        notif_button.Activated += (sender, e) => {
        };
        tips_button.Activated += (sender, e) =>
        {
            Tip t1 = new Tip(title_tips.StringValue, pic_tips.StringValue, content_tips.StringValue, "TEST");
            client.BaseAddress = new Uri("my_url");
            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            CreateProductAsync(t1).Wait();
        };
    }

    static async Task<Uri> CreateProductAsync(Tip tips)
    {
        HttpResponseMessage response = await client.PostAsJsonAsync("api/add_tips", tips);
        response.EnsureSuccessStatusCode();
        return response.Headers.Location;
    }
6
Baptiste

Grâce à this et this , j'ai finalement trouvé la solution pour envoyer des demandes de publication avec des en-têtes ET du contenu corporel. Voici le code:

        var cl = new HttpClient();
        cl.BaseAddress = new Uri("< YOUR URL >");
        int _TimeoutSec = 90;
        cl.Timeout = new TimeSpan(0, 0, _TimeoutSec);
        string _ContentType = "application/x-www-form-urlencoded";
        cl.DefaultRequestHeaders.Add(key, value);
        cl.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(_ContentType));
        cl.DefaultRequestHeaders.Add("key", "value");
        cl.DefaultRequestHeaders.Add("key", "value");
        var _UserAgent = "d-fens HttpClient";
        cl.DefaultRequestHeaders.Add("User-Agent", _UserAgent);

        var nvc = new List<KeyValuePair<string, string>>();
        nvc.Add(new KeyValuePair<string, string>("key of content", "value"));
        var req = new HttpRequestMessage(HttpMethod.Post, "http://www.t-lab.fr:3000/add_tips") { Content = new FormUrlEncodedContent(nvc) };
        var res = cl.SendAsync(req);
2
Baptiste

Étape 1. Choisissez un type qui dérive de HttpContent . Si vous voulez écrire beaucoup de contenu avec du code d'exécution, vous pouvez utiliser un StreamContent et ouvrir une sorte de StreamWriter dessus. Pour quelque chose de court, utilisez StringContent . Vous pouvez également dériver votre propre classe de contenu personnalisé.

Étape 2. Passez le contenu dans un appel à HttpClient.PostAsync .

Voici un exemple qui utilise StringContent pour passer du JSON:

string json = JsonConvert.SerializeObject(someObject);
var httpContent = new StringContent(json, Encoding.UTF8, "application/json");
var httpResponse = await httpClient.PostAsync("http://www.foo.bar", httpContent);

Voir aussi Comment configurer HttpContent? .

7
John Wu

un peu plus compréhensible

using (var client = new HttpClient())
{
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/x-www-form-urlencoded"));
    client.DefaultRequestHeaders.Add("Accept", "*/*");

    var Parameters = new List<KeyValuePair<string, string>>
    {
        new KeyValuePair<string, string>("Id", "1"),
    };

    var Request = new HttpRequestMessage(HttpMethod.Post, "Post_Url")
    {
        Content = new FormUrlEncodedContent(Parameters)
    };

    var Result = client.SendAsync(Request).Result.Content.ReadAsStringAsync();
}
1
caltunsecen