C# 如何为我的 HttpClient PostAsync 第二个参数设置 HttpContent?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/18971510/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How do I set up HttpContent for my HttpClient PostAsync second parameter?
提问by Jimmyt1988
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;
}
The PostAsync
takes another parameter that needs to be HttpContent
.
在PostAsync
另需参数需要进行HttpContent
。
How do I set up an HttpContent
? There Is no documentation anywhere that works for Windows Phone 8.
我该如何设置HttpContent
?任何地方都没有适用于 Windows Phone 8 的文档。
If I do GetAsync
, it works great! but it needs to be POST with the content of key="bla", something="yay"
如果我这样做GetAsync
,效果很好!但它需要使用 key="bla", something="yay" 的内容进行 POST
//EDIT
//编辑
Thanks so much for the answer... This works well, but still a few unsures here:
非常感谢您的回答......这很好用,但这里仍然有一些不确定:
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;
}
The data "test=something" I assumed would pick up on the api side as post data "test", evidently it does not. On another matter, I may need to post entire objects/arrays through post data, so I assume json will be best to do so. Any thoughts on how I get post data through?
我认为数据“test=something”会在 api 端作为发布数据“test”获取,显然它不会。另一方面,我可能需要通过发布数据发布整个对象/数组,所以我认为 json 最好这样做。关于如何获取发布数据的任何想法?
Perhaps something like:
也许是这样的:
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
采纳答案by Preston Guillot
This is answered in some of the answers to Can't find how to use HttpContentas well as in this blog post.
这在Can't find how to use HttpContent以及这篇博文 的一些答案中得到了解答。
In summary, you can't directly set up an instance of HttpContent
because it is an abstract class. You need to use one the classes derived from it depending on your need. Most likely StringContent
, which lets you set the string value of the response, the encoding, and the media type in the constructor. See: http://msdn.microsoft.com/en-us/library/system.net.http.stringcontent.aspx
总之,你不能直接设置实例,HttpContent
因为它是一个抽象类。您需要根据需要使用从它派生的类之一。最有可能StringContent
,它允许您在构造函数中设置响应的字符串值、编码和媒体类型。请参阅:http: //msdn.microsoft.com/en-us/library/system.net.http.stringcontent.aspx
回答by Serj Sagan
To add to Preston's answer, here's the complete list of the HttpContent
derived classes available in the standard library:
要添加到 Preston 的答案,以下HttpContent
是标准库中可用的派生类的完整列表:
Credit: https://pfelix.wordpress.com/2012/01/16/the-new-system-net-http-classes-message-content/
信用:https: //pfelix.wordpress.com/2012/01/16/the-new-system-net-http-classes-message-content/
There's also a supposed ObjectContent
but I was unable to find it in ASP.NET Core
.
还有一个假设,ObjectContent
但我无法在ASP.NET Core
.
Of course, you could skip the whole HttpContent
thing all together with Microsoft.AspNet.WebApi.Client
extensions (you'll have to do an import to get it to work in ASP.NET Core for now: https://github.com/aspnet/Home/issues/1558) and then you can do things like:
当然,您可以跳过整个过程HttpContent
以及Microsoft.AspNet.WebApi.Client
扩展(您必须先进行导入才能使其在 ASP.NET Core 中运行:https: //github.com/aspnet/Home/issues/1558) 然后您可以执行以下操作:
var response = await client.PostAsJsonAsync("AddNewArticle", new Article
{
Title = "New Article Title",
Body = "New Article Body"
});