동사없이 REST URL을 작성하는 방법은 무엇입니까?
편안한 URL을 디자인하는 방법을 결정하기 위해 고심하고 있습니다. 나는 명사와 함께 URL을 사용하는 평온한 접근 방식을 사용하고 동사는 이것을 수행하는 방법을 이해하지 못합니다.
우리는 재무 계산기를 구현하는 서비스를 만들고 있습니다. 계산기는 CSV 파일을 통해 업로드 할 여러 매개 변수를 사용합니다. 사용 사례에는 다음이 포함됩니다.
- 새 매개 변수 업로드
- 최신 매개 변수 얻기
- 주어진 영업일에 대한 매개 변수 얻기
- 매개 변수 세트를 활성화하십시오.
- 매개 변수 세트 확인
나는 다음과 같은 유형의 URL을 갖는 것이 편한 방법을 모은다.
/parameters
/parameters/12-23-2009
다음을 사용하여 처음 세 가지 사용 사례를 달성 할 수 있습니다.
- 게시 요청에 매개 변수 파일을 포함하는 POST
- 첫 URL의 GET
- 두 번째 URL의 GET
그러나 동사없이 네 번째와 다섯 번째 사용 사례를 어떻게 수행합니까? 다음과 같은 URL이 필요하지 않습니까?
/parameters/ID/activate
/parameters/ID/validate
??
아마도 다음과 같습니다.
PUT /parameters/activation HTTP/1.1
Content-Type: application/json; encoding=UTF-8
Content-Length: 18
{ "active": true }
올바른 URI 디자인을위한 일반 원칙 :
- 상태를 변경하기 위해 쿼리 매개 변수를 사용 하지 마십시오
- 도움이 될 수 있으면 대소 문자를 혼용 하지 마십시오 . 소문자가 가장 좋습니다
- URI에 구현 별 확장을 사용 하지 마십시오 (.php, .py, .pl 등).
- URI 로 RPC에 빠지지 마십시오.
- 마 가능한 한 당신의 URI 공간을 제한
- 마 짧은 킵 경로 세그먼트
- 음주 중 하나를 선호
/resource
하거나/resource/
; 사용하지 않는 301 리디렉션을 만듭니다. - 수행 자원의 하위 선택을 위해 사용 쿼리 매개 변수; 즉 페이지 매김, 검색어
- 음주 는 HTTP 헤더 또는 본문에 있어야 URI의 이사 물건
(참고 : "RESTful URI 디자인"이라고 말하지 않았습니다. URI는 본질적으로 REST에서 불투명합니다.)
HTTP 메소드 선택의 일반 원칙 :
- 상태를 변경하기 위해 GET을 사용 하지 마십시오 . Googlebot이 하루를 망칠 수있는 좋은 방법입니다.
- 전체 리소스를 업데이트하지 않는 한 PUT을 사용 하지 마십시오
- 동일한 URI에서 합법적으로 GET을 수행 할 수 없다면 PUT을 사용 하지 마십시오.
- 오래 지속되거나 캐시하기에 합당한 정보를 검색하기 위해 POST를 사용 하지 마십시오
- PUT과 dem 등성이 아닌 작업을 수행 하지 마십시오
- 수행 가능한 위해 사용 GET을
- 확실하지 않은 경우 PUT에 우선하여 POST를 사용하십시오.
- 수행 하면 RPC-같은 느낌이 뭔가를해야 할 때마다 사용 POST를
- 수행 크거나 계층되는 자원의 클래스를 사용 PUT을
- 마 제거 리소스에 POST에 우선하여 DELETE 사용
- 입력이 크지 않은 경우 POST와 같이 계산과 같은 작업 에는 GET을 사용하십시오.
HTTP를 사용한 웹 서비스 디자인의 일반 원칙 :
- 헤더에 있어야하는 응답 본문에 메타 데이터를 넣지 마십시오.
- 메타 데이터를 포함하지 않으면 별도의 리소스에 메타 데이터를 넣지 마십시오.
- 마 적절한 상태 코드를 사용
201 Created
자원을 만든 후; 응답이 전송 될 때 자원 이 존재 해야 합니다.202 Accepted
작업을 성공적으로 수행하거나 비동기 적으로 리소스를 생성 한 후400 Bad Request
누군가가 명백하게 가짜 인 데이터를 조작 할 때; 응용 프로그램의 경우 유효성 검사 오류 일 수 있습니다. 잡히지 않은 예외에 대해 일반적으로 500을 예약합니다401 Unauthorized
필요한Authorization
헤더 를 제공하지 않고 누군가가 API에 액세스 하거나 내부의 자격 증명Authorization
이 유효하지 않은 경우Authorization
헤더 를 통해 자격 증명을 기대하지 않으면이 응답 코드를 사용하지 마십시오 .403 Forbidden
누군가 악의적이거나 권한이없는 방식으로 API에 액세스하는 경우405 Method Not Allowed
누군가 PUT을 사용해야했을 때 POST를 사용하는 경우413 Request Entity Too Large
누군가 허용 할 수없는 큰 파일을 보내려고 할 때418 I'm a teapot
주전자로 커피를 추출하려고 할 때
- 가능 하면 캐싱 헤더를 사용하십시오.
ETag
리소스를 해시 값으로 쉽게 줄일 수있는 경우 헤더가 좋습니다.Last-Modified
리소스가 업데이트 될 때의 타임 스탬프를 유지하는 것이 좋습니다.Cache-Control
및Expires
합리적인 값을 제공해야
- 수행 요청에 헤더를 캐싱 명예를 당신이 할 수있는 모든 것을 (
If-None-Modified
,If-Modified-Since
) - 마 사용 리디렉션 그들은 감각을 할 때, 그러나 이들은 웹 서비스에 대한 드문해야한다
특정 질문과 관련하여 POST는 # 4 및 # 5에 사용해야합니다. 이러한 작업은 위의 "RPC 유사"지침에 해당합니다. # 5의 경우 POST에서 반드시을 사용할 필요는 없습니다 Content-Type: application/x-www-form-urlencoded
. JSON 또는 CSV 페이로드와 마찬가지로 쉽게 사용할 수 있습니다.
새로운 동사가 필요할 때마다 그 동사를 명사로 바꾸는 것을 생각하십시오. 예를 들어 'activate'를 'activation'으로, 'validate'를 'validation'으로 바꾸십시오.
그러나 당신이 작성한 것에서 나는 당신의 응용 프로그램에 훨씬 더 큰 문제가 있다고 말하고 싶습니다.
'파라미터'라는 자원이 제안 될 때마다 모든 프로젝트 팀원의 마음에 적신호를 보내야합니다. 'parameter'는 문자 그대로 모든 리소스에 적용 할 수 있습니다. 구체적이지 않습니다.
'파라미터'는 정확히 무엇을 나타 냅니까? 아마도 여러 가지 다른 것들이 있으며, 각각에는 별도의 리소스가 필요합니다.
이것을 얻는 또 다른 방법-최종 사용자 (프로그래밍에 대해 거의 알지 못하는 사람)와 응용 프로그램을 논의 할 때 반복적으로 사용하는 단어는 무엇입니까?
그것들은 당신이 응용 프로그램을 디자인해야 할 단어입니다.
아직 잠재 사용자와이 변환을하지 않은 경우 지금 당장 모든 것을 중지하고 그렇게 할 때까지 다른 코드 줄을 작성하지 마십시오! 그래야만 팀이 구축해야 할 것에 대한 아이디어를 얻게됩니다.
금융 소프트웨어에 대해서는 아무것도 모르지만 추측해야 할 경우 일부 리소스는 "Report", "Payment", "Transfer"및 "Currency"와 같은 이름으로 갈 수 있습니다.
소프트웨어 디자인 프로세스의이 부분에 대한 많은 좋은 책들이 있습니다. 추천 할 수있는 두 가지는 도메인 기반 설계 및 분석 패턴 입니다.
URL 디자인은 응용 프로그램이 RESTful인지 여부와 관련이 없습니다. 따라서 "RESTful URLs"라는 문구는 의미가 없습니다.
REST가 실제로 무엇인지 좀 더 읽어야한다고 생각합니다. REST는 URL을 불투명하게 처리하므로 동사, 명사 등이 있는지 여부를 알 수 없습니다. 여전히 URL을 디자인하고 싶을 수도 있지만 REST가 아닌 UI에 관한 것입니다.
즉, 귀하의 질문에합시다 : 마지막 두 경우는 RESTful하지 않으며 어떤 종류의 편안한 체계에도 적합하지 않습니다. 그것들을 RPC라고 부릅니다. REST에 대해 진지한 경우, 애플리케이션이 처음부터 어떻게 작동하는지 다시 생각해야합니다. REST를 포기하거나 RPC 앱으로 앱을 수행하십시오.
흠.
여기서 아이디어는 모든 것을 리소스로 취급해야하므로 매개 변수 집합에서 참조 할 수있는 URL이 있으면 다음을 추가하면됩니다.
GET [parametersurl]/validationresults
POST [paramatersurl]
body: {command:"activate"}
그러나 다시 활성화하는 것은 REST가 아닌 RPC입니다.
활성화 및 유효성 검사 요구 사항은 리소스 상태를 변경하려고하는 상황입니다. 주문을 "완료"하거나 다른 요청을 "제출"하는 것은 다르지 않습니다. 이러한 종류의 상태 변경을 모델링하는 방법에는 여러 가지가 있지만, 자주 작동하는 것으로 확인되는 방법은 동일한 상태의 리소스에 대한 수집 리소스를 만든 다음 컬렉션간에 리소스를 이동하여 상태에 영향을주는 것입니다.
예를 들어,
/ActiveParameters
/ValidatedParameters
매개 변수 집합을 활성화하려면 해당 매개 변수 집합을 ActiveParameters 컬렉션에 추가하십시오. 다음과 같이 매개 변수 집합을 엔터티 본문으로 전달하거나 url을 쿼리 매개 변수로 전달할 수 있습니다.
POST /ActiveParameters?parameter=/Parameters/{Id}
/ ValidatedParameters를 사용하여 동일한 작업을 수행 할 수 있습니다. 매개 변수가 유효하지 않으면 서버는 요청에 "잘못된 요청"을 반환하여 유효성 검사 된 매개 변수 컬렉션에 매개 변수를 추가 할 수 있습니다.
다음과 같은 메타 리소스 및 방법을 제안합니다.
매개 변수를 활성화 및 / 또는 확인하십시오.
> PUT /parameters/<id>/meta HTTP/1.1
> Host: example.com
> Content-Type: application/json
> Connection: close
>
> {'active': true, 'require-valid': true}
>
< HTTP/1.1 200 OK
< Connection: close
<
매개 변수가 활성화되어 있고 유효한지 확인하십시오.
> GET /parameters/<id>/meta HTTP/1.1
> Host: example.com
> Connection: close
>
< HTTP/1.1 200 OK
< Content-Type: application/json
< Connection: close
<
< {
< 'active': true,
< 'require-valid': true,
< 'valid': {'status': false, 'reason': '...'}
< }
<
편집 : 실제로 URI는 GET
요청이 dem 등원을 유지 하지 못하게 합니다.
그러나 유효성 검증의 경우, 요청의 유효성을 알리기 위해 HTTP 상태 코드를 사용하면 (새로 작성하거나 기존 '매개 변수'를 수정) Restful 모델에 적합합니다.
A를 보고서 다시 400 Bad Request
제출 된 데이터가있는 경우 상태 코드 / 유효하지 않으며 요청이 (다시 제출하기 전에 변경해야합니다 HTTP / 1.1 상태 코드 ).
이것은 유스 케이스 에서처럼 연기하는 것이 아니라 제출시 유효성 검증에 의존합니다. 다른 답변에는 해당 시나리오에 적합한 솔루션이 있습니다.
REST 환경에서 각 URL은 고유 한 자원입니다. 당신의 자원은 무엇입니까? 재무 계산기에는 실제로 명백한 자원이 없습니다. 매개 변수를 호출하고 자원을 끌어 내야합니다. 예를 들어, 대출에 대한 할부 상환 일정은 자원 일 수 있습니다. 달력의 URL에는 시작 날짜, 기간 (개월 또는 연도), 기간 (이자가 복리되는 경우), 이자율 및 초기 원칙이 포함될 수 있습니다. 이러한 모든 값을 사용하면 특정 지불 일정이 있습니다.
http://example.com/amort_cal/2009-10-20/30yrsfixed/monthly/5.00/200000
지금, 나는 당신이 무엇을 계산하는지 모르지만 매개 변수 목록의 개념은 RESTful로 들리지 않습니다. 다른 사람이 말했듯이 귀하의 요구 사항은 XMLRPC보다 높습니다. REST를 시도하는 경우 명사가 필요합니다. 계산은 명사가 아니라 명사에 사용되는 동사입니다. 당신의 종아리에서 명사를 꺼내려면 그것을 돌려야합니다.
참고 URL : https://stackoverflow.com/questions/1619152/how-to-create-rest-urls-without-verbs
'Programing' 카테고리의 다른 글
Vim 내부에서 터미널을 어떻게 실행합니까? (0) | 2020.03.23 |
---|---|
if-else 속기를 사용할 때 두 번째 표현식 생략 (0) | 2020.03.23 |
일부 컴퓨터에서 TransactionScope가 MSDTC로 자동 에스컬레이션됩니까? (0) | 2020.03.23 |
Java에서 AtomicReference를 언제 사용합니까? (0) | 2020.03.23 |
Objective-C에서“@private”은 무엇을 의미합니까? (0) | 2020.03.23 |