REST API에 대한 명명 규칙이 있습니까? [닫은]


212

REST API를 생성 할 때 API 내에서 명명 규칙에 대한 지침 또는 사실상의 표준이 있습니까 (예 : URL 끝점 경로 구성 요소, 쿼리 문자열 매개 변수)? 낙타 모자는 표준입니까, 아니면 밑줄입니까? 다른 사람?

예를 들면 다음과 같습니다.

api.service.com/helloWorld/userId/x

또는

api.service.com/hello_world/user_id/x

참고 : 이는 RESTful API 디자인의 문제가 아니라 사용되는 최종 경로 구성 요소 및 / 또는 쿼리 문자열 매개 변수에 사용할 명명 규칙 지침입니다.

모든 지침을 주시면 감사하겠습니다.

답변:


150

낙타 모자를 피해야한다고 생각합니다. 표준은 소문자를 사용하는 것입니다. 또한 밑줄을 피하고 대신 대시를 사용하십시오.

따라서 URL은 다음과 같아야합니다 (요청한 디자인 문제는 무시하십시오 :-))

api.service.com/hello-world/user-id/x

187
RFC2616에 따르면 URL의 체계와 호스트 부분 만 대소 문자를 구분하지 않습니다. URL의 나머지 부분, 즉 경로와 쿼리는 대소 문자를 구분해야합니다. w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.2.3
Darrel Miller

10
대니얼, 네 말이 맞아 줘서 고마워 그러나 사실상 우리는 일반적으로 URL이 사례, 특히 리소스 이름 부분을 무시할 것으로 예상합니다. userid와 UserId가 다르게 동작하는 것은 말이되지 않습니다 (둘 중 하나가 404를 반환하지 않는 한)
LiorH

18
@LiorH : 왜 대소 문자를 구분한다고 생각 하는가? 다른 많은 맥락들은 좋은 효과에 대해 대소 문자를 구분합니다. 가 일부 웹 서비스 (예를 들어, 아마존 S3)이다 URL 엔드 포인트에 대한 대소 문자 구분을 적용, 그리고 나는 그것이 매우 적절한 것 같아요.
행크

6
@Dennis Windows 서버 파일 시스템은 technet.microsoft.com/en-us/library/cc725747.aspx에
samspot

5
@samspot 좋은 것! Windows가 서버를 만들 때 대소 문자를 구분하는 파일 이름으로 바로 전환되었다고 생각했습니다. 와우, 그들은 "1 MicroSoft Way"와 같이 가능한 한 오랫동안 THEIR 방식을 추진하고있었습니다. ;-)
Dennis

87

Dropbox , Twitter , Google 웹 서비스Facebook 용 REST API는 모두 밑줄을 사용합니다.


24
그 부작용 중 하나는 밑줄이 그어진 '단어'가 Google의 검색 색인에서 전체적으로 유지된다는 것입니다. Hyhenated는 별도의 단어로 나뉩니다.
Dennis


11
Google Maps API는 밑줄을 사용하지만 Google 스타일 가이드 에는 Camel Case가 필요합니다. 의 Google+ API사용자 정의 검색 API 다른 사람들은 낙타 케이스를 사용합니다.
Benjamin

2
그러나 그들은 여전히 사용 '-'구분자로 해당 URL을 : P developers.google.com/custom-search/json-api/v1/reference/cse/... developers.google.com/+/best-practices dev.twitter. com / overview / case-studies 반면에 그들은 쿼리 매개 변수에 camelCase를 사용합니다.
Mattias

1
아무도 모른다 ...
Piotr Kula

84

일반적인 웹 리소스에 대한 URI를 자세히 살펴보십시오. 그것들이 당신의 템플릿입니다. 디렉토리 트리를 생각하십시오. 간단한 Linux와 같은 파일 및 디렉토리 이름을 사용하십시오.

HelloWorld정말 좋은 클래스는 아닙니다. "사물"인 것 같지 않습니다. 그럴 수도 있지만 매우 명사와는 다릅니다. A greeting는 것입니다.

user-id가져 오는 명사 일 수도 있습니다. 그러나 요청 결과는 user_id 일뿐입니다. 요청 결과가 사용자 일 가능성이 훨씬 높습니다. 따라서, user당신이 가져 오는 명사입니다

www.example.com/greeting/user/x/

이해가 되네요 REST 요청을 일종의 명사구 (계층 구조 (또는 분류 체계 또는 디렉토리)를 통과하는 경로)로 만드는 데 중점을 둡니다. 가능한 경우 명사구를 피하면서 가능한 가장 간단한 명사를 사용하십시오.

