1

我们有一个 ASP.NET MVC 项目,它有一个 REST API,由使用 Backbone 的 Web 前端使用。其中一项功能是自由文本搜索,目前使用如下 URL:

http://server/Search/{search-query}/{page-number}/{page-count}

这指向一个像这样的搜索控制器(相应地映射了一个路由):

public JsonResult Search(string query, int page, int pageSize)
{
    // Do search
}

它适用于带有单个单词的简单查询或没有复杂字符(例如test, hello+world)的简单查询,但似乎一些特殊字符(如*,&等)很容易打破这一点,并导致以下错误:

从客户端检测到潜在危险的 Request.Path 值

由于搜索查询是用户通过文本框输入的,因此需要更有弹性地处理包含无效字符的搜索查询。

我尝试使用 对搜索字符串进行编码encodeURIComponent,但似乎并未对所有有问题的字符进行编码。

是否有允许通过 REST API 进行自由文本搜索的推荐方法?任何想法或建议将不胜感激。谢谢。

4

2 回答 2

2

我认为最好将分页参数也放在查询字符串中,而不是放在资源路径中。毕竟它们是搜索相关的,而不是您正在搜索的资源的子资源。还有这个“/Search/Search/”,这似乎有点多余。

所以我认为你的搜索网址应该是:

http://server/Search/?q=hello+world&page=1&page_size=10
于 2012-06-04T13:46:35.377 回答
0

不确定这是否是正确的解决方案,但我最终将搜索查询从 URL 的核心部分中分离出来并将其移动到查询字符串中。所以,REST 调用现在看起来像这样:

http://server/Search/Search/{page-number}/{page-size}/?q={search-query}

这仍然使用相同的控制器:

public JsonResult Search(string q, int page, int pageSize)
{
    // Do search
}

注意:搜索查询的方法参数已从 重命名queryq以反映查询字符串参数的名称。

搜索 URL 现在如下所示:

http://server/Search/Search/1/10/?q=hello+world

听起来在 REST 调用中使用查询字符串参数并没有我想象的那么糟糕,并且在这种情况下是可以接受的,但是如果有更好的做事方式,我仍然想听听。谢谢。

于 2012-04-19T18:21:01.157 回答