8

我需要HTTP POST一个复杂类型的网络服务(我无法控制)。我相信 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 提出的 这个问题的答案 (他是对第二个答案的第二个评论)。

任何人都可以建议。

4

3 回答 3

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
于 2014-07-30T19:03:31.450 回答
0

由于您几乎已经找到了一个可行的解决方案,所以我会说随它去吧。在扩展方法中组织您的代码,以便您可以使用它发布,例如:

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

您的实现只需要将您的对象序列化为表单编码值,您应该能够通过反射轻松完成。

然后,您可以像调用 JSON 或 XML 一样调用代码。

于 2013-06-20T15:49:23.267 回答
-2

你可以这样做:

var content = new ComplexType("some-username", "some-password", "some-product");

var response = new HttpClient().PostAsync<ComplexType>(url, content, new FormUrlEncodedMediaTypeFormatter()).Result;
于 2015-03-27T12:30:24.267 回答