2013-06-20 2 views
6

Ich brauche HTTP POST einen komplexen Typ zu einem Web-Service (die ich nicht kontrolliere). Ich glaube, der Webdienst wurde mit einer älteren Version von ASP.NET MVC erstellt. Das Modell bindet Nutzdaten, die als form-url-encoded formatiert sind.Post komplexen Typ formatiert als Form-URL-codiert mit ASP.Net HttpClient

Wenn ich folgendes feuere, funktioniert es perfekt. Wie Sie sehen können, habe ich manuell eine Sammlung von Schlüssel/Wert-Paaren erstellt.

Aber ich möchte dies nicht tun, ich möchte nur komplexe Typen senden, wenn ich kann.

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

var response = new HttpClient().PostAsync(url, content).Result; 

ich dort ein HttpRequestMessage<T> zu sein glauben verwendet, aber das ist für

HttpClient.PostAsJsonAsync<T>(T value) sends “application/json” HttpClient.PostAsXmlAsync<T>(T value) sends “application/xml”

fallen gelassen worden, aber ich will nicht Json oder XML ich form-url-ecncoded ohne lästiges senden möchten senden Konvertieren von komplexen Typen in Sammlungen von Schlüssel/Wert-Paaren.

Im Wesentlichen möchte ich auch die Antwort auf this question wissen, die Jaans stellt (Sein ist der zweite Kommentar zur zweiten Antwort).

Kann jemand bitte beraten.

+0

Web API hat eine 'FormUrlEncodedMediaTypeFormatter', aber dieser Formatierer kann nicht "schreiben" und nur "lesen" kann. Daher bietet die Web-API keine Unterstützung für diese Funktion. –

+0

Das ist eine echte Schande. Wer kennt eine gute Arbeit? –

+1

Sie können wahrscheinlich einen benutzerdefinierten Formatierer von Carlos betrachten: http://code.msdn.microsoft.com/windowsdesktop/Converting-between-cda3c9a7, aber das bezieht sich auf die Konvertierung von JObject zu FormUrlEncoded. Ich mag es nicht, dies vorzuschlagen, aber Sie können wahrscheinlich Ihren komplexen Typ in ein JObject mit Json.net Serializer konvertieren und dann dieses JObject in formurlencoded konvertieren, wie im Link vorgeschlagen. –

Antwort

0

Da Sie fast eine Lösung haben, die funktioniert, würde ich sagen, gehen Sie einfach damit. Organisieren Sie Ihren Code innerhalb einer Verlängerung Methode, so dass Sie Beiträge verfassen können, dass die Verwendung, so etwas wie:

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

Ihre Implementierung muss nur Ihr Objekt in Form kodierte Werte serialisiert, die Sie sollten leicht mit Reflexion der Lage zu tun.

Dann können Sie den Code genau wie für JSON oder XML aufrufen.

1

Flurl [Offenlegung: Ich bin der Autor] liefert ein Verfahren, das genau zu sein scheint, was Sie suchen:

using Flurl.Http; 

var resp = await url.PostUrlEncodedAsync(new { 
    Username = "some-username", 
    Password = "some-password", 
    Product = "some-product", 
}); 

Flurl ist klein und handlich und verwendet HttpClient unter der Haube. Es ist über NuGet verfügbar:

PM> Install-Package Flurl.Http 
-1

Sie können dies tun:

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

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

Das sieht genau so aus, wie ich es mir erhofft hatte. Ich könnte mich irren, aber ich denke nicht, dass diese Funktionalität verfügbar war, als ich die Frage ursprünglich gestellt habe. Warum hätte @ToddMenier seine Flurl-Bibliothek geschrieben?Das heißt, danke für deine Antwort, es kann anderen helfen vorwärts zu gehen. –

+1

Leider funktioniert das nicht, da 'FormUrlEncodedMediaTypeFormatter' keine beliebigen Typen serialisiert. Sie müssen entweder eine andere Bibliothek verwenden, 'FormUrlEncodedContent' oder Reflektion verwenden – eddiegroves

Verwandte Themen