休息服务用双引号搞乱字符串

时间:2013-05-28 20:11:08

标签: c# rest servicestack

请注意,我的问题类似于this question,但由于我无法弄清楚如何在接受的答案中添加评论以便澄清,我必须创建一个新问题。

我有休息服务,类似于:

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}
});

其中content是raw / unncoded字符串,jQuery将在传递给服务之前执行url编码。该服务应该只返回原始的原始字符串。

2 个答案:

答案 0 :(得分:0)

网络规则说您必须对字符串进行编码以确保它们安全通过。如果您不编码,那么所有各方都不能保证如何读/写数据。

我认为,如果需要对字符串进行编码,那么期望用户需要对其进行编码是完全合理的。

答案 1 :(得分:0)

默认情况下,ServiceStack使用内置的JSV Format解码QueryString / FormData参数,这使得ServiceStack可以对QueryString上的嵌套复杂类型进行反序列化。

问题是"this is a " test不是有效的JSV字符串,因为它包含未转义的保留字符。

要解决此问题,我们现在跳过将字符串属性的JSV值反序列化为seen in this commit,这将在下一版ServiceStack v3.9.48 +中提供。