Come posso configurare HttpContent per il mio secondo parametro PostAsync di HttpClient?


261
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 PostAsyncprende un altro parametro che deve essere HttpContent.

Come si configura un HttpContent? Non esiste alcuna documentazione che funzioni per Windows Phone 8.

Se lo faccio GetAsync, funziona benissimo! ma deve essere POST con il contenuto di key = "bla", qualcosa = "yay"

//MODIFICARE

Grazie mille per la risposta ... Funziona bene, ma qui ci sono ancora alcuni dubbi:

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

I dati "test = qualcosa" supponevo che sarebbero stati raccolti dal lato API come post test "test", evidentemente no. Su un altro argomento, potrei aver bisogno di pubblicare interi oggetti / array attraverso i dati di post, quindi presumo che Json sia il migliore per farlo. Qualche idea su come ottengo i dati dei post?

Forse qualcosa del tipo:

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

Risposte:


162

Questa è una risposta in alcune delle risposte a Impossibile trovare come utilizzare HttpContent e in questo post del blog .

In sintesi, non è possibile impostare direttamente un'istanza di HttpContentperché è una classe astratta . È necessario utilizzare una delle classi derivate da essa in base alle proprie esigenze. Molto probabilmente StringContent, che consente di impostare il valore di stringa della risposta, la codifica e il tipo di supporto nel costruttore. Vedi: http://msdn.microsoft.com/en-us/library/system.net.http.stringcontent.aspx


2
Lo controllerò. Penso che quando lo scoprirò, dovrò metterlo da qualche parte dove tutti possono vederlo! Questo mi fa andare avanti da 4 giorni, cercando di ottenere un semplice REST in un'API.
Jimmyt1988,

StringContent ha funzionato alla grande, ma in realtà, PostData non riesce a raggiungere il sito che sto chiamando ora: D.
Modificherò la

2
Una risposta rapida a "come faccio a pubblicare una rappresentanza JSON della mia classe" è "serializzare l'oggetto su JSON, probabilmente con JSON.Net", ma quello appartiene davvero a una domanda separata.
Preston Guillot,

92

Per aggiungere alla risposta di Preston, ecco l'elenco completo delle HttpContentclassi derivate disponibili nella libreria standard:

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

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

C'è anche un supposto ObjectContentma non sono riuscito a trovarlo ASP.NET Core.

Ovviamente, potresti saltare HttpContenttutto insieme alle Microsoft.AspNet.WebApi.Clientestensioni (per ora dovrai fare un'importazione per farlo funzionare in ASP.NET Core: https://github.com/aspnet/Home/issues/1558 ) e quindi puoi fare cose come:

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

3
Risposta più completa .. modo molto pulito e ordinato per raggiungere un compito apparentemente complicato.
Salman,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.