¿Cómo configuro HttpContent para mi segundo parámetro 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;
}

El PostAsync toma otro parámetro que necesita ser HttpContent.

¿Cómo configuro un HttpContent? No hay documentación en ningún lugar que funcione para Windows Phone 8.

Si lo hago GetAsync, ¡funciona muy bien! pero tiene que ser POST con el contenido de key = "bla", something="yay"

//EDITAR

Muchas Gracias por la respuesta... Esto funciona bien, pero todavía algunas dudas aquí:

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

Los datos "test=something" supuse que recogerían en el lado de la api como post data "test", evidentemente no lo hace. En otro asunto, es posible que necesite publicar objetos/arrays completos a través de post data, por lo que asumo que json será el mejor para hacerlo. ¿Alguna idea sobre cómo obtengo datos de publicaciones?

Tal vez algo como:

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
Author: Abhijeet, 2013-09-24

2 answers

Esto se responde en algunas de las respuestas a No se puede encontrar cómo utilizar HttpContent, así como en este blog post.

En resumen, no puede configurar directamente una instancia de HttpContent porque es una clase abstracta . Necesitas usar una de las clases derivadas de ella dependiendo de tu necesidad. Most likely StringContent, que le permite establecer el valor de cadena de la respuesta, la codificación y el tipo de medio en el constructor. Ver: http://msdn.microsoft.com/en-us/library/system.net.http.stringcontent.aspx

 108
Author: Preston Guillot,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:18:24

Para agregar a la respuesta de Preston, aquí está la lista completa de las clases derivadas HttpContent disponibles en la biblioteca estándar:

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

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

También hay un supuesto ObjectContent pero no pude encontrarlo en ASP.NET Core.

Por supuesto, podrías saltarte todo lo de HttpContent junto con las extensiones Microsoft.AspNet.WebApi.Client (tendrás que hacer una importación para obtenerlo para trabajar en ASP.NET Núcleo por ahora: https://github.com/aspnet/Home/issues/1558 ) y luego puedes hacer cosas como:

var response = await client.PostAsJsonAsync("AddNewArticle", new Post
{
    Title = "New Article Title",
    Body = "New Article Body"
});
 43
Author: Serj Sagan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-21 23:36:28