我需要HTTP POST
一个复杂类型的Web服务(我无法控制)。我相信Web服务是使用旧版本的ASP.NET MVC构建的。它模型绑定格式为form-url-encoded
的有效负载。
如果我在它上面开火,那就完美了。如您所见,我手动创建了一组键/值对。
var values = new List<KeyValuePair<string, string>>
{
new KeyValuePair<string, string>("Username", "some-username"),
new KeyValuePair<string, string>("Password", "some-password"),
new KeyValuePair<string, string>("Product", "some-product")
};
var content = new FormUrlEncodedContent(values);
var response = new HttpClient().PostAsync(url, content).Result;
但我不想这样做,我只想发送复杂的类型。
var content = new ComplexType("some-username", "some-password", "some-product");
var response = new HttpClient().PostAsync(url, content).Result;
我认为曾经有HttpRequestMessage<T>
,但是已经放弃了
HttpClient.PostAsJsonAsync<T>(T value) sends “application/json”
HttpClient.PostAsXmlAsync<T>(T value) sends “application/xml”
但我不想发送Json
或XML
我想发送form-url-ecncoded
,而无需将复杂类型转换为键/值对的集合。
基本上我也想知道Jaans提出的this question答案(他是对第二个答案的第二个评论)。
任何人都可以提出建议。
答案 0 :(得分:1)
Flurl [披露:我是作者]提供了一种似乎正是您正在寻找的方法:
using Flurl.Http;
var resp = await url.PostUrlEncodedAsync(new {
Username = "some-username",
Password = "some-password",
Product = "some-product",
});
Flurl体积小,携带方便,引擎盖下使用HttpClient
。它可以通过NuGet获得:
PM> Install-Package Flurl.Http
答案 1 :(得分:0)
由于你几乎得到了一个可行的解决方案,我只想说它。在扩展方法中组织您的代码,以便您可以使用它来发布,例如:
public static async Task<HttpResponseMessage> PostAsFormUrlEncodedAsync<T>(
this HttpClient httpClient, T value)
{
// Implementation
}
您的实现只需要将对象序列化为表单编码值,您应该可以通过反射轻松完成。
然后,您可以像调用JSON或XML一样调用代码。
答案 2 :(得分:-2)
你可以这样做:
var content = new ComplexType("some-username", "some-password", "some-product");
var response = new HttpClient().PostAsync<ComplexType>(url, content, new FormUrlEncodedMediaTypeFormatter()).Result;