Wie richte ich HttpContent für meinen zweiten HttpClient PostAsync-Parameter ein?

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

Das PostAsyncnimmt einen anderen Parameter, der sein muss HttpContent.

Wie richte ich ein ein HttpContent? Es gibt nirgendwo eine Dokumentation, die für Windows Phone 8 funktioniert.

Wenn ich das tue GetAsync, funktioniert es großartig! aber es muss POST mit dem Inhalt von key = "bla", etwas = "yay" sein.

//BEARBEITEN

Vielen Dank für die Antwort ... Das funktioniert gut, aber hier noch ein paar Unsicherheiten:

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

Die Daten "Test = etwas", von denen ich angenommen habe, dass sie auf der API-Seite als Post-Daten "Test" aufgenommen werden, sind dies offensichtlich nicht. In einem anderen Fall muss ich möglicherweise ganze Objekte / Arrays über Post-Daten veröffentlichen, daher gehe ich davon aus, dass json dies am besten tut. Irgendwelche Gedanken darüber, wie ich Post-Daten durch bekomme?

Vielleicht so etwas wie:

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
Jimmyt1988
quelle

Antworten:

162

Dies wird in einigen Antworten auf Kann nicht finden, wie man HttpContent verwendet , sowie in diesem Blog-Beitrag beantwortet .

Zusammenfassend kann eine Instanz von nicht direkt eingerichtet werden, HttpContentda es sich um eine abstrakte Klasse handelt . Sie müssen je nach Bedarf eine der daraus abgeleiteten Klassen verwenden. Höchstwahrscheinlich StringContentkönnen Sie damit den Zeichenfolgenwert der Antwort, die Codierung und den Medientyp im Konstruktor festlegen. Siehe: http://msdn.microsoft.com/en-us/library/system.net.http.stringcontent.aspx

Preston Guillot
quelle
2
Ich werde das überprüfen. Ich denke, wenn ich das herausfinde, muss ich das irgendwo hinstellen, wo jeder es sehen kann! Ich habe jetzt 4 Tage lang versucht, eine einfache REST für eine API zu erhalten.
Jimmyt1988
Der StringContent hat großartig funktioniert, kann aber die PostData nicht dazu bringen, zu der Site zu gelangen, die ich gerade anrufe: D. Ich werde die Frage bearbeiten, um Ihnen zu zeigen, was ich jetzt habe
Jimmyt1988
2
Eine schnelle Antwort auf "Wie poste ich eine JSON-Darstellung meiner Klasse?" Lautet "Serialisieren Sie das Objekt in JSON, wahrscheinlich mit JSON.Net", aber das gehört wirklich in eine separate Frage.
Preston Guillot
92

Um Prestons Antwort zu ergänzen, finden Sie hier die vollständige Liste der HttpContentabgeleiteten Klassen, die in der Standardbibliothek verfügbar sind:

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

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

Es gibt auch eine angebliche, ObjectContentaber ich konnte es nicht finden ASP.NET Core.

Natürlich können Sie das Ganze HttpContentzusammen mit Microsoft.AspNet.WebApi.ClientErweiterungen überspringen (Sie müssen einen Import durchführen, damit es vorerst in ASP.NET Core funktioniert: https://github.com/aspnet/Home/issues/1558 ) und dann können Sie Dinge tun wie:

var response = await client.PostAsJsonAsync("AddNewArticle", new Article
{
    Title = "New Article Title",
    Body = "New Article Body"
});
Serj Sagan
quelle
3
Umfassendste Antwort .. sehr ordentlicher und sauberer Weg, um scheinbar komplizierte Aufgaben zu erfüllen.
Salman