2016-09-23 2 views
2

내 응용 프로그램이 다음 필드와 함께 작업 부하라는 개체를 관리한다고 가정 해보십시오. 사용자가 레이블별로 작업 부하를 쿼리 할 수 ​​있도록 REST 인터페이스를 공개하려고합니다.필터를 사용하여 쿼리하는 RESTful 방법은 무엇입니까?

"Workload": {"id":"test1", "labels":["A", "B", "C"]} 
"Workload": {"id":"test2", "labels":["A", "C", "D"]} 
"Workload": {"id":"test3", "labels":["A", "B", "D"]} 

질문 : 어떻게 필터로 여러으로 라벨이 것 때문에 쿼리 워크로드를 지원하는 REST 엔드 포인트를 설계합니까?

예제 쿼리 1 : GET "A"와 "B"를 모두 포함한 모든 작업 부하를 원합니다.

동사가 GET이고 끝점이 인 것으로 생각됩니다. 요청 본문으로 {"labels": ["A", "B"]}을 사용하십시오. 하지만 이것은 일을하는 RESTful 방법처럼 보이지 않습니다.

또는 GET /labels/{label-id}/workloads을 할 수 있지만 시간당 하나의 라벨에서만 작동합니다.

예제 쿼리 2 : 나는 GET 라벨 "A"또는 "B"하지만 "C"로 모든 워크로드하는 방법을 전혀 나머지 API는 이런 종류의 작업을 수행하는 다른

실마리 없음 사용자에게 A, B, C를 개별적으로 쿼리하도록 요청한 다음 적절한 설정 작업을 직접 수행 하시겠습니까?

두 번째 쿼리는 tracked as another question

+0

쿼리 매개 변수에 문제가 있다고 생각하지 않습니다. 당신이 그들을 피하기 위해 어떤 이유가 있습니까? – mrmcgreg

+0

쿼리 매개 변수를 반복 할 수 있는지 여부를 의심했습니다.내 응용 프로그램을'golang '에 코딩 할 때, 현재 제 3 자 라이브러리'httprouter' (https://github.com/julienschmidt/httprouter)를 사용하여 매개 변수를 자동으로 구문 분석하는 데 도움을주고 있습니다. 쿼리 매개 변수 ... 'workload/workload_id/labels/: label_id'와 같은 것들 – cookieisaac

답변

1

GET 동사가 몸을 요청할 필요하지 않습니다. 'workload/labels/A, B, C'와 같은 작업을해야합니다. 그러면 A, B, C가 요청 쿼리를 받게됩니다. 요청 쿼리와 구분 된 쉼표로 배열을 만들고 레코드를 찾습니다.

+0

1. [쉼표 URL]을 사용할 수 있습니까? (http://stackoverflow.com/questions/198606/can-i-use-commas- in-a-url). 2. "A '또는'B '레이블이 있지만'C '레이블이없는 작업 부하를 쉼표로 구분 된 목록으로 제공하는 것과 같은 쿼리를 수행하는 방법은 무엇입니까? – cookieisaac

+0

@cookieisaac URL의 쉼표는 서버 측 라우팅 구현에 따라 다릅니다 (예 : 표현할 수있는 node.js에 의해 IIS에 문제가있을 수 있습니다. 먼저 테스트해야합니다. – inf3rno

1

쿼리 매개 변수 its fine ~ repeat them을 사용하십시오. 당신이 ornot 조건이 좋아도 할 수 간단한 경우를 들어

GET /workloads?label=A&label=B&label=C 

.

GET /workloads?or_label=A&or_label=B&label_not=C 
+1

내 상황에는 충분히 좋아 보인다. 내가 미쳐서 'GET/workloads (label = A || label = B) & label! = C'와 같은 것을 할 수 있는지 궁금합니다. 아니면 어쨌든 나는 '(A 또는 B) C가 아님'과 같은 기본적인 논리 연산을 수행 할 수 있습니다. – cookieisaac

+0

새로운 질문으로 게시 해보십시오. 나는 명백한 해결책을 생각할 수 없다. 쿼리를 정의하고 결과를 얻기 위해 (GET/queries/{id}/workloads) –

+0

http://stackoverflow.com/questions/10582066/is-that- query-use-in-query-string –

0

당신은 AB를 포함해야한다는 유일한 제약 여기에 선택의 여지가 있습니다. 일명 - 예를

에 대한
  • /workloads/?label=["A","B"]
  • /workloads/?label[]=A&label[]=B 그래서.
  • /workloads/by/label/A+B/
  • query string array
  • /label/A+B/workloads/

기존 URI 쿼리 규칙 예를 마이크로 소프트 하나로, OData에 대한뿐만 아니라이 있습니다. http://docs.oasis-open.org/odata/odata/v4.0/odata-v4.0-part2-url-conventions.html OData에 익숙하지 않지만 문서에 따라 접근 방법을 따르려면 /WorkloadsByLabels([email protected])[email protected]=["A","B"]과 같은 것을 사용해야합니다. Afaik. 복잡한 URI 필터를 설명하는 표준 솔루션은 없습니다.

+0

그것은 합법적 인 해결책처럼 보입니다. 그러나 나는 결코 어떤 REST도 보지 못했습니다. 그런 식으로 설계된 API ... RESTful 엔드 포인트 또는 대부분 URI 용으로 제공되는 기존 제품입니까? 나는 [IBM Bluemix REST API] (http://ccsapi-doc.mybluemix.net/)와 같은 라인을 따라 생각하고 있었지만 복잡한 쿼리를 지원하지 않는 것 같습니다 ... – cookieisaac

+0

@cookieisaac 표준 솔루션의 경우 URI 템플릿 https://tools.ietf.org/html/rfc6570을 확인해야합니다. 쉼표로 구분 된 항목으로 URI에 추가되는 목록 유형을 정의합니다. 슬프게도 모든 서버가 URI에서 쉼표를 지원하지는 않습니다. IIS에는 문제가 있습니다. Afaik는 주로 검색 키워드를 분리하고 목록 항목을 분리하지 않기 위해 사용되므로 꼭 알아 두어야 할 컨벤션이 아닙니다. 반면 URI 템플릿은 표준이므로 서버가이를 지원할 경우 ID를 쉼표로 구분할 수 있습니다. 쿼리 문자열 배열도 표준입니다. – inf3rno

관련 문제