¿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
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
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/
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"
});
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