2012-04-19 3 views
1

Backbone을 사용하는 웹 프런트 엔드에서 REST API를 사용하는 ASP.NET MVC 프로젝트가 있습니다.REST API를 사용하여 자유 텍스트 검색을 허용하는 방법은 무엇입니까?

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

(경로가 따라 매핑과)이이 같은 검색 컨트롤러를 가리키는 :

public JsonResult Search(string query, int page, int pageSize) 
{ 
    // Do search 
} 
기능의 조각 중 하나는 현재이 같은 URL을 사용하는 무료 텍스트 검색입니다

단일 단어 또는 복잡한 문자가없는 간단한 쿼리 (예 : test, hello+world)에는 문제가 없지만 *, & 등과 같은 특수 문자가있는 것 같습니다. 다음과 같은 오류가 발생합니다. 검색 쿼리로

A potentially dangerous Request.Path value was detected from the client

는 사용자가 입력 한 텍스트 박스를 통해, 이것은 잘못된 문자가 포함 된 검색 쿼리 처리에 더 탄력적 할 필요가있다.

encodeURIComponent을 사용하여 검색 문자열 인코딩을 시도했지만 문제가되는 문자를 모두 인코딩하지는 않습니다.

REST API를 통해 자유 텍스트 검색을 허용하는 권장 방법이 있습니까? 어떤 생각이나 조언을 주시면 감사하겠습니다. 감사.

답변

2

나는 리소스 경로가 아닌 쿼리 문자열에 페이징 매개 변수를 넣는 것이 더 좋습니다. 결국 그들은 검색에 의존하고 검색하는 리소스의 하위 리소스가 아닙니다.이 "/ Search/Search /"도 약간 중복되어 있습니다.

그래서 나는 당신의 검색 URL이 있어야한다고 생각 :

http://server/Search/?q=hello+world&page=1&page_size=10 
+0

네, 이것은 결국 내가하고 결국 것입니다. – Mun

0

이것이 올바른 해결책인지 확실하지 않지만 URL의 핵심 부분에서 검색 쿼리를 깨고 쿼리 문자열로 옮겨 보았습니다. 그래서, REST 호출은 이제 다음과 같습니다

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

참고 :에 qquery에서 이름이 변경되었습니다 검색 쿼리 방법 매개 변수

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

이 여전히 같은 컨트롤러를 사용 querystring 매개 변수의 이름을 반영하십시오.

는 검색 URL은 이제 다음과 같습니다

그것은 REST 호출에 쿼리 문자열 매개 변수를 사용하여 같은 소리

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

나는 그것이 생각과 같은 나쁜 아니며, 이러한 유형의 시나리오에서 허용 될 수 , 그러나 일을하는 더 좋은 방법이 있다면, 나는 여전히 그것을 듣고 싶습니다. 감사.

관련 문제