Как настроить HttpContent для моего второго параметра 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;
}
PostAsync
принимает другой параметр, который должен быть HttpContent
,
Как мне настроить HttpContent
? Нет нигде документации, которая бы работала для Windows Phone 8.
Если я сделаю GetAsync
, это прекрасно работает! но это должно быть POST с содержимым key="bla", что-то = "yay"
//РЕДАКТИРОВАТЬ
Большое спасибо за ответ... Это хорошо работает, но здесь все еще есть некоторые сомнения:
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;
}
Данные "test= что-то", которые я предположил, будут восприниматься на стороне API как post-data "test", очевидно, это не так. С другой стороны, мне может понадобиться опубликовать целые объекты / массивы с помощью данных публикации, поэтому я предполагаю, что json сделает это лучше всего. Любые мысли о том, как я могу получить данные поста через?
Возможно что-то вроде:
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
3 ответа
Ответы есть в некоторых ответах на Не могу найти, как использовать HttpContent, а также в этом сообщении в блоге.
Таким образом, вы не можете напрямую настроить экземпляр HttpContent
потому что это абстрактный класс. Вам нужно использовать один из классов, полученных из него, в зависимости от ваших потребностей. Более вероятный StringContent
, который позволяет вам установить строковое значение ответа, кодировку и тип медиа в конструкторе. Смотрите: http://msdn.microsoft.com/en-us/library/system.net.http.stringcontent.aspx
Чтобы добавить к ответу Престона, вот полный список HttpContent
Производные классы доступны в стандартной библиотеке:
Предоставлено: https://pfelix.wordpress.com/2012/01/16/the-new-system-net-http-classes-message-content/
Там также предполагается ObjectContent
но я не смог найти его в ASP.NET Core
,
Конечно, вы можете пропустить весь HttpContent
вещь все вместе с Microsoft.AspNet.WebApi.Client
расширения (сейчас вам придется выполнить импорт, чтобы заставить его работать в ASP.NET Core: https://github.com/aspnet/Home/issues/1558), а затем вы можете делать такие вещи, как:
var response = await client.PostAsJsonAsync("AddNewArticle", new Post
{
Title = "New Article Title",
Body = "New Article Body"
});
public async Task<ActionResult> Index()
{
apiTable table = new apiTable();
table.Name = "Asma Nadeem";
table.Roll = "6655";
string str = "";
string str2 = "";
HttpClient client = new HttpClient();
string json = JsonConvert.SerializeObject(table);
StringContent httpContent = new StringContent(json, System.Text.Encoding.UTF8, "application/json");
var response = await client.PostAsync("http://YourSite.com/api/apiTables", httpContent);
str = "" + response.Content + " : " + response.StatusCode;
if (response.IsSuccessStatusCode)
{
str2 = "Data Posted";
}
return View();
}