我正在使用System.Net.Http
,我在网上找到了几个例子。我设法创建了下面的代码来发出POST
请求:
public static string POST(string resource, string token)
{
using (var client = new HttpClient())
{
client.BaseAddress = new Uri(baseUri);
client.DefaultRequestHeaders.Add("token", token);
var content = new FormUrlEncodedContent(new[]
{
new KeyValuePair<string, string>("", "")
});
var result = client.PostAsync("", content).Result;
string resultContent = result.Content.ReadAsStringAsync().Result;
return resultContent;
}
}
但是假设我想传递第三个参数给POST
方法,这个参数叫做data
,data参数是这样的对象:
object data = new
{
name = "Foo",
category = "article"
};
不创建KeyValuePair
我怎么能做到这一点呢?我的php RestAPI
等待一个json输入,所以FormUrlEncodedContent
应该正确发送raw
json。但是我怎么能用Microsoft.Net.Http
做到这一点呢?谢谢。
8条答案
按热度按时间xqk2d5yq1#
你的问题的直接答案是:否。
PostAsync
方法的签章如下:公共任务PostAsync(URI请求URI,HttpContent内容)
因此,虽然可以将
object
传递给PostAsync
,但它必须是HttpContent
类型,而您的匿名类型不符合该条件。然而,有很多方法可以实现你想要的目标。首先,你需要将匿名类型序列化为JSON,最常用的工具是Json.NET。实现这一点的代码非常简单:
接下来,您将需要构造一个内容对象来发送此数据,我将使用一个
ByteArrayContent
对象,但如果需要,您可以使用或创建一个不同的类型。接下来,您需要设置内容类型,让API知道这是JSON。
然后,您可以发送与上一个示例非常类似的请求,表单内容如下:
顺便说一句,像这里这样调用
.Result
属性可能会有一些bad side effects,比如死锁,所以要小心。5lhxktic2#
您需要在请求主体中以原始字符串而不是
FormUrlEncodedContent
的形式传递数据。现在您需要做的就是将字符串传递给post方法。
4uqofj5v3#
新的.NET 5+解决方案:
在.NET 5中,引入了一个名为
JsonContent
的新类,它派生自HttpContent
。See in Microsoft docs该类包含一个名为
Create()
的静态方法,该方法接受任意对象作为参数,并且顾名思义,返回JsonContent
的示例,然后可以将该示例作为参数传递给PostAsync
方法。用法:
更棒的是,您实际上可以使用新的
PostAsJsonAsync
扩展方法使其更加简洁-请参阅the docs for this。用法:感谢@charlesthyer和@KonradViltersten指出这一点。
35g0bw714#
一个简单的解决方案是从NuGet使用
Microsoft ASP.NET Web API 2.2 Client
。然后,您可以简单地执行此操作,它会将对象序列化为JSON,并将
Content-Type
头设置为application/json; charset=utf-8
:rmbxnbpk5#
现在有一种更简单的方法来处理
.NET Standard
或.NET Core
:**注意:**为了使用
JsonMediaTypeFormatter
类,您需要安装Microsoft.AspNet.WebApi.Client
NuGet包,该包可以直接安装,也可以通过Microsoft.AspNetCore.App
之类得另一个包安装.使用
HttpClient.PostAsync
的这个签名,你可以传入任何对象,JsonMediaTypeFormatter
将自动处理序列化等。对于响应,可以使用
HttpContent.ReadAsAsync<T>
将响应内容反序列化为所需的类型:06odsfpq6#
@arad说得不错.其实我刚刚发现了这个扩展方法(.NET 5.0):
PostAsJsonAsync<TValue>(HttpClient, String, TValue, CancellationToken)
从https://learn.microsoft.com/en-us/dotnet/api/system.net.http.json.httpclientjsonextensions.postasjsonasync?view=net-5.0开始
因此,现在可以:
mm5n2pyu7#
您有两种选择,这取决于您编写的框架,如果您使用的是.Net 5,则可以只编写
JsonContent.Create(yourObject);
或者创建一个扩展方法并在对象上调用它:
pexxcrt28#
在我的另一种形式