У нас была такая же проблема с состоянием клиента URL-адреса обратного вызова в Oauth2, поскольку URL-адреса обратного вызова имеют амперсанд и тоже
http://.......?param=123¶m2=456&state=?id=1&name=test
Мы только что преобразовали URL-адрес обратного вызова в строку в кодировке Base64 и декодировали в самой службе.
http://.......?param=123¶m2=456&state=P2lkPTEmbmFtZT10ZXN0
Исправлено:
- Кодировать ваш экземпляр класса как json
- Кодировать json как base64string
- Отправить base64string в URL как параметр данных
- Декодируйте base64 и карту json в вашу модель на вашем API.
JSON:
{ "menu": {
"id": "file",
"value": "File",
"popup": {
"menuitem": [
{"value": "New", "onclick": "CreateNewDoc()"},
{"value": "Open", "onclick": "OpenDoc()"},
{"value": "Close", "onclick": "CloseDoc()"}
]
}
}}
Base64:
eyJtZW51IjogewogICJpZCI6ICJmaWxlIiwKICAidmFsdWUiOiAiRmlsZSIsCiAgInBvcHVwIjogewogICAgIm1lbnVpdGVtIjogWwogICAgICB7InZhbHVlIjogIk5ldyIsICJvbmNsaWNrIjogIkNyZWF0ZU5ld0RvYygpIn0sCiAgICAgIHsidmFsdWUiOiAiT3BlbiIsICJvbmNsaWNrIjogIk9wZW5Eb2MoKSJ9LAogICAgICB7InZhbHVlIjogIkNsb3NlIiwgIm9uY2xpY2siOiAiQ2xvc2VEb2MoKSJ9CiAgICBdCiAgfQp9fQ==
Url:
&data=eyJtZW51IjogewogICJpZCI6ICJmaWxlIiwKICAidmFsdWUiOiAiRmlsZSIsCiAgInBvcHVwIjogewogICAgIm1lbnVpdGVtIjogWwogICAgICB7InZhbHVlIjogIk5ldyIsICJvbmNsaWNrIjogIkNyZWF0ZU5ld0RvYygpIn0sCiAgICAgIHsidmFsdWUiOiAiT3BlbiIsICJvbmNsaWNrIjogIk9wZW5Eb2MoKSJ9LAogICAgICB7InZhbHVlIjogIkNsb3NlIiwgIm9uY2xpY2siOiAiQ2xvc2VEb2MoKSJ9CiAgICBdCiAgfQp9fQ==
Альтернатива:
Если вы должны использовать этот формат запроса, вы также можете использовать типы делегатов
Outer toSerialise = new Outer
{
SomeStringProperty = "MyOuterValue",
SomeClassProperty = new Inner
{
InnerProperty1 = "MyInnerValue1",
InnerProperty2 = "MyInnerValue2"
}
};
var queryObject = new { toSerialise.SomeStringProperty, toSerialise .Inner.InnerProperty1, toSerialise.Inner.InnerProperty2 }