일반적으로 복합 명사구는 일반적으로 계층 구조의 다른 단계를 의미합니다. 그래서, 당신은하지 않습니다 /hello-world/user//hello-universe/user/. 당신은 가지고 /hello/world/user/hello/universe/user/. 또는 가능하게 /world/hello/user/하고 /universe/hello/user/.

요점은 리소스 간의 탐색 경로를 제공하는 것입니다.


4
내 질문은 최종 경로 이름 및 / 또는 쿼리 문자열 매개 변수의 이름 지정 규칙에 관한 것입니다. 나는 당신에게 디자인 권장 사항에 동의하므로 감사합니다. 그러나이 질문으로 나는 명명 규칙에 대해 묻고 있습니다.
jnorris 2009

1
비 계층 적 리소스에 REST를 사용하는 것을 막을 수있는 것은 없습니다. 사용하는 실제 URI 이름 지정 규칙은 중요하지 않습니다. 멋지다고 생각하고 서버에서 구문 분석하기 쉬운 것을 사용하십시오. 응답에서 하이퍼 텍스트를 통해 URI를 리소스로 보내야하므로 클라이언트는 URI 생성에 대해 아무것도 몰라 야합니다.
aehlke

30

'UserId'는 전적으로 잘못된 접근법입니다. 동사 (HTTP 메소드) 및 명사 접근 방식은 Roy Fielding 이 REST 아키텍처에 대해 의미 한 것입니다 . 명사

  1. 컬렉션 것들

좋은 명명 규칙 중 하나는 다음과 같습니다.

[POST or Create](To the *collection*)
sub.domain.tld/class_name.{media_type} 

[GET or Read](of *one* thing)
sub.domain.tld/class_name/id_value.{media_type}

[PUT or Update](of *one* thing)
sub.domain.tld/class_name/id_value.{media_type}

[DELETE](of *one* thing)
sub.domain.tld/class_name/id_value.{media_type}

[GET or Search](of a *collection*, FRIENDLY URL)
sub.domain.tld/class_name.{media_type}/{var}/{value}/{more-var-value-pairs}

[GET or Search](of a *collection*, Normal URL)
sub.domain.tld/class_name.{media_type}?var=value&more-var-value-pairs

{media_type}은 json, xml, rss, pdf, png 및 html 중 하나입니다.

끝에 다음과 같이 's'를 추가하여 콜렉션을 구별 할 수 있습니다.

'users.json' *collection of things*
'user/id_value.json' *single thing*

그러나 이것은 당신이 's'를 어디에 놓았는지, 어디에 놓지 않았는지 추적해야 함을 의미합니다. 또한 지구의 절반 (초보자 용 아시아 인)은 명시 적 복수형이없는 언어를 사용하므로 URL이 덜 친숙합니다.


{var}의 의미는 무엇입니까? 예를 들어 ... / user / username / tomsawyer와 같은 이름으로 사용자를 검색하면?
Hans-Peter Störr

1
x, y, z라는 세 개의 변수 (var)가있는 경우 URL은 다음과 같습니다. sub.domain.tld / x / value_of_x / y / value_of_y / z / value_of_z
Dennis

@hstoerr 분명히 알기 위해 대부분의 스크립트 언어는 일종의 '중괄호 변수 대체'를 사용합니다. 따라서 {var}은 일부 변수 (이름)가 거기에 있음을 나타내므로 다음 {value}는 {var}의 값 앞에 위치합니다. 예 : sub.domain.tld / script / {var} / {value} .json [www.yelp.com/food_reviews/review_averages_higher_than/4.json]은 음식 reveiws에 대한 yelp.com에서 json 결과를 가져 오려고합니다.
Dennis

이것은 내 생각에 가장 좋은 대답이며 국제적으로 생각하기에 좋습니다.
beiller

14

아니요. REST는 URI 명명 규칙과 관련이 없습니다. 하이퍼 텍스트를 통하지 않고 대역 외의 API의 일부로 이러한 규칙을 포함 시키면 API가 RESTful하지 않습니다.

자세한 내용은 http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven을 참조하십시오.


44
휴식을 취하십시오 ... 여전히 멋진 URL을 갖는 것이 좋습니다.
HDave

1
@HDave에 동의하는 것은 REST의 정신에 따라 쉽게 이해할 수있는 URL을 갖는 것입니다. URL로 작업하고 있는데 코드에서 변수 및 매개 변수 이름만큼 쉽게 이해하기를 원하지 않는 이유는 무엇입니까?
mahemoff

