2016-01-27 4 views
1

Я использую SoapUI для отправки URI в веб-службу WCF C# (не REST), которая использует десериализатор по умолчанию для DTO, аннотированный DataContract ([DataContract (NameSpace = ") mynamespace ")]C# DataContract Deserialization URI с несколькими ключевыми словами = значениями

URI, может содержать несколько ключ = значение терминов в их компоненте запроса:. Пример: lookfor://3904?foo=this & that&bar=6

  • Если я UrlEncode "этот & что", но не кодировать & между 2 , то я получу объявление ошибка eserialization с сервера из-за некодированного разделителя амперсандов.

  • Если я urlencode весь URI, то оба амперсанда будут закодированы как% 26. Веб-служба не сможет определить, какие амперсанды являются разделителями для ключей = значения и которые являются частями значений, и код не будет работать.

  • Я мог бы потребовать, чтобы амперсанды использовались для разграничения пар значений ключей, которые кодируются как &, а остальные символы получают стандартную кодировку URL lookfor://3904?foo%3Dthis%20%26%20that&bar%3D6. & будет десериализован как амперсанд. Я мог бы отложить urldecoding до тех пор, пока не разделит часть запроса URI с помощью & в качестве разделителя (чтобы получить мои ключевые значения).

Является ли это стандартным профессиональным способом решения этой проблемы? У меня есть googled и googled, и я не могу найти примеров, связанных с URI с несколькими ключевыми значениями.

Альтернативой может быть двойное кодирование амперсандов в значениях и одиночная кодировка амперсандов, которые являются разделителями, но я видел предупреждения (в то время как Google), чтобы никогда не кодировать двойное кодирование.

+0

Вы должны использовать синтаксис уценки, чтобы сделать ваш вопрос легче читать. Текст встроенного окружения с одиночными обратными окнами, \. Например, \ 'code \' будет отображаться как 'code'. Вы можете использовать это для вывода '&' без его экранирования. См. Здесь для получения дополнительной информации: https://daringfireball.net/projects/markdown/syntax – zshift

+0

Как вы объявили параметры своей конечной точки? Вы видели это: https://www.soapui.org/rest-testing/understanding-rest-parameters.html? – SiKing

+0

Это для веб-службы WCF/SOAP, а не службы REST. – Janet

ответ

0

Давайте сломаем его.

Значения у вас есть foo = this&that и .

Первое, что вам нужно сделать, это URL-кодирование значений, поэтому вы получаете foo = this%26that и .

Затем установите эти значения в качестве параметров строки запроса, так как

lookfor://3904?foo=this%26that&bar=6.

Теперь нам нужно перекодирует весь этот URL, что приводит к

lookfor://3904?foo=this%26that&bar=6

+0

Хорошо, это голосование за использование '&' для защиты & delimiters и кодировки URL для всего остального. Удивительно, насколько даже один ответ, подтверждающий, что я не полностью ошибаюсь, уменьшил мой уровень стресса. Спасибо, zshift. – Janet

+0

Я неправильно скорректировал совет ZShifts. Мой комментарий должен был быть «Хорошо, это один голос за использование кодировки URL для значений foo и bar, а затем для кодирования XML всего URI. Удивительно, сколько даже одного ответа, подтверждающего, что я не полностью неправильный путь уменьшил мой уровень стресса. Спасибо, zshift. " – Janet

+0

Джанет, если вы чувствуете, что мой ответ ответил на ваш вопрос соответствующим образом, вы могли бы отметить это как таковое? – zshift

Смежные вопросы