web-dev-qa-db-fra.com

Comment configurer HttpContent pour mon second paramètre HttpClient PostAsync?

public static async Task<string> GetData(string url, string data)
{
    UriBuilder fullUri = new UriBuilder(url);

    if (!string.IsNullOrEmpty(data))
        fullUri.Query = data;

    HttpClient client = new HttpClient();

    HttpResponseMessage response = await client.PostAsync(new Uri(url), /*expects HttpContent*/);

    response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
    response.EnsureSuccessStatusCode();
    string responseBody = await response.Content.ReadAsStringAsync();

    return responseBody;
}

La PostAsync prend un autre paramètre qui doit être HttpContent.

Comment configurer une HttpContent? Il n’existe nulle part de documentation qui fonctionne pour Windows Phone 8.

Si je fais GetAsync, cela fonctionne très bien! mais il doit être POST avec le contenu de key = "bla", quelque chose = "yay"

// EDIT

Merci beaucoup pour la réponse ... Cela fonctionne bien, mais quelques incertitudes ici:

    public static async Task<string> GetData(string url, string data)
    {
        data = "test=something";

        HttpClient client = new HttpClient();
        StringContent queryString = new StringContent(data);

        HttpResponseMessage response = await client.PostAsync(new Uri(url), queryString );

        //response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
        response.EnsureSuccessStatusCode();
        string responseBody = await response.Content.ReadAsStringAsync();

        return responseBody;
    }

Les données "test = quelque chose" que je pensais prendre du côté de l'API comme "test de données", ne le font évidemment pas. Dans un autre ordre d'idées, il se peut que je doive poster des objets/tableaux entiers à l'aide de données post. Je suppose donc que json sera préférable. Des idées sur la façon dont je reçois des données postales?

Peut-être quelque chose comme:

class SomeSubData
{
    public string line1 { get; set; }
    public string line2 { get; set; }
}

class PostData
{
    public string test { get; set; }
    public SomeSubData lines { get; set; }
}

PostData data = new PostData { 
    test = "something",
    lines = new SomeSubData {
        line1 = "a line",
        line2 = "a second line"
    }
}
StringContent queryString = new StringContent(data); // But obviously that won't work
229
Jimmyt1988

Ceci est répondu dans certaines des réponses à Vous ne trouvez pas comment utiliser HttpContent ainsi que dans ce article de blog .

En résumé, vous ne pouvez pas configurer directement une instance de HttpContent car il s'agit d'une classe abstraite . Vous devez utiliser l’une des classes qui en dérivent en fonction de vos besoins. Probablement StringContent, ce qui vous permet de définir la valeur de chaîne de la réponse, l'encodage et le type de support dans le constructeur. Voir: http://msdn.Microsoft.com/en-us/library/system.net.http.stringcontent.aspx

136
Preston Guillot

Pour ajouter à la réponse de Preston, voici la liste complète des classes dérivées HttpContent disponibles dans la bibliothèque standard:

Credit: https://pfelix.wordpress.com/2012/01/16/the-new-system-net-http-classes-message-content/

Crédit : https://pfelix.wordpress.com/2012/01/16/the-new-system-net-http- classes-message-content /

Il y a aussi un supposé ObjectContent mais je n'ai pas pu le trouver dans ASP.NET Core.

Bien sûr, vous pouvez ignorer l'ensemble HttpContent avec les extensions Microsoft.AspNet.WebApi.Client (vous devrez faire une importation pour que cela fonctionne dans ASP.NET Core pour le moment: https : //github.com/aspnet/Home/issues/1558 ) et vous pourrez ensuite faire les choses suivantes:

var response = await client.PostAsJsonAsync("AddNewArticle", new Post
{
    Title = "New Article Title",
    Body = "New Article Body"
});
68
Serj Sagan