4
@mahemoff 죄송합니다, 저는 슈퍼 pedantic입니다. 그러나 URL의 모양은 REST와 아무 관련이 없습니다. 그것은 그들이 가지고있는 것이 좋지 않다는 것을 의미하지는 않으며 REST가 묘사 한 것과 직교합니다. REST는 URL을 이런 식으로 구성하는 것에 관한 것이라고 오해의 소지가 있습니다. RPC API를 읽을 수 있고 구조화 된 URL을 가지고 있기 때문에 RPC API를 REST로 설명하는 사람들로 이어지기 때문입니다.
aehlke

5
요약하면 멋진 URL이 훌륭하고 모든 사람이 URL을 가져야합니다. REST와는 아무런 관련이 없습니다.
aehlke

1
@aehlke이 문제를 해결해 주셔서 감사합니다. 나머지는 URL 구조에 관한 것이 아닙니다. 사람들이 이해하기 어려운 이유를 이해하지 못합니다.
user1431072

9

도메인 이름은 대소 문자를 구분하지 않지만 나머지 URI는 확실 할 수 있습니다. URI가 대소 문자를 구분하지 않는다고 가정하는 것은 큰 실수입니다.



2

낙타 사례가 해당 예제의 문제라고 생각하지 않지만 위 예제의 RESTful 명명 규칙은 다음과 같습니다.

api.service.com/helloWorld/userId/x

오히려 userId를 쿼리 매개 변수 (완전히 합법적 인)로 만드는 것은 내 예제에서 IMO의 리소스를보다 RESTful 한 방법으로 나타냅니다.


이것은 RESTful API 디자인의 문제가 아니라 사용되는 최종 경로 구성 요소 및 / 또는 쿼리 문자열 매개 변수에 사용할 명명 규칙 지침입니다. 예를 들어, 경로 구성 요소를 사용한 낙타 마개 또는 밑줄로 표시해야합니까?
jnorris

REST에서 URL은 인터페이스이므로 API 질문입니다. 나는 당신의 예에 특정한 지침이 없다고 생각하지만, 나는 개인적으로 낙타 사건과 함께 갈 것입니다.
Gandalf

HTTP 스택의 모든 수준에서 캐시하려는 리소스에는 쿼리 매개 변수를 사용하지 않아야합니다.
aehlke

@aehlke 정확한 반대도 마찬가지입니다. 쿼리 매개 변수를 캐시하지 않으려면 매개 변수에 GET 스타일을 사용하십시오. ~ 또는 ~ DARN SURE로 캐시하지 않으려는 항목에 대한 캐싱 방지 헤더를 수정 / 삽입하십시오. 또한 객체 / 페이지 리튜 런드의 해시 인 일부 헤더가 있습니다.이 헤더를 사용하여 캐시하려는 항목의 변경 사항을 나타내지 만 편집이있을 때 업데이트됩니다.
Dennis

@aehlke 캐싱에 대해 알고 추가하고 있습니다. 속도 향상 중 하나 가이 모든 헤더를 수행 한 다음 파일 캐시와 프록시가 긴 캐시 시간이 지난 후 최신 버전을 서버에 가져 오기 위해 내용이 변경 될 때 파일 이름과 모든 참조를 변경하는 CodeCamp 프레젠테이션을 기억합니다. 세트. 모든 세부 사항은 다음과 같습니다. developers.google.com/speed/docs/best-practices/caching
Dennis

2

Oauth2로 클라이언트를 인증하는 경우 두 개 이상의 매개 변수 이름에 밑줄이 필요하다고 생각합니다.

  • client_id
  • client_secret

내 (아직 게시되지 않은) REST API에서 camelCase를 사용했습니다. API 문서를 작성하는 동안 모든 것을 snake_case로 변경하려고 생각했기 때문에 다른 매개 변수가 아닌 Oauth 매개 변수가 snake_case 인 이유를 설명 할 필요가 없습니다.

참조 : https://tools.ietf.org/html/rfc6749


0

REST URL에서 가능한 적은 수의 특수 문자를 사용하는 것이 좋습니다. REST의 장점 중 하나는 서비스의 "인터페이스"를 쉽게 읽을 수 있다는 것입니다. 낙타 케이스 또는 파스칼 케이스는 아마도 리소스 이름 (사용자 또는 사용자)에게 좋습니다. REST와 관련하여 실제로 엄격한 표준이 있다고 생각하지 않습니다.

또한 Gandalf가 옳다고 생각합니다. 일반적으로 REST에서 쿼리 문자열 매개 변수를 사용하지 않고 처리하려는 리소스를 정의하는 경로를 만드는 것이 더 깨끗합니다.

http://api.example.com/HelloWorld/Users/12345/Order/3/etc

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.