2013-05-28 3 views
2

Обратите внимание, что мой вопрос аналогичен this question, но поскольку я не могу понять, как добавить комментарий к принятому ответу с просьбой о разъяснении, мне нужно создать новый вопрос.Rest service messing up strings with double quotes

У меня есть служба отдыха, похожее на это:

namespace My.API 
{ 
    [Route("/event/{Id}", Verbs = "POST")] 
    public class EventRequest 
    { 
     public int Id { get; set; } 
     public string Content { get; set; } 
    } 

    public class EventService : Service 
    { 
     public object Post(EventRequest request) 
     { 
      // Do something with request.Content 
     } 
    } 
} 

Когда я сделать запрос на запись со следующими данными формы:

Content=%22this+is+a+%22+test 

request.Content содержит

this is a " tes 

Обратите внимание, что первая двойная кавычка отсутствует, а t в конце теста отсутствует.

Теперь принятый ответ в другом связанном выше вопросе говорит, что нам нужно кодировать строку, но мне интересно, есть ли способ изменить поведение. Я пытаюсь создать публичный api, и если клиенты api должны кодировать строку определенным образом, я думаю, что это вызовет ошибки. Они должны просто обеспечить нормальную строку.

В основном, следующее JQuery Ajax вызов должен работать:

$.ajax({ 
    url: "api/event/" + id, 
    type: "POST", 
    data: {Content : content} 
}); 

Где содержание сырой/неперекодированной строка, которая JQuery будет выполнять кодирование формы URL-адрес на перед прохождением службы. Служба должна просто вернуть исходную исходную строку.

+0

Я также разместил эту проблему на [github] (https://github.com/ServiceStack/ServiceStack/issues/703) – niltz

ответ

0

По умолчанию ServiceStack декодирует параметры QueryString/FormData с помощью встроенного JSV Format, что позволяет ServiceStack десериализовать вложенные сложные типы в QueryString.

Проблема заключается в том, что "this is a " test не является допустимой строкой JSV, так как содержит зарезервированные символы, которые не экранированы.

Для решения этой проблемы мы теперь пропускаем десериализацию значений JSV для свойств строки как seen in this commit, которые будут доступны в следующей версии ServiceStack v3.9.48 +.

+0

Отлично. Когда это будет выпущено? – niltz

+0

Мы объявляем о новых выпусках в [ServiceStack Google+ Group] (https://plus.google.com/u/0/communities/112445368900682590445). – mythz

0

Правила сети говорят, что вы должны закодировать строки, чтобы обеспечить безопасное прохождение. Если вы не кодируете, то все стороны не могут гарантировать, как читать/записывать данные.

Я думаю, что вполне разумно ожидать, что пользователям потребуется кодировать строки, если они должны быть закодированы.

+0

Почему это когда когда содержимое формы является «Content = this +% 22is + a +%», 22 + test' работает нормально. Моя служба ожидает строку, данные формы содержат строку. В обоих случаях значение содержимого должным образом формируется зашифрованным URL-адресом, но в стеке службы служебной обработки используется разбор/декодирование. Кажется, что стек сервисов ищет «в начале» и делает что-то особенное в этом случае, чего я не хочу. – niltz

+0

Вероятно, с самого начала видна двойная кавычка и предполагается, что ваша строка цитируется с обоих концов. первый символ не является двойной кавычкой, тогда он не выполняет эту обработку. –

+0

Для меня это похоже на ошибку в ServiceStack. Тип содержимого - «application/x-www-form-urlencoded; charset = UTF-8', not 'application/json' или' text/javascript' или какой-либо другой тип, поэтому ServiceStack не должен делать какой-либо странный разбор/десериализация. Он должен просто вставлять значения данных формы в запрос dto, как указано. – niltz