RESTful == ‘REST의 원칙을 따르는..’
URL이 중요한 이유
- 로직 설계의 첫걸음
- SEO
- 공개 후 변경 비용이 크게 된다.
REST(Representational State Transfer)이란?
장비간 통신을 SOAP, RPC 등 복잡한 방법 대신 HTTP를 이용한다.
웹사이트의 이미지, 텍스트, 파일 등에 고유한 URI를 부여하여 관리하게 된다.
원격 서버의 리소스(데이터)에 대한 상태 교환. 웹의 장점을 최대한 살리는 방향으로 가자!하는것이 목적
지키는게 좋다. 지키는게 좋다. 지키는게 좋다. 지키는게 좋다.
REST 원칙의 구성요소
- 메서드 : HEAD, GET, POST, PUT/PATCH, delete
- 리소스 : Article, Comment
- 메세지 : HTTP 상태 코드 및 본문
RESTful하게 설계 하는 것은 뭘까?
- 적절한 HTTP 메서드를 사용한다.
- 불러올 땐 GET / 변경할 땐 POST, PUT(PATCH), DELETE
- HTTP 메서드 오버라이드
- 일부 브라우저, 프록시에는 GET, POST만 사용이 가능할 수 있다.
- 그럴 땐 힌트를 주자. XHTTP등..
- 리소스는 명사로 표현하자. 리소스는 단 두가지다. 컬렉션과 인스턴스
/ | 표현 | GET | POST | PUT | DELETE |
---|---|---|---|---|---|
콜렉션 | /articles | 글 목록 | 글 저장 | 없음 | 글 전체 삭제? |
인스턴스 | /articles/:id | id글 조회 | 없음 | id글 수정 | id글 삭제 |
- 복수형 리소스이름, 일관된 대소문자
GET /articles (o)
GET /article (x,선호하지 않아)
- 관계를 노출할 땐 리소스 중첩
GET /tags/:id/articles (o)
GET /tags?1?submodel = articles (x,선호하지 않아)
- 컬렉션과 인스턴스를 조회할 때 복잡한 것은 ?로
GET /articles?q=Lorem
GET /articles?page=2
- 알맞은 HTTP에러 코드를 사용한다.
- 200 : 성공
- 201 : 리소스 생성 성공. created
- 204 : 삭제 같은것을 할 때 사용
- 304 : 캐시된 리소스 대비 서버 리소스의 변경이 없을 때
- 400 : Bad request
- 401 : 인증 필요
- 403 : 권한부족. forbidden
- 404 : 요청한 리소스가 없음. Not found
ROR과 REST
ROR에서는 리소스 기반으로 RESTful하게 라우팅을 설정하는 방법을 제공합니다.
저는 resources :photos 란 한 줄을 라우팅에 입력했을 뿐인데 이 7가지를 알아서 다 만들어주게 되죠.
HTTP 메서드 | 경로 | 컨트롤러#액션 | 목적 |
---|---|---|---|
GET | /photos | photos#index | 모든 사진 목록을 표시 |
GET | /photos/new | photos#new | 사진을 1개 생성하기 위한 HTML 양식을 반환 |
POST | /photos | photos#create | 사진을 1개 생성 |
GET | /photos/:id | photos#show | 특정 사진을 보여줌 |
GET | /photos/:id/edit | photos#edit | 사진 편집용의 HTML 양식을 반환 |
PATCH/PUT | /photos/:id | photos#update | 특정 사진을 갱신 |
DELETE | /photos/:id | photos#destroy | 특정 사진을 삭제 |
-
여러개를 한꺼번에 할 때는 resources :photos, :books, :videos 이렇게 쓰세요!
-
namespace로 그룹을 묶을 수 있습니다. 이 때는
namespace :admin do
resources :posts, :comments
end
HTTP 메서드 | 경로 | 컨트롤러#액션 | 네임 스페이스 헬퍼 |
---|---|---|---|
GET | /admin/posts | admin/posts#index | admin_posts_path |
GET | /admin/posts/new | admin/posts#new | new_admin_post_path |
POST | /admin/posts | admin/posts#create | admin_posts_path |
GET | /admin/posts/:id | admin/posts#show | admin_post_path(:id) |
GET | /admin/posts/:id/edit | admin/posts#edit | edit_admin_post_path(:id) |
PATCH/PUT | /admin/posts/:id | admin/posts#update | admin_post_path(:id) |
DELETE | /admin/posts/:id | admin/posts#destroy | admin_post_path(:id) |
- 중첩되는 resources에는
# 관계가 이런식으로 되어있고
class Magazine < ActiveRecord::Base
has_many :ads
end
class Ad < ActiveRecord::Base
belongs_to :magazine
end
# 이럴 때는 이렇게 중첩해서 적어준다.
resources :magazines do
resources :ads
end
HTTP 메서드 | 경로 | 컨트롤러#액션 | 목적 |
---|---|---|---|
GET | /magazines/:magazine_id/ads | ads#index | 잡지 1권에 포함되는 광고를 모두 표시한다. |
GET | /magazines/:magazine_id/ads/new | ads#new | 어떤 잡지에 광고를 추가할 수 있는 HTML 양식을 반환한다. |
POST | /magazines/:magazine_id/ads | ads#create | 어떤 잡지 1권에 잡지용의 광고를 하나 추가한다. |
GET | /magazines/:magazine_id/ads/:id | ads#show | 어떤 잡지 1권에 포함되는 광고를 하나 보여준다. |
GET | /magazines/:magazine_id/ads/:id/edit | ads#edit | 어떤 잡지 1권에 포함되는 광고 하나를 수정할 수 있는 HTML 양식을 반환한다. |
PATCH/PUT | /magazines/:magazine_id/ads/:id | ads#update | 어떤 잡지 1권에 포함되는 광고 하나를 갱신한다. |
DELETE | /magazines/:magazine_id/ads/:id | ads#destroy | 어떤 잡지 한권에 포함되는 광고를 하나 삭제한다. |
- 꼭 7개 이어야 하는 보장은 없습니다. 여기서 더 추가를 하려면 member block을 이용하게 됩니다.
resources :photos do
member do
get 'preview'
end
end