1

Backbone を使用する Web フロントエンドによって使用される REST API を持つ ASP.NET MVC プロジェクトがあります。機能の 1 つにフリー テキスト検索があり、現在は次のような 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/」もありますが、これは少し冗長に思えます。

したがって、検索 URL は次のようにする必要があると思います。

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
}

注: 検索クエリのメソッド パラメータの名前は、クエリ文字列パラメータの名前を反映するためにからqueryに変更されました。q

検索 URL は次のようになります。

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

REST 呼び出しでクエリ文字列パラメーターを使用することは、私が思っていたほど悪くはないように思えますが、このタイプのシナリオでは受け入れられると思いますが、より良い方法があれば、それを聞きたいです。ありがとう。

于 2012-04-19T18:21:01.157 に答える