Aufbauend auf dem Vorschlag von @ GWB, a zu verwenden RouteValueDictionary
, habe ich diese rekursive Funktion geschrieben, um verschachtelte anonyme Typen zu unterstützen, wobei diesen verschachtelten Parametern die Schlüssel ihrer Eltern vorangestellt werden.
public static string EncodeHtmlRequestBody(object data, string parent = null) {
var keyValuePairs = new List<string>();
var dict = new RouteValueDictionary(data);
foreach (var pair in dict) {
string key = parent == null ? pair.Key : parent + "." + pair.Key;
var type = pair.Value.GetType();
if (type.IsPrimitive || type == typeof(decimal) || type == typeof(string)) {
keyValuePairs.Add(key + "=" + Uri.EscapeDataString((string)pair.Value).Replace("%20", "+"));
} else {
keyValuePairs.Add(EncodeHtmlRequestBody(pair.Value, key));
}
}
return String.Join("&", keyValuePairs);
}
Anwendungsbeispiel:
var data = new {
apiOperation = "AUTHORIZE",
order = new {
id = "order123",
amount = "101.00",
currency = "AUD"
},
transaction = new {
id = "transaction123"
},
sourceOfFunds = new {
type = "CARD",
provided = new {
card = new {
expiry = new {
month = "1",
year = "20"
},
nameOnCard = "John Smith",
number = "4444333322221111",
securityCode = "123"
}
}
}
};
string encodedData = EncodeHtmlRequestBody(data);
encodedData
wird:
"apiOperation=AUTHORIZE&order.id=order123&order.amount=101.00&order.currency=AUD&transaction.id=transaction123&sourceOfFunds.type=CARD&sourceOfFunds.provided.card.expiry.month=1&sourceOfFunds.provided.card.expiry.year=20&sourceOfFunds.provided.card.nameOnCard=John+Smith&sourceOfFunds.provided.card.number=4444333322221111&sourceOfFunds.provided.card.securityCode=123"
Hoffe das hilft jemand anderem in einer ähnlichen Situation.
Bearbeiten: Wie DrewG betonte, unterstützt dies keine Arrays. Die ordnungsgemäße Implementierung der Unterstützung für beliebig verschachtelte Arrays mit anonymen Typen wäre nicht trivial, und da keine der von mir verwendeten APIs Arrays akzeptiert hat (ich bin nicht sicher, ob es überhaupt eine standardisierte Methode gibt, sie mit Formularcodierung zu serialisieren). Ich überlasse das euch, wenn ihr sie unterstützen müsst.