내 대답을 읽기 전에 @Neil에 동의했다고 말하고 싶습니다. 우리는 전투를 선택해야합니다. 우리는 보통 최선을 다하기를 원하지만 때로는 토론 할 여지가 너무 적으며 우리의 의지에 반하여 결정을 내려야합니다.
어쨌든, 닐의 대답에서 한 가지 더보고 싶습니다. 문서 . POST 요청 /search
이 안전하다는 것을 개발자에게 알리기 위해 .
그렇습니다.
1. 기회를 줘
GET
옵션을 먼저 고려하십시오 . 이 질문 URL의 최대 길이를 확인하십시오 . 가장 긴 쿼리 문자열이 2000자를 초과하는지 평가하십시오. 그렇지 않은 것으로 예상되지 않으면로 이동하십시오 GET
. 그것은 추악하게 보일지 모르지만 적어도 URL을 북마크 할 수 있으며 물론 메소드 의미론 (idempotence, safe and caching)의 의미에서 파생 된 모든 장점이 있습니다.
1.1 쿼리 문자열을 인코딩하십시오
예를 들어, base 64에서 . javascript에서도 base 64 인코딩을 지원합니다 .
이것이 작동하는 방식입니다.
- 모든 필터로 JSON을 빌드하고 정규화하십시오.
- 문자열로 파싱
- 그것을 인코딩
- 인코딩 된 JSON을 요청 매개 변수 (
/search?q=SGVsbG8gV29ybGQh....
) 로 보냅니다 .
- 서버 측에서 매개 변수 q를 디코딩하십시오 .
- JSON 문자열을 역 직렬화
이전에는 가능한 가장 긴 JSON 문자열을 만들고 인코딩하여 길이를 가져옵니다. 인코딩 된 문자열이 URL에 맞는지 평가하십시오. 테스트를 위해 Fiddle.js 에 다음 스 니펫을 구현했습니다 . (나는 여전히 작동 희망) 1
Base 64 인코딩은 결정적이고 가역적이므로 충돌 가능성이 없습니다.
인코딩 된 쿼리를 사용하면 DB에 검색을 저장하고 URL을 북마크에 추가하고 링크를 공유하는 등의 작업을 수행 할 수 있습니다. 물론 문자열을 이스케이프 / 이스케이프 할 필요도 없습니다.
1.2 별칭으로 시도
REST API를 디자인하는 방법에 대한 이 블로그 를 읽으 면서 한 가지 대안을 더 기억했습니다. 일반적인 쿼리의 별칭 .
다음과 같은 이유로 이것들이 흥미로워집니다
쿼리 문자열 길이를 줄이십시오. API를 더 깨끗하고 사용자 친화적으로 만듭니다.
GET / tickets /? status = closed & closedAt = xxx 대
GET / tickets / 최근 폐쇄 /
더 많은 별칭 또는 더 많은 요청 매개 변수와 결합 할 수 있습니다.
GET / tickets /? status = closed & closedAt = xxx & within = 30 분 vs
GET / tickets / 최근 폐쇄 /? with == 30 분
별칭을 인코딩 된 쿼리 문자열과 결합 할 수 있습니다
GET / tickets /? status = closed & closedAt = xxx & in = 30 분 vs
GET / tickets / 최근 폐쇄 /? q = SGVsbG8g ...
1 : JSON을 사용했지만 서버 측에서 직렬화를 해제하는 즉시 다른 형식을 사용할 수 있습니다.
search?q=t
,search?q=te
,search?q=test
, 등. 서버가 손상되지 않도록 쿼리 전송 빈도를 제한하십시오. 또는 많은 양의 정보를 반환하고 클라이언트 측에서 필터링을 수행 할 수도 있습니다. 사용자가 사물을 크게 좁힐 수있는 넓은 범주를 입력하면 잘 작동합니다.