2013-06-20 54 views
6

我需要HTTP POST一個複雜的類型到一個Web服務(我不控制)。我相信Web服務是使用ASP.NET MVC的舊版本構建的。它模型綁定格式爲form-url-encoded的有效載荷。Post複雜類型格式化爲使用ASP.Net格式url編碼HttpClient

如果我對它進行如下操作,它可以完美地工作。如您所見,我手動創建了一組鍵/值對。

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構成的this question的答案(他是對第二個答案的第二個評論)。

任何人都可以建議。

+0

的Web API確實有一個'FormUrlEncodedMediaTypeFormatter',但這種格式不能「寫」,只能「讀書」。所以,Web API對此沒有支持。 –

+0

這真是一個恥辱。任何人都知道一個體面的工作? –

+1

你也許可以看看Carlos的自定義格式化程序:http://code.msdn.microsoft.com/windowsdesktop/Converting-between-cda3c9a7,但是這涉及到從JObject轉換到FormUrlEncoded。我不喜歡暗示這一點,但是您可以使用Json.net序列化器將您的複雜類型轉換爲JObject,然後將此JObject轉換爲鏈接中建議的formurlencoded。 –

回答

0

既然你已經有了一個可以工作的解決方案,那麼我就說一下吧。組織代碼的擴展方法裏面,這樣就可以發佈使用,像:

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

你的實現只需要序列化你的對象爲形式編碼的值,你應該能夠使用反射很容易做到。

然後,您可以像使用JSON或XML一樣調用代碼。

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

你可以這樣做:

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

var response = new HttpClient().PostAsync<ComplexType>(url, content, new FormUrlEncodedMediaTypeFormatter()).Result; 
+0

這看起來像我所希望的。我可能是錯的,但當我最初提出這個問題時,我不認爲這個功能是可用的。否則,爲什麼@ToddMenier寫了他的Flurl庫?這就是說,感謝您的回答,這可能會幫助其他人繼續前進。 –

+1

不幸的是,這不起作用,因爲FormUrlEncodedMediaTypeFormatter不能序列化任意類型。您必須使用另一個庫,「FormUrlEncodedContent」或使用反射 – eddiegroves