如何为我的HttpClient PostAsync第二个参数设置HttpContent?
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”,something =“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 = something”会在api方面作为发布数据“testing”来提取,显然它不会。 另一方面,我可能需要通过发布数据发布整个对象/数组,所以我认为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
这在一些答案中得到了解答。在这个博客文章中 找不到如何使用HttpContent 。
总之,你不能直接设置一个HttpContent
的实例,因为它是一个抽象类 。 你需要根据你的需要使用它派生的类。 最有可能的是StringContent
,它允许您在构造函数中设置响应的string值,编码和媒体types。 请参阅: http : //msdn.microsoft.com/zh-CN/library/system.net.http.stringcontent.aspx
要添加到Preston的答案,这里是标准库中可用的HttpContent
派生类的完整列表:
信用 : https : //pfelix.wordpress.com/2012/01/16/the-new-system-net-http-classes-message-content/
还有一个假定的ObjectContent
但我无法在ASP.NET Core
find它。
当然,你可以用Microsoft.AspNet.WebApi.Client
扩展来跳过整个HttpContent
事情(你现在必须做一个导入来使它在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" });