Post复杂类型格式为表单url编码使用ASP.净HttpClient

本文关键字:ASP HttpClient 编码 url 类型 复杂 格式 表单 Post | 更新日期: 2023-09-27 18:19:09

我需要HTTP POST一个复杂类型的web服务(我不控制)。我相信web服务是使用旧版本的ASP构建的。净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”

但是我不想发送JsonXML,我想发送form-url-ecncoded,而不需要将复杂类型转换为键/值对的集合。

本质上,我也想知道Jaans提出的这个问题的答案(他是第二个答案的第二个评论)。

Post复杂类型格式为表单url编码使用ASP.净HttpClient

Flurl [disclosure: I'm author]提供了一种似乎正是您正在寻找的方法:

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

既然你几乎已经有了一个可行的解决方案,我想说就这么做吧。在扩展方法中组织代码,以便您可以使用该方法发布,例如:

public static async Task<HttpResponseMessage> PostAsFormUrlEncodedAsync<T>(
    this HttpClient httpClient, T value)
{
    // Implementation
}

你的实现只需要将你的对象序列化为形式编码的值,这应该可以很容易地通过反射来完成。

然后你可以像调用JSON或XML一样调用代码

你可以这样做:

var content = new ComplexType("some-username", "some-password", "some-product");
var response = new HttpClient().PostAsync<ComplexType>(url, content, new FormUrlEncodedMediaTypeFormatter()).Result;