RESTful 프로그래밍이란 정확히 무엇입니까?


3983

RESTful 프로그래밍이란 정확히 무엇입니까?


3
다음 링크의 답변도 참조하십시오. stackoverflow.com/a/37683965/3762855
Ciro Corvino

3
REST는 이제 조금 나이가 들었습니다
Vlady Veselinov

1
또한 자세한 내용은이 링크를 참조하십시오. news.ycombinator.com/item?id=3538585
Ashraf.Shk786


5
@ OLIVER.KOO 좋은 관찰. 그것이 새로운 것이었을 때 한 번에 물었다는 것입니다. 그것은 많은 주위에 던져지고 있었지만 많은 사람들이 그것이 무엇에 관한 것인지 알지 못했습니다. 적어도 나는하지 않았으며, 그들이 묻는 것도 그들이 알고 싶어했기 때문에 도움이 된 것 같습니다.
hasen

답변:


743

건축 양식 이라고 REST (Representational State Transfer)는 이되면서 그 웹 애플리케이션이 HTTP를 사용한다 옹호 원래 구상 . 조회는 GET요청 을 사용해야 합니다. PUT, POSTDELETE요청각각 돌연변이, 생성 및 결실에 사용되어야합니다 .

REST 제안자는 다음과 같은 URL을 선호하는 경향이 있습니다.

http://myserver.com/catalog/item/1729

그러나 REST 아키텍처에는 이러한 "예쁜 URL"이 필요하지 않습니다. 매개 변수가있는 GET 요청

http://myserver.com/catalog?item=1729

RESTful만큼 모든 비트입니다.

GET 요청은 정보를 업데이트하는 데 사용해서는 안됩니다. 예를 들어 장바구니에 상품을 추가하기위한 GET 요청

http://myserver.com/addToCart?cart=314159&item=1729

적절하지 않습니다. GET 요청은 dem 등원 이어야합니다 . 즉, 요청을 두 번 발행하는 것이 요청을 한 번 발행하는 것과 다르지 않아야합니다. 그것이 요청을 캐시 가능하게 만드는 것입니다. "장바구니에 추가"요청은 dem 등성이 아닙니다. 두 번 발행하면 두 부의 품목 사본이 카트에 추가됩니다. 이 상황에서는 POST 요청이 분명히 적합합니다. 따라서 RESTful 웹 애플리케이션 조차도 POST 요청을 공유해야합니다.

이것은 David M. Geary의 Core JavaServer faces 책 에서 발췌 한 것 입니다.


2
사용 가능한 dem 등식 조작 : GET (Safe), PUT & DELETE (이 링크 restapitutorial.com/lessons/idempotency.html에 예외가 언급 됨). 안전하고 dem 등한 방법에 대한 추가 참조 w3.org/Protocols/rfc2616/rfc2616-sec9.html
Abhijeet

5
a) GET의 중요한 점은 dem 등성이 아니라 안전이다. b) @Abhijeet : RFC 2616은 2014 년에 폐기되었다. RF 7230ff를 참조하십시오.
Julian Reschke

12
이것은 잘못이다. 올바른 REST의 해석이 읽기 roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven 또는이 stackoverflow.com/questions/19843480/...
kushalvm

4
@kushalvm REST의 학술적 정의는 실제로 사용되지 않습니다.
Warlike Chimpanzee

3
우리는 개념이 모두에게 안정적이고 이해하기 쉬운 정의를 제공하지 못하여 개념이 작동하는지 궁금해 할 수있다
HoCo_

2918

REST 는 웹의 기본 아키텍처 원칙입니다. 웹의 놀라운 점은 클라이언트 (브라우저)와 서버가 클라이언트가 서버와 서버가 호스팅하는 리소스에 대해 미리 알 필요없이 복잡한 방식으로 상호 작용할 수 있다는 사실입니다. 주요 제약 조건은 서버와 클라이언트가 사용되는 미디어에 동의해야한다는 것 입니다. 웹의 경우 HTML 입니다.

REST 원칙을 준수하는 API 는 클라이언트가 API 구조에 대해 아무것도 알 필요가 없습니다. 오히려 서버는 클라이언트가 서비스와 상호 작용하는 데 필요한 정보를 제공해야합니다. HTML 형태는 그 예이다 : 서버 자원 및 필수 필드의 위치를 지정한다. 브라우저는 정보를 제출할 위치를 미리 알지 못하며 제출할 정보를 미리 알지 못합니다. 두 형태의 정보는 전적으로 서버에 의해 제공됩니다. (이 원칙을 HATEOAS : 응용 프로그램 엔진 상태의 하이퍼 미디어 라고 합니다.)

그렇다면 이것이 HTTP 에 어떻게 적용 되며 실제로 어떻게 구현할 수 있습니까? HTTP는 동사와 리소스를 중심으로합니다. 주류 사용에 사용되는 두 동사는 GETand POST입니다. 그러나, HTTP 표준은 다음과 같은 몇 가지 다른 정의 PUTDELETE. 그런 다음 서버에서 제공 한 지시 사항에 따라이 동사가 자원에 적용됩니다.

예를 들어 웹 서비스에서 관리하는 사용자 데이터베이스가 있다고 가정 해 봅시다. 우리의 서비스는 우리가 MIME 형식을 지정하는 JSON을 기반으로 사용자 정의 하이퍼 미디어를 사용 application/json+userdb(도있을 수 있습니다 application/xml+userdbapplication/whatever+userdb- 여러 미디어 유형이 지원 될 수있다). 클라이언트와 서버는이 형식을 이해하도록 프로그래밍되었지만 서로에 대해 아무것도 모릅니다. Roy Fielding이 지적한 바와 같이 :

REST API는 리소스를 표현하고 애플리케이션 상태를 구동하는 데 사용되는 미디어 유형을 정의하거나 기존 표준 미디어 유형에 대한 확장 관계 이름 및 / 또는 하이퍼 텍스트 가능 마크 업을 정의하는 데 거의 모든 설명적인 노력을 기울여야합니다.

기본 자원에 대한 요청은 /다음과 같은 것을 리턴 할 수 있습니다.

의뢰

GET /
Accept: application/json+userdb

응답

200 OK
Content-Type: application/json+userdb

{
    "version": "1.0",
    "links": [
        {
            "href": "/user",
            "rel": "list",
            "method": "GET"
        },
        {
            "href": "/user",
            "rel": "create",
            "method": "POST"
        }
    ]
}

우리는 미디어 설명에서 "링크"라는 섹션에서 관련 리소스에 대한 정보를 찾을 수 있음을 알고 있습니다. 이를 하이퍼 미디어 컨트롤 이라고 합니다 . 이 경우, 다음 섹션에서 다른 요청을하여 사용자 목록을 찾을 수 있음을 해당 섹션에서 알 수 있습니다 /user.

의뢰

GET /user
Accept: application/json+userdb

응답

200 OK
Content-Type: application/json+userdb

{
    "users": [
        {
            "id": 1,
            "name": "Emil",
            "country: "Sweden",
            "links": [
                {
                    "href": "/user/1",
                    "rel": "self",
                    "method": "GET"
                },
                {
                    "href": "/user/1",
                    "rel": "edit",
                    "method": "PUT"
                },
                {
                    "href": "/user/1",
                    "rel": "delete",
                    "method": "DELETE"
                }
            ]
        },
        {
            "id": 2,
            "name": "Adam",
            "country: "Scotland",
            "links": [
                {
                    "href": "/user/2",
                    "rel": "self",
                    "method": "GET"
                },
                {
                    "href": "/user/2",
                    "rel": "edit",
                    "method": "PUT"
                },
                {
                    "href": "/user/2",
                    "rel": "delete",
                    "method": "DELETE"
                }
            ]
        }
    ],
    "links": [
        {
            "href": "/user",
            "rel": "create",
            "method": "POST"
        }
    ]
}

이 답변에서 많은 것을 알 수 있습니다. 예를 들어, 우리는 지금 우리가 새로운 사용자를 생성 할 수 있습니다 알고 POST에 보내고 /user:

의뢰

POST /user
Accept: application/json+userdb
Content-Type: application/json+userdb

{
    "name": "Karl",
    "country": "Austria"
}

응답

201 Created
Content-Type: application/json+userdb

{
    "user": {
        "id": 3,
        "name": "Karl",
        "country": "Austria",
        "links": [
            {
                "href": "/user/3",
                "rel": "self",
                "method": "GET"
            },
            {
                "href": "/user/3",
                "rel": "edit",
                "method": "PUT"
            },
            {
                "href": "/user/3",
                "rel": "delete",
                "method": "DELETE"
            }
        ]
    },
    "links": {
       "href": "/user",
       "rel": "list",
       "method": "GET"
    }
}

또한 기존 데이터를 변경할 수 있음을 알고 있습니다.

의뢰

PUT /user/1
Accept: application/json+userdb
Content-Type: application/json+userdb

{
    "name": "Emil",
    "country": "Bhutan"
}

응답

200 OK
Content-Type: application/json+userdb

{
    "user": {
        "id": 1,
        "name": "Emil",
        "country": "Bhutan",
        "links": [
            {
                "href": "/user/1",
                "rel": "self",
                "method": "GET"
            },
            {
                "href": "/user/1",
                "rel": "edit",
                "method": "PUT"
            },
            {
                "href": "/user/1",
                "rel": "delete",
                "method": "DELETE"
            }
        ]
    },
    "links": {
       "href": "/user",
       "rel": "list",
       "method": "GET"
    }
}

우리가 다른 HTTP 동사를 사용하고 있는지주의 ( GET, PUT, POST, DELETE등) 이러한 리소스를 조작하고, 우리는 고객의 부분에 가정 유일한 지식은 우리의 미디어 정의라고합니다.

더 읽을 거리 :

(이 답변은 요점을 놓친 것에 대한 상당한 양의 비판의 대상이었습니다. 대부분의 경우, 그것은 비평이었습니다. 제가 원래 설명한 것은 몇 년 전 REST가 일반적으로 구현 된 방식과 더 관련이있었습니다. 처음에는 이것이 진정한 의미가 아니라 이것을 썼습니다. 나는 실제 의미를 더 잘 표현하기 위해 답을 수정했습니다.)


178
아니요. REST는 다른 유행어가 아닙니다. SOAP 기반 데이터 교환에 대한 대안을 설명하는 수단으로 등장했습니다. REST라는 용어는 데이터를 전송하고 액세스하는 방법에 대한 토론을 구성하는 데 도움이됩니다.
tvanfosson 2016 년

111
그럼에도 불구하고 (실제 응용 프로그램에서) REST의 핵심은 "GET을 사용하여 변경하지 말고 POST / PUT / DELETE를 사용하십시오"입니다. 이는 SOAP가 등장하기 오래 전부터 듣고 왔습니다. REST 항상 존재 해 왔으며 최근까지는 "할 수있는 방법"이상의 이름을 얻지 못했습니다.
Dave Sherohman 2016 년

37
"응용 프로그램 상태 엔진의 하이퍼 텍스트"를 잊지 마십시오.
행크 게이

45
이 답변은 요점을 그리워합니다. Fielding의 논문에는 HTTP가 거의 언급되어 있지 않습니다.
user359996

18
이 답변은 REST의 목적을 언급하지 않았으며 깨끗한 URI에 관한 것 같습니다. 이것이 REST에 대한 대중의 인식 일지 모르지만 D.Shawley와 oluies의 대답은 더 정확합니다. 캐싱과 같이 아키텍처에 내장 된 기능을 사용하지 않고이를 활용하여 활용할 수 있다는 것입니다. 더 예쁜 URI는 주로 일반적인 부작용입니다.
TR

534

RESTful 프로그래밍은 다음과 같습니다.

  • 영구 식별자로 식별되는 자원 : 요즘 URI는 유비쿼터스의 식별자 선택입니다.
  • 자원은 동사의 공통 사용하여 조작되는 : HTTP를 방법은 일반적으로 볼 경우입니다 - 오래된 Create, Retrieve, Update, Delete된다 POST, GET, PUT,와 DELETE. 그러나 REST는 HTTP로 제한되지 않으며 현재 가장 일반적으로 사용되는 전송입니다.
  • 자원에 대해 검색된 실제 표현은 식별자가 아닌 요청에 따라 다릅니다. Accept 헤더를 사용하여 XML, HTTP 또는 자원을 나타내는 Java 오브젝트를 원하는지 여부를 제어하십시오.
  • 객체에서 상태를 유지하고 표현에서 상태를 나타냄
  • 자원 표현에서 자원들 간의 관계를 나타내는 것 : 객체들 사이의 링크는 표현에 직접 포함된다
  • 자원 표현은 표현을 사용하는 방법과 일관된 방식으로 표현을 버리고 다시 가져와야하는 상황을 설명합니다. HTTP 캐시 제어 헤더 사용

마지막 것은 아마도 REST의 결과 및 전반적인 효과면에서 가장 중요합니다. 전반적으로, RESTful 토론의 대부분은 HTTP와 브라우저에서의 사용법 및 그렇지 않은 것에 중점을 둔 것으로 보입니다. 필자는 R. Fielding이 HTTP로 이끄는 아키텍처와 결정을 설명 할 때이 용어를 만들었다는 것을 이해합니다. 그의 논문은 HTTP보다는 리소스의 아키텍처 및 캐시 가능성에 관한 것입니다.

RESTful 아키텍처가 무엇이고 왜 작동하는지에 정말로 관심이 있다면, 그의 논문 을 몇 번 읽고 5 장뿐만 아니라 전체 내용을 읽으십시오 ! 다음으로 DNS가 작동하는 이유를 살펴보십시오 . DNS의 계층 적 구성 및 조회 작동 방식에 대해 읽으십시오. 그런 다음 DNS 캐싱 작동 방식을 읽고 고려하십시오. 마지막으로 HTTP 사양 ( 특히 RFC2616RFC3040 )을 읽고 캐싱이 작동하는 방식과 이유를 고려하십시오. 결국 클릭 만하면됩니다. 마지막 계시는 DNS와 HTTP의 유사성을 보았을 때였습니다. 그런 다음 SOA 및 메시지 전달 인터페이스가 확장 가능한 이유를 이해하면 클릭이 시작됩니다.

RESTful 및 Shared Nothing 아키텍처 의 아키텍처 중요성 및 성능 관련 사항을 이해하는 가장 중요한 트릭 은 기술 및 구현 세부 사항에 얽매이지 않는 것입니다. 자원을 소유 한 사람, 자원을 생성 / 유지 관리하는 담당자 등에 집중하십시오. 그런 다음 표현, 프로토콜 및 기술에 대해 생각하십시오.


36
이 질문에는 읽기 목록을 제공하는 답변이 매우 적합합니다.
ellisbben 2019

25
업데이트 해 주셔서 감사합니다. PUT그리고 POST정말 업데이트 일대일지도로 만들 수 없습니다. PUT클라이언트가 URI가 무엇인지 지시하는 경우 작성하는 데 사용될 수 있습니다. POST서버가 새 URI를 할당하는 경우 작성합니다.
D.Shawley

8
패치를 잊지 마십시오.
epitka

4
URN은 urn:체계 를 사용하는 URI입니다 . 개념적으로 차이는 없습니다. 그러나 URN은 URN에 의해 ​​식별 된 (명명 된) 자원을 "위치"하기 위해 별도로 정의 된 메소드가 필요합니다. 명명 된 리소스 및 해당 위치와 관련하여 암시 적 커플 링을 도입하지 않도록주의해야합니다.
D.Shawley

2
@ellisbben 합의. 내가 이해한다면 올바르게은 REST에 상승 준 논문은 다음과 같습니다 ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm
필립 Couling

408

이것은 다음과 같습니다.

세 가지 속성을 가진 사용자를 만듭니다.

POST /user
fname=John&lname=Doe&age=25

서버는 다음과 같이 응답합니다.

200 OK
Location: /user/123

나중에 사용자 정보를 검색 할 수 있습니다.

GET /user/123

서버는 다음과 같이 응답합니다.

200 OK
<fname>John</fname><lname>Doe</lname><age>25</age>

레코드를 수정하려면 ( lnameage변경되지 않은 상태로 유지) :

PATCH /user/123
fname=Johnny

레코드를 업데이트하려면 (결과적 lnameageNULL이됩니다)

PUT /user/123
fname=Johnny

39
나 에게이 답변은 원하는 답변의 본질을 포착했습니다. 간단하고 실용적입니다. 다른 많은 기준이 있지만, 제공된 예제는 훌륭한 실행 패드입니다.
CyberFonic

92
마지막 예에서 @pbreitenbach는을 사용합니다 PUT fname=Jonny. 이 설정합니다 lnameageA가 있기 때문에, 값 (아마 NULL 또는 빈 문자열, 0의 정수)를 기본값으로 PUT 전체 자원 덮어 제공되는 표현의 데이터를합니다. "업데이트"에 의해 암시 된 것이 아니며 , 실제 업데이트를 수행하려면PATCH , 표현에 지정되지 않은 필드를 변경하지 않으므로 메소드사용하십시오 .
Nicholas Shanks

24
니콜라스가 맞아 또한 사용자를 생성하는 첫 번째 POST의 URI는 /user/1의미가없고에 목록이 있어야 하므로 users라고합니다 /users. 이 경우 응답은 201 CreatedOK 일뿐 만 아니라 a이어야합니다 .
DanMan

1
이것은 반드시 RESTful API가 아닌 API의 예일뿐입니다. RESTful에는 준수하는 제약 조건이 있습니다. 클라이언트-서버 아키텍처, 상태 비 저장, 캐시 기능, 계층화 된 시스템, 균일 한 인터페이스.
Radmation

모든 http 서블릿 액세스 방법을 다루는 매우 간결한 답변
Himanshu Ahuja

181

REST에 대한 훌륭한 책 은 실습 에서 REST입니다 .

읽기는 REST (Representational State Transfer) 여야 하고 REST API는 하이퍼 텍스트 중심이어야합니다.

RESTful 서비스가 무엇인지에 대한 설명 은 Martin Fowlers 기사 Richardson Maturity Model (RMM)을 참조하십시오 .

리차드슨 성숙 모형

RESTful 상태가 되려면 서비스 상태 엔진으로서 Hypermedia 를 이행해야합니다 . (HATEOAS은) , 즉, 그것은는 RMM에서 레벨 3에 도달 할 필요가 기사 읽기 세부 사항 또는 대한 qcon 대화에서 슬라이드를 .

HATEOAS 제한 조건은 응용 프로그램 엔진의 엔진으로서 Hypermedia의 약어입니다. 이 원칙은 REST와 대부분의 다른 형태의 클라이언트 서버 시스템을 구분하는 주요 차이점입니다.

...

RESTful 애플리케이션의 클라이언트는 단일 고정 URL 만 알고 있으면 액세스 할 수 있습니다. 해당 URL에서 반환되는 리소스 표현에 포함 된 하이퍼 미디어 링크에서 향후 모든 작업을 동적으로 검색 할 수 있어야합니다. 표준화 된 미디어 유형은 RESTful API를 사용하는 모든 클라이언트에 의해 이해 될 것으로 예상됩니다. (무료 백과 사전, 위키피디아에서)

웹 프레임 워크 용 REST Litmus 테스트는 웹 프레임 워크 에 대한 유사한 성숙도 테스트입니다.

순수한 REST에 접근하기 : HATEOAS를 사랑하는 법 은 훌륭한 링크 모음입니다.

퍼블릭 클라우드 용 REST 대 SOAP 는 현재 레벨의 REST 사용량에 대해 설명합니다.

REST 및 버전 관리 는 수정 가능성을 통해 확장 성, 버전 관리, 진 화성 등에 대해 설명합니다.


5
이 답변은 REST를 이해하는 핵심 포인트에 해당한다고 생각합니다 . 표현 이라는 단어의 의미 는 무엇입니까 ? 레벨 1-리소스는 상태 에 대해 말합니다 . 레벨 2-HTTP 동사는 전송 (읽기 변경 ) 에 대해 말합니다 . 레벨 3-HATEOAS에 따르면 표현 (JSON / XML / HTML이 반환 됨)을 통해 미래의 이체를 유도 할 수 있으며, 이는 다음 정보를 통해 다음 대화를하는 방법을 알고 있음을 의미합니다. 따라서 REST는 "((presentational state) transfer)"대신 "(presentational (state transfer))"를 읽습니다.
lcn


136

REST 란 무엇입니까?

REST는 Representational State Transfer를 나타냅니다. (때로는 "ReST"로 표기됩니다.) 상태 비 저장 클라이언트 서버 캐시 가능 통신 프로토콜을 사용하며 거의 모든 경우 HTTP 프로토콜이 사용됩니다.

REST는 네트워크 애플리케이션을 설계하기위한 아키텍처 스타일입니다. 아이디어는 CORBA, RPC 또는 SOAP와 같은 복잡한 메커니즘을 사용하여 시스템간에 연결하는 대신 간단한 HTTP를 사용하여 시스템간에 호출하는 것입니다.

여러 가지면에서 HTTP 기반의 월드 와이드 웹 자체는 REST 기반 아키텍처로 볼 수 있습니다. RESTful 애플리케이션은 HTTP 요청을 사용하여 데이터 게시 (생성 및 / 또는 업데이트), 데이터 읽기 (예 : 쿼리 작성) 및 데이터 삭제를 수행합니다. 따라서 REST는 4 개의 CRUD (작성 / 읽기 / 업데이트 / 삭제) 오퍼레이션 모두에 HTTP를 사용합니다.

REST는 RPC (Remote Procedure Calls) 및 웹 서비스 (SOAP, WSDL 등)와 같은 메커니즘에 대한 간단한 대안입니다. 나중에 REST가 얼마나 간단한 지 살펴 보겠습니다.

단순함에도 불구하고 REST는 모든 기능을 갖추고 있습니다. RESTful 아키텍처로는 수행 할 수없는 웹 서비스에서 기본적으로 수행 할 수있는 작업이 없습니다. REST는 "표준"이 아닙니다. 예를 들어 REST에 대한 W3C 권장 사항은 없습니다. REST 프로그래밍 프레임 워크가 있지만 REST 작업은 매우 간단하여 Perl, Java 또는 C #과 같은 언어의 표준 라이브러리 기능을 사용하여 "자신의 롤"을 수행 할 수 있습니다.

내가 쉬는 것의 단순한 진정한 의미를 찾으려고 할 때 내가 찾은 최고의 참고 문헌 중 하나.

http://rest.elkstein.org/


이것은 정말 간결한 답변입니다. REST가 상태 비 저장이라고하는 이유를 설명 할 수 있습니까?
Chaklader Asfak Arefe

89

REST는 다양한 HTTP 메소드 (주로 GET / PUT / DELETE)를 사용하여 데이터를 조작합니다.

메소드를 삭제하기 위해 특정 URL을 사용하는 대신 (예 /user/123/delete:) /user/[id]URL에 DELETE 요청을 보내고 , 사용자를 편집하고, GET 요청을 보낸 사용자에 대한 정보를 검색합니다./user/[id]

예를 들어, 다음 중 일부와 유사한 URL 세트가 있습니다.

GET /delete_user.x?id=123
GET /user/delete
GET /new_user.x
GET /user/new
GET /user?id=1
GET /user/id/1

HTTP "동사"를 사용하고 있습니다.

GET /user/2
DELETE /user/2
PUT /user

18
그것은 "휴식"과 동일하지 않은 "HTTP를 올바르게 사용하는 것"(관련되어 있지만)
Julian Reschke

2
/ user / del / 2 및 / user / remove / 2 또는 ...을 사용할 수도 있습니다. GET / DELETE / PUT / POST는 이러한 작업을 수행하는 표준화 된 "적절한"방법입니다. 휴식이 있습니다)
dbr

1
물론, 그럴 필요는 없습니다. REST는 매번 바퀴를 재발 명하는 데 도움이됩니다. API의 경우 REST는 훌륭하지만 (일관성!), 임의의 웹 사이트를 구성하는 것은 실제로 중요하지 않습니다 (가치보다 더 번거로울 수 있음)
dbr

14
Vadim, 그것은 단순히 RPC 일 것입니다. 검색 엔진이 삭제 링크를 스파이더 링하여 모두 방문 할 수 있으므로 GET을 사용하여 데이터를 수정하는 것은 위험합니다.
aehlke

7
@aehlke-실제 질문은 "익명 사용자가 시스템에서 레코드를 삭제할 수있는 이유는 무엇입니까?"
Spencer Ruport

68

시스템의 아키텍처 가 Roy Fielding 의 논문 에서 제시 한 REST 스타일 에 맞는 프로그래밍 입니다. 이것은 웹을 묘사하는 건축 스타일이기 때문에 (많거나 적음) 많은 사람들이 웹에 관심이 있습니다.

보너스 답변 : 아니요. 아카데믹 또는 웹 서비스 디자인으로 소프트웨어 아키텍처를 연구하지 않는 한이 용어를 들어야 할 이유가 없습니다.


2
그러나 간단하지는 않습니다.. 필요로하는 것을 더 복잡하게 만듭니다.
hasen

4
또한 REST 및 RESTful이라는 용어가 현재 거의 모든 웹 애플리케이션 영역에서 독점적으로 사용 되더라도 기술적으로 REST와 HTTP를 연관시키는 것은 없습니다.
행크 게이

3
Fielding의 블로그에는 REST 및 일반적인 오해에 대한 기사가 잘 이해하기 쉽게 정리되어 있습니다
aehlke

3
@HankGay 나는 그것이 더 난해하지 않은 이유는 대부분의 웹 서비스 개발자가 REST를 SOAP와 같은 대안에 비해 훌륭한 단순화로 간주하기 때문이라고 생각합니다. 그들은 반드시 모든 REST 기술을 올바르게 유지하는 데 충실하지는 않으며 아마도 REST 광신자를 화나게 할 것입니다. 그러나 대부분의 경우 결과가 "하이퍼 미디어 가능"인지 확인하는 것과 같은 것에 대해 걱정할 필요가 없습니다.
moodboom

47

RESTful 프로그래밍은 REST 아키텍처 스타일을 따르는 시스템 (API)을 만드는 것입니다.

M. Elkstein 박사의 REST에 대한 환상적이고 짧고 이해하기 쉬운 튜토리얼을 발견했으며 대부분의 질문에 대답 할 수있는 필수 부분을 인용했습니다.

REST 배우기 : 튜토리얼

REST는 네트워크 애플리케이션을 설계하기위한 아키텍처 스타일 입니다. 아이디어는 CORBA, RPC 또는 SOAP와 같은 복잡한 메커니즘을 사용하여 시스템간에 연결하는 대신 간단한 HTTP를 사용하여 시스템간에 호출하는 것입니다.

  • 여러 가지 방법으로 HTTP 기반의 월드 와이드 웹 자체는 REST 기반 아키텍처로 볼 수 있습니다.

RESTful 애플리케이션은 HTTP 요청을 사용하여 데이터 게시 (생성 및 / 또는 업데이트), 데이터 읽기 (예 : 쿼리 작성) 및 데이터 삭제를 수행합니다. 따라서 REST는 4 개의 CRUD (작성 / 읽기 / 업데이트 / 삭제) 오퍼레이션 모두에 HTTP를 사용합니다.

스택 오버플로 외부의 REST에 대해 듣지 못한다고 멍청하다고 생각하지는 않습니다. 같은 상황에 처할 것입니다.; 왜 REST가 커지는가 에 대한 다른 질문에 대한 대답 어떤 감정을 완화시킬 수 있습니다.


이 기사에서는 HTTP와 REST의 관계에 대해 설명합니다. freecodecamp.org/news/…
귀하 만

45

질문에 직접 대답하지 않으면 사과하지만 더 자세한 예를 통해이 모든 것을 이해하는 것이 더 쉽습니다. 모든 추상화와 용어로 인해 수비를 이해하기가 쉽지 않습니다.

여기에 꽤 좋은 예가 있습니다.

REST 및 하이퍼 텍스트 설명 : Spam-E 스팸 청소 로봇

더 좋은 점은 여기에 간단한 예제로 깔끔한 설명이 있습니다 (파워 포인트가 더 포괄적이지만 HTML 버전으로 대부분 얻을 수 있음).

http://www.xfront.com/REST.ppt 또는 http://www.xfront.com/REST.html

예제를 읽은 후 Ken이 왜 REST가 하이퍼 텍스트 중심임을 말하고 있는지 알 수있었습니다. 나는 / user / 123이 리소스를 가리키는 URI이기 때문에 실제로 그가 옳은지 확신하지 못하며 클라이언트가 "대역 외"에 대해 알고 있기 때문에 그것이 신뢰할 수 없다는 것은 분명하지 않습니다.

이 xfront 문서는 REST와 SOAP의 차이점을 설명하며 실제로 도움이됩니다. Fielding이 " , RPC입니다. RPC를 비명을 지 릅니다. " 라고 말하면 RPC가 RESTful이 아니라는 것이 확실하므로 정확한 이유를 확인하는 것이 좋습니다. SOAP는 RPC 유형입니다.


12
멋진 링크, 감사합니다. 나는 일부 REST가 "REST-ful"이 아니라는 REST 녀석들에 지 쳤지 만, 예제를 REST-ful로 변경하는 방법에 대해서는 거부합니다.
coder_tim

38

REST 란 무엇입니까?

공식적으로 말하면 REST는 현재 "웹"기본을 사용하는 특정 원칙을 기반으로하는 아키텍처 스타일입니다. REST 서비스를 작성하는 데 활용되는 5 가지 기본 기본 웹 요소가 있습니다.

  • 원칙 1 : 모든 것이 하나의 리소스 REST 아키텍처 스타일에서 데이터와 기능은 리소스로 간주되며 일반적으로 웹의 링크 인 URI (Uniform Resource Identifier)를 사용하여 액세스됩니다.
  • 원칙 2 : 모든 리소스는 고유 식별자 (URI)로 식별됩니다.
  • 원칙 3 : 단순하고 균일 한 인터페이스 사용
  • 원칙 4 : 의사 소통은 대표자에 의해 이루어짐
  • 원칙 5 : 무국적자

1
무슨 Communication is Done by Representation뜻입니까?
mendez7

33

리소스 "/ user / 123"에 사용자 123에 관한 모든 것을 넣는 것이 많은 답변이라고 생각합니다.

이 용어를 만든 Roy Fielding은 REST API가 하이퍼 텍스트 중심이어야 한다고 말합니다 . 특히, "A REST API는 고정 자원 이름 또는 계층을 정의해서는 안됩니다".

따라서 "/ user / 123"경로가 클라이언트에서 하드 코딩 된 경우 실제로 RESTful하지 않습니다. HTTP를 잘 사용하면 아마도 아닐 수도 있습니다. 그러나 RESTful하지 않습니다. 하이퍼 텍스트에서 가져와야합니다.


7
그래서 .... 그 예는 어떻게 편안할까요? URL을 편안하게 변경하려면 어떻게 하시겠습니까?
hasen

1
hasen : 모든 작업에 하나의 리소스를 사용하는 것이 RESTfulness에 필요할 수 있지만 충분 하지 않습니다 .
Ken

18
알았어 .. 더 설명해 줄 수 있니? 당신이 옳다고 알고 있거나 생각하지 않고 "이 녀석들도 옳지 않다. 나는 무엇이 옳은지 안다"고 말하는 요점이 무엇입니까?
hasen

5
Fielding의 설명에 대한 링크를 제공했습니다. 나는 다른 반응과 정확히 관련된 차이점을 말했다고 생각했다. "/ user / 123"이 일부 대역 외 API 문서에서 나온 경우 RESTful하지 않습니다. 하이퍼 텍스트의 리소스 식별자에서 비롯된 것입니다.
Ken

1
또는 / users /와 같은 진입 점을 사용하면 사용자 리소스 목록과 각 URI를 제공합니다. 그런 다음 리소스를 검색하고 탐색을 하이퍼 텍스트 방식으로 수행합니다.
aehlke

26

그 대답은 매우 간단합니다 . Roy Fielding이 작성한 논문 이 있습니다.] 1 이 논문에서 그는 REST 원칙을 정의합니다. 애플리케이션이 이러한 원칙을 모두 충족하는 경우 REST 애플리케이션입니다.

ppl은 REST가 아닌 응용 프로그램을 REST로 호출하여 REST라는 단어를 소진했기 때문에 RESTful이라는 용어가 만들어졌습니다. 그 후 RESTful이라는 용어도 소진되었습니다. 요즘 우리는 소위 REST 애플리케이션의 대부분이 균일 한 인터페이스 제약 조건의 HATEOAS 부분을 충족시키지 못하기 때문에 웹 API 및 하이퍼 미디어 API에 대해 이야기하고 있습니다.

REST 제약 조건은 다음과 같습니다.

  1. 클라이언트-서버 아키텍처

    따라서 예를 들어 PUB / SUB 소켓에서는 작동하지 않으며 REQ / REP를 기반으로합니다.

  2. 무국적 통신

    따라서 서버는 클라이언트의 상태를 유지하지 않습니다. 즉, 서버 측 세션 저장소를 사용할 수 없으며 모든 요청을 인증해야합니다. 클라이언트는 암호화 된 연결을 통해 기본 인증 헤더를 보낼 수 있습니다. (큰 응용 프로그램에서는 많은 세션을 유지하기가 어렵습니다.)

  3. 가능한 경우 캐시 사용

    따라서 동일한 요청을 반복해서 제공 할 필요가 없습니다.

  4. 클라이언트와 서버 간의 공통 계약으로서의 균일 한 인터페이스

    클라이언트와 서버 간의 계약은 서버에서 유지 관리하지 않습니다. 즉, 클라이언트는 서비스 구현에서 분리되어야합니다. 자원을 식별하는 IRI (URI) 표준, 메시지를 교환하는 HTTP 표준, 본문 직렬화 형식을 설명하는 표준 MIME 유형, 메타 데이터 (RDF vocab, microformats 등)를 사용하여이 상태에 도달 할 수 있습니다. 메시지 본문의 다른 부분의 의미를 설명합니다. 클라이언트에서 IRI 구조를 분리하려면 HTML, JSON-LD, HAL 등과 같은 하이퍼 미디어 형식으로 클라이언트에 하이퍼 링크를 보내야합니다. 따라서 클라이언트는 하이퍼 링크에 할당 된 메타 데이터 (아마도 링크 관계, RDF vocab)를 사용하여 현재 목표를 달성하기 위해 적절한 상태 전환을 통해 응용 프로그램의 상태 시스템을 탐색 할 수 있습니다.

    예를 들어, 고객이 주문을 웹샵에 보내려면 웹샵이 보낸 응답에서 하이퍼 링크를 확인해야합니다. 링크를 확인하면 http://schema.org/OrderAction에 설명 된 링크가 있습니다 . 클라이언트는 schema.org vocab을 알고 있으므로이 하이퍼 링크를 활성화하면 주문을 전송한다는 것을 이해합니다. 따라서 하이퍼 링크를 활성화 POST https://example.com/api/v1/order하고 적절한 본문이 포함 된 메시지를 보냅니다 . 그 후 서비스는 메시지를 처리하고 적절한 HTTP 상태 헤더를 가진 결과 (예 201 - created: 성공)로 응답합니다 . 세부 메타 데이터가있는 메시지에 주석을 달기 위해 RDF 형식을 사용하는 표준 솔루션 (예 : REST vocab이있는 JSON-LD) ( 예 : Hydra 및 도메인 특정 vocab)schema.org 또는 기타는 데이터 vocab 과 필요할 경우 사용자 지정 응용 프로그램 특정 vocab을 연결했습니다. 이것은 쉬운 일이 아니기 때문에 대부분의 ppl은 일반적으로 REST vocab 만 제공하지만 링크 된 데이터는 지원하지 않는 HAL 및 기타 간단한 형식을 사용합니다.

  5. 확장 성을 높이기 위해 계층화 된 시스템 구축

    REST 시스템은 계층 적 계층으로 구성됩니다. 각 계층에는 다음 계층에있는 구성 요소 서비스를 사용하는 구성 요소가 포함됩니다. 따라서 새로운 레이어와 구성 요소를 손쉽게 추가 할 수 있습니다.

    예를 들어 클라이언트를 포함하는 클라이언트 계층이 있고 그 아래에는 단일 서비스를 포함하는 서비스 계층이 있습니다. 이제 그들 사이에 클라이언트 측 캐시를 추가 할 수 있습니다. 그 후 다른 서비스 인스턴스와로드 밸런서 등을 추가 할 수 있습니다. 클라이언트 코드와 서비스 코드는 변경되지 않습니다.

  6. 클라이언트 기능을 확장하기 위해 주문형 코드

    이 제약 조건은 선택 사항입니다. 예를 들어 특정 미디어 유형에 대한 파서를 클라이언트에 전송할 수 있습니다. 이렇게하려면 클라이언트에 표준 플러그인 로더 시스템이 필요하거나 클라이언트가 플러그인 로더 솔루션에 연결됩니다. .

REST 제약 조건은 클라이언트가 서비스 구현에서 분리되는 확장 성이 뛰어난 시스템입니다. 따라서 클라이언트는 웹 브라우저와 마찬가지로 재사용이 가능합니다. 클라이언트와 서비스는 동일한 표준과 어휘를 공유하므로 클라이언트가 서비스의 구현 세부 사항을 모른다는 사실에도 불구하고 서로를 이해할 수 있습니다. 이를 통해 REST 서비스를 찾고 활용하여 목표를 달성 할 수있는 자동화 된 클라이언트를 작성할 수 있습니다. 장기적으로이 고객들은 서로 의사 소통을하고 인간처럼 업무를 통해 서로를 신뢰할 수 있습니다. 이러한 클라이언트에 학습 패턴을 추가하면 단일 서버 파크 대신 머신 웹을 사용하여 하나 이상의 AI가 생성됩니다. 결국 버너스 리의 꿈 : 시맨틱 웹과 인공 지능은 현실이 될 것입니다. 그래서 2030 년에 우리는 스카이 넷에 의해 종료되었습니다. 그때까지 ... ;-)


22

RESTful (Representational State Transfer) API 프로그래밍은 5 가지 기본 소프트웨어 아키텍처 스타일 원칙 에 따라 모든 프로그래밍 언어로 웹 애플리케이션을 작성합니다 .

  1. 자원 (데이터, 정보).
  2. 고유 한 글로벌 식별자입니다 (모든 자원은 URI로 식별됩니다 ).
  3. 균일 한 인터페이스 -단순하고 표준적인 인터페이스 (HTTP)를 사용하십시오.
  4. 표현-모든 통신은 표현에 의해 수행됩니다 (예 : XML / JSON )
  5. 상태 비 저장 (모든 요청은 완전 격리에서 발생하며 캐시 및로드 밸런싱이 더 쉬움),

다시 말해, 각“리소스”가 제공하는 인터페이스의 표준화를 제안하는 RESTful 아키텍처를 구현하여 GET, POST, PUT 또는 DELETE와 같은 동사를 사용하는 HTTP를 통해 간단한 포인트 투 포인트 네트워크 애플리케이션을 작성하고 있습니다. 웹의 현재 기능을 간단하고 효과적인 방식 (고 성공, 입증 및 분산 아키텍처)으로 사용하는 것은 아닙니다. SOAP , CORBARPC 와 같은보다 복잡한 메커니즘에 대한 대안 입니다.

RESTful 프로그래밍은 웹 아키텍처 디자인을 준수하며 올바르게 구현 된 경우 확장 가능한 웹 인프라를 최대한 활용할 수 있습니다.


17

REST의 원래 논문을 단 3 문장으로 줄여야한다면 다음과 같은 본질이 포착됩니다.

  1. 리소스는 URL을 통해 요청됩니다.
  2. 프로토콜은 URL을 사용하여 통신 할 수있는 대상으로 제한됩니다.
  3. 메타 데이터는 이름-값 쌍 (포스트 데이터 및 쿼리 문자열 매개 변수)으로 전달됩니다.

그 후에는 적응, 코딩 규칙 및 모범 사례에 대한 토론에 쉽게 참여할 수 있습니다.

흥미롭게도 논문에 HTTP POST, GET, DELETE 또는 PUT 작업에 대한 언급은 없습니다. 그것은 나중에 "균일 한 인터페이스"에 대한 "모범 사례"에 대한 누군가의 해석이어야합니다.

웹 서비스와 관련하여 인터페이스에 상당한 오버 헤드와 불필요한 복잡성을 추가하는 WSDL과 SOAP 기반 아키텍처를 구별 할 수있는 방법이 필요한 것 같습니다. 또한 구현하려면 추가 프레임 워크와 개발자 도구가 필요합니다. REST가 공통 감지 인터페이스와 WSDL 및 SOAP와 같이 과도하게 엔지니어링 된 인터페이스를 구별하는 가장 좋은 용어인지 확실하지 않습니다. 그러나 우리는 무언가가 필요합니다.


17

REST는 분산 애플리케이션을 작성하는 아키텍처 패턴 및 스타일입니다. 좁은 의미에서 프로그래밍 스타일이 아닙니다.

REST 스타일을 사용한다고 말하는 것은 Tudor 또는 Victorian과 같은 특정 스타일로 집을 지었다고 말하는 것과 유사합니다. 소프트웨어 스타일의 REST와 홈 스타일의 Tudor 또는 Victorian은 모두이를 구성하는 특성과 제한 조건으로 정의 할 수 있습니다. 예를 들어 REST에는 메시지가 자체 설명되는 클라이언트 서버 분리가 있어야합니다. 튜더 스타일 주택에는 겹치는 박공과 지붕이 있으며 앞면을 향한 박공으로 가파르게 구부러져 있습니다. Roy의 논문을 읽고 REST를 구성하는 제약 조건과 품질에 대해 자세히 알아볼 수 있습니다.

홈 스타일과 달리 REST는 일관되고 실용적으로 힘든 시간을 보냈습니다. 의도적 인 것일 수 있습니다. 실제 구현을 디자이너에게 맡기십시오. 따라서 REST 시스템을 작성중인 논문에 설정된 제한 조건을 충족하는 한 원하는대로 자유롭게 수행 할 수 있습니다.

보너스:

전체 웹은 REST를 기반으로합니다 (또는 REST는 웹을 기반으로 함). 따라서 웹 개발자는 훌륭한 웹 앱을 작성할 필요는 없지만 알고 있어야 할 수 있습니다.


17

다음은 REST에 대한 기본 개요입니다. RESTful 아키텍처의 각 구성 요소에 대한 생각을 보여 주어 개념을 이해하는 것이 더 직관적입니다. 바라건대 이것은 일부 사람들의 REST를 이해하는 데 도움이됩니다!

REST (Representational State Transfer)는 네트워크 리소스 (예 : 정보를 공유하는 노드)를 설계하고 해결하는 방법을 간략하게 설명하는 설계 아키텍처입니다. 일반적으로 RESTful 아키텍처는 클라이언트 (요청 시스템) 및 서버 (응답 시스템)가 서버 작동 방식 및 서버 전달 방법을 몰라도 클라이언트가 데이터 읽기, 쓰기 및 업데이트를 요청할 수 있도록합니다. 클라이언트에 대해 알 필요없이 다시 돌아옵니다. 좋아, 근사하지만 우리는 실제로 어떻게 이것을 하는가?

  • 가장 명백한 요구 사항은 서버가 클라이언트에게 요청과 관련하여 수행 할 작업과 서버가 응답 할 수 있도록하기 위해 일종의 범용 언어가 필요하다는 것입니다.

  • 그러나 특정 리소스를 찾은 다음 클라이언트에게 해당 리소스가 어디에 있는지 알려주려면 리소스를 가리키는 일반적인 방법이 필요합니다. 여기에서 URI (Universal Resource Identifier)가 사용됩니다. 기본적으로 리소스를 찾기위한 고유 한 주소입니다.

그러나 REST 아키텍처는 여기서 끝나지 않습니다! 위의 내용은 우리가 원하는 것의 기본 요구 사항을 충족시키는 반면, 특정 서버는 일반적으로 여러 클라이언트의 응답을 처리하므로 대량 트래픽을 지원하는 아키텍처를 원합니다. 따라서 이전 요청에 대한 정보를 기억하여 서버를 압도하고 싶지 않습니다.

  • 따라서 클라이언트와 서버 사이의 각 요청-응답 쌍이 독립적이라는 제한을 적용합니다. 즉, 서버는 새로운 요청에 응답하기 위해 이전 요청 (이전 클라이언트-서버 상호 작용 상태)에 대해 아무것도 기억할 필요가 없습니다. 의뢰. 이것은 우리의 상호 작용이 무국적자가되기를 원한다는 것을 의미합니다.

  • REST는 주어진 클라이언트에 대해 최근에 이미 수행 된 계산을 다시 실행함으로써 서버의 부담을 더욱 완화시키기 위해 캐싱을 허용합니다. 기본적으로 캐싱은 클라이언트에 제공되는 초기 응답의 스냅 샷을 만드는 것을 의미합니다. 클라이언트가 동일한 요청을 다시 수행하면 서버는 초기 응답을 작성하는 데 필요한 모든 계산을 다시 실행하지 않고 클라이언트에 스냅 샷을 제공 할 수 있습니다. 그러나 스냅 샷이므로 스냅 샷이 만료되지 않은 경우 (서버가 만료 시간을 미리 설정) 초기 캐시 이후 응답이 업데이트 된 경우 (즉, 요청이 캐시 된 응답과 다른 응답을 제공함) 클라이언트는 캐시가 만료되거나 캐시가 지워지고 응답이 처음부터 다시 렌더링 될 때까지 업데이트를 볼 수 없습니다.

  • RESTful 아키텍처에 대해 자주 여기에서 마지막으로 다루는 것은 계층화되어 있다는 것입니다. 실제로 클라이언트와 서버 간의 상호 작용에 대한 논의에서이 요구 사항을 이미 암시 적으로 설명했습니다. 기본적으로 이는 시스템의 각 레이어가 인접한 레이어와 만 상호 작용한다는 것을 의미합니다. 따라서 논의에서 클라이언트 계층은 서버 계층과 상호 작용하지만 그 반대의 경우도 있지만 주 서버가 클라이언트와 직접 통신하지 않는 요청을 처리하는 데 도움이되는 다른 서버 계층이있을 수 있습니다. 대신 서버는 필요에 따라 요청을 전달합니다.

이 모든 것이 친숙하게 들린다면 훌륭합니다. 월드 와이드 웹을 통해 통신 프로토콜을 정의하는 HTTP (Hypertext Transfer Protocol)는 RESTful 아키텍처 (또는 OOP 광신자 인 경우 REST 클래스의 인스턴스)의 추상 개념을 구현 한 것입니다. 이 REST 구현에서 클라이언트와 서버는 GET, POST, PUT, DELETE 등을 통해 상호 작용하며, 이는 범용 언어의 일부이며 URL을 사용하여 리소스를 가리킬 수 있습니다.


15

편안한 점은 인터넷 (프로토콜)을 상태 비 저장 전송 계층 으로 사용하면서 상태 저장을 상위 계층으로 분리 하는 것입니다 . 대부분의 다른 접근 방식은 여러 가지를 혼합합니다.

인터넷 시대의 프로그래밍의 근본적인 변화를 처리하는 가장 실용적인 접근 방식이었습니다. 근본적인 변화와 관련하여 Erik Meijer는 http://www.infoq.com/interviews/erik-meijer-programming-language-design-effects-purity#view_93197 에서 쇼에 대한 토론을했습니다 . 그는이를 5 가지 효과로 요약하고 솔루션을 프로그래밍 언어로 디자인하여 솔루션을 제시합니다. 솔루션은 언어에 관계없이 플랫폼 또는 시스템 수준에서 달성 될 수도 있습니다. 편안한 것은 현재의 실습에서 매우 성공적인 솔루션 중 하나로 볼 수 있습니다.

편안한 스타일을 사용하면 신뢰할 수없는 인터넷을 통해 응용 프로그램의 상태를 얻고 조작 할 수 있습니다. 현재 작업이 올바른 현재 상태를 얻는 데 실패하면 응용 프로그램을 계속 진행할 수 있도록 유효성을 검사하는 주체가 필요합니다. 상태를 조작하지 못하면 일반적으로 여러 단계의 확인을 사용하여 상황을 올바르게 유지합니다. 이런 의미에서 휴식은 그 자체가 전체 솔루션이 아니며, 작업을 지원하기 위해 웹 응용 프로그램 스택의 다른 부분에있는 기능이 필요합니다.

이러한 관점에서 볼 때 나머지 스타일은 실제로 인터넷이나 웹 응용 프로그램과 관련이 없습니다. 많은 프로그래밍 상황에 대한 근본적인 솔루션입니다. 또한 간단하지 않고 인터페이스를 정말 단순하게 만들고 다른 기술에 놀라 울 정도로 잘 대처합니다.

그냥 내 2c.

편집 : 두 가지 중요한 측면 :


1
MVC의 관점 : 블로그 나머지 최악의 사례는 하지 제안 모델과 자원을 가미하여 . django의 Two Scoops 책 은 Rest API가 뷰이며 비즈니스 로직을 뷰에 혼합하지 말 것을 제안합니다. 앱의 코드는 앱에 남아 있어야합니다.
minghua

1
또 다른 좋은 기사 : 자원 지향 아키텍처에 관한
WikiPedia

14

이것은 놀랍게도 긴 "토론"이지만 가장 적게 말하기는 상당히 혼란 스럽다.

IMO :

1) 큰 조인트와 많은 맥주가 없으면 편안한 프로그래밍과 같은 것은 없습니다 :)

2) REST (Representational State Transfer)는 Roy Fielding 논문에 지정된 건축 스타일 입니다. 많은 제약이 있습니다. 서비스 / 클라이언트가이를 존중한다면 RESTful입니다. 이거 야.

제약 조건을 요약하면 다음과 같이 요약 할 수 있습니다.

  • 무국적 통신
  • HTTP 스펙 존중 (HTTP가 사용되는 경우)
  • 전송 된 컨텐츠 형식을 명확하게 전달
  • 응용 프로그램 상태 엔진으로 하이퍼 미디어 사용

일을 잘 설명하는 또 다른 아주 좋은 게시물 이 있습니다.

많은 답변이 유효한 정보를 복사 / 붙여 넣기하여 혼합하고 혼란을 더합니다. 사람들은 레벨, RESTFul URI (이런 것은 아닙니다!)에 대해 이야기하고 HTTP 메소드를 적용합니다 .GET, POST, PUT ... REST는 그것에 관한 것이 아닙니다.

예를 들어 링크-아름답게 보이는 API를 사용하는 것이 좋지만 결국 클라이언트 / 서버는 실제로 링크를 얻지 못하고 보내지는 링크는 중요합니다.

결국 컨텐츠 형식을 알고있는 한 RESTful 클라이언트는 모든 RESTful 서비스를 사용할 수 있어야합니다.


14

오래된 질문, 새로운 답변 방법. 이 개념에 대해 많은 오해가 있습니다. 나는 항상 기억하려고합니다 :

  1. 구조화 된 URL과 Http Methods / Verbs는 편안한 프로그래밍의 정의가 아닙니다.
  2. JSON은 편안한 프로그래밍이 아닙니다
  3. RESTful 프로그래밍은 API 용이 아닙니다

나는 편안한 프로그래밍을

클라이언트가 이해하는 미디어 유형으로 리소스 (데이터 + 상태 전이 제어의 조합 임)를 제공하면 애플리케이션이 편안합니다.

편안한 프로그래머가 되려면 행위자가 할 수있는 응용 프로그램을 작성해야합니다. 데이터베이스를 노출시키는 것만이 아닙니다.

상태 전이 제어는 클라이언트와 서버가 자원의 매체 유형 표시에 동의하는 경우에만 의미가 있습니다. 그렇지 않으면 컨트롤이 무엇인지, 컨트롤이 무엇인지, 컨트롤을 실행하는 방법을 알 수있는 방법이 없습니다. IE 브라우저가 <form>html의 태그를 모르는 경우 브라우저 에서 전환 상태로 제출할 것이 없습니다.

나는 스스로 홍보하고 싶지는 않지만 내 아이디어 http://techblog.bodybuilding.com/2016/01/video-what-is-restful-200.html 에서 이러한 아이디어를 심도있게 확장합니다 .

내 이야기에서 발췌 한 내용은 종종 richardson 성숙 모델에 관한 것입니다. 레벨을 믿지 않습니다. 당신은 RESTful (레벨 3)이거나 그렇지 않습니다. 그러나 그것에 대해 부르고 싶은 것은 각 레벨입니다 RESTful로가는 길에 당신을 위해

주석이 달린 리처드슨 성숙 모델



11

당신이 수 "있어야한다"는 사실에 스트레스를하지 않습니다 때까지 REST === HTTP 비유는 정확하지 HATEOAS 기반 .

로이 자신도 여기를 정리했다 .

REST API는 의도 된 대상에 적합한 초기 URI (책갈피) 및 표준화 된 미디어 유형 세트를 넘어 사전 지식없이 입력해야합니다 (즉, API를 사용할 수있는 모든 클라이언트가 이해할 수 있음). 그 시점부터 모든 응용 프로그램 상태 전환은 수신 된 표현에 있거나 사용자가 해당 표현을 조작하여 암시하는 서버 제공 선택 사항에 대한 클라이언트 선택에 의해 구동되어야합니다. 전이는 미디어 유형 및 리소스 통신 메커니즘에 대한 클라이언트의 지식에 의해 결정 (또는 제한 될 수 있음) 될 수 있으며, 이들 모두는 즉석에서 개선 될 수있다 (예를 들어, 주문형 코드).

[여기서의 실패는 대역 외 정보가 하이퍼 텍스트 대신 상호 작용을 주도하고 있음을 의미합니다.]


다른 사람들과 마찬가지로 질문에 대답하지 않지만 관련 정보에 대해 +1합니다!
KGCybeX

나는 이것이 질문에도 대답한다고 생각하지만, 예를 들어 무국적자가 빠져있다. 모든 제약 조건이 중요합니다. 표준 미디어 유형 부분이 항상 사실은 아닙니다. 나는 이해의 층이 있다는 것을 의미합니다. 예를 들어 RDF를 사용하는 경우 미디어 유형을 이해할 수 있지만 내용의 의미는 이해할 수 없습니다. 따라서 고객은 어휘도 알아야합니다. 어떤 사람들은 하이퍼 링크 등을 설명하기 위해 이런 종류의 REST API와 일반적인 REST 어휘를 실험
inf3rno

11

REST 는 웹 표준과 HTTP 프로토콜 (2000 년에 도입)을 기반으로하는 아키텍처 스타일입니다.

REST 기반 아키텍처에서 모든 것은 리소스 (사용자, 주문, 의견)입니다. HTTP 표준 방법 (GET, PUT, PATCH, DELETE 등)을 기반으로 공통 인터페이스를 통해 리소스에 액세스합니다.

REST 기반 아키텍처에는 자원에 대한 액세스를 제공하는 REST 서버가 있습니다. REST 클라이언트는 REST 자원에 액세스하고 수정할 수 있습니다.

모든 리소스는 HTTP 공통 작업을 지원해야합니다. 리소스는 전역 ID (일반적으로 URI)로 식별됩니다.

REST는 자원이 텍스트, XML, JSON 등과 같은 다른 표현을 가질 수 있도록합니다. REST 클라이언트는 HTTP 프로토콜 (콘텐츠 협상)을 통해 특정 표현을 요청할 수 있습니다.

HTTP 메소드 :

PUT, GET, POST 및 DELETE 메소드는 REST 기반 아키텍처에서 일반적으로 사용됩니다. 다음 표는 이러한 작업에 대한 설명입니다.

  • GET은 부작용없이 리소스에 대한 읽기 액세스를 정의합니다. 자원은 절대 GET 요청을 통해 변경되지 않습니다. 예를 들어 요청에 부작용이 없습니다 (등전위).
  • PUT은 새로운 자원을 작성합니다. 또한 dem 등원이어야합니다.
  • DELETE는 자원을 제거합니다. 작업은 dem 등원입니다. 다른 결과로 이어지지 않고 반복 될 수 있습니다.
  • POST는 기존 리소스를 업데이트하거나 새 리소스를 만듭니다.

여러 인용문이 있지만 언급 된 단일 출처는 아닙니다. 이거 어디서 났어?
djvg

10

REST표현 상태 전송을 나타냅니다 .

상태 비 저장 클라이언트 서버 캐시 가능 통신 프로토콜에 의존하며 사실상 모든 경우에 HTTP 프로토콜이 사용됩니다.

REST는 종종 모바일 애플리케이션, 소셜 네트워킹 웹 사이트, 매시업 도구 및 자동화 된 비즈니스 프로세스에서 사용됩니다. REST 스타일은 제한된 수의 연산 (동사)을 사용하여 클라이언트와 서비스 간의 상호 작용이 향상됨을 강조합니다. 자원 (명사)에 고유 한 URI (Universal Resource Indicator)를 지정하여 유연성을 제공합니다.

휴식에 대한 소개


10

말하는 것은 단순히 정보교환하는 것 이상 입니다. 프로토콜은 실제로 대화가 발생하지 않도록 설계되었습니다. 각 당사자는 프로토콜에 지정되어 있기 때문에 자신의 특정 직업이 무엇인지 알고 있습니다. 프로토콜은 가능한 조치에 변화가 생겨도 순수한 정보 교환을 허용합니다. 반면에 말하는 것은 한 당사자가 다른 당사자로부터 어떤 추가 조치를 취할 수 있는지 물어볼 수있게합니다. 상대방의 상태가 중간에 변경되었을 수 있으므로 동일한 질문을 두 번 요청하고 서로 다른 두 가지 답변을 얻을 수도 있습니다. 말하기는 RESTful 아키텍처 입니다. Fielding의 논문 은 단순히 기계가 아닌 기계가 서로 대화 하도록하려는 경우 따라야 할 아키텍처를 지정합니다.의사 소통 .


10

"RESTful programming"자체와 같은 개념은 없습니다. RESTful 패러다임 또는 더 나은 RESTful 아키텍처라고합니다. 프로그래밍 언어가 아닙니다. 패러다임입니다.

Wikipedia에서 :

컴퓨팅에서 REST (Representational State Transfer)는 웹 개발에 사용되는 아키텍처 스타일입니다.


9

휴식의 요점은 기본 작업 (http 동사)에 공통 언어를 사용하기로 동의하는 경우, 캐싱 헤더를 사용하여 캐싱을 전혀 구현하여 인프라를 이해하고 올바르게 최적화하도록 인프라를 구성 할 수 있다는 것입니다. 수준.

적절하게 구현 된 편안한 GET 작업을 통해 정보가 서버의 DB, 서버의 memcache, CDN, 프록시 캐시, 브라우저 캐시 또는 브라우저의 로컬 스토리지에서 제공되는지 여부는 중요하지 않습니다. 최신의 가장 빠른 소스를 사용할 수 있습니다.

Rest는 action 매개 변수와 함께 GET 요청을 사용하는 것에서 사용 가능한 http 동사를 사용하는 것까지의 구문상의 변화라고 말하면 그것이 이점이 없으며 순수하게 미용적인 것처럼 보입니다. 요점은 체인의 모든 부분에서 이해하고 최적화 할 수있는 언어를 사용하는 것입니다. GET 조작에 부작용이있는 조치가있는 경우 모든 HTTP 캐싱을 건너 뛰어야합니다. 그렇지 않으면 결과가 일치하지 않습니다.


5
"휴식을 말하는 것은 구문상의 변화 일뿐입니다. 그것이 이익이없고 순전히 미용적인 것처럼 보이게합니다."--- 그래서 내가 여기서 답변을 읽는 이유입니다. 왜 REST가 순전히 미용 적이 지 않은지 설명하지 않았습니다.
osa

5

API 테스팅 이란 무엇입니까 ?

API 테스트는 프로그래밍을 사용하여 API에 호출을 보내고 수율을 얻습니다. 이 테스트는 테스트중인 세그먼트를 블랙 박스로 간주합니다. API 테스트의 목적은 조정을 앞둔 부분이 응용 프로그램에 올바르게 실행되고 실수로 처리되는지 확인하는 것입니다.

REST API

REST : 대표 상태 이전.

  • 테스터가 요청을 수행하고 응답을받는 기능의 배열입니다. REST API 상호 작용은 HTTP 프로토콜을 통해 이루어집니다.
  • REST는 또한 네트워크를 통해 서로 컴퓨터 간의 통신을 허용합니다.
  • 메시지를 보내고 받으려면 HTTP 메소드를 사용해야하며 웹 서비스와 달리 엄격한 메시지 정의가 필요하지 않습니다.
  • REST 메시지는 종종 XML 또는 JSON (JavaScript Object Notation) 형식으로 양식을 승인합니다.

4 일반적으로 사용되는 API 방법 :-

  1. GET : – 리소스에 대한 읽기 전용 액세스를 제공합니다.
  2. POST : – 새 자원을 작성하거나 업데이트하는 데 사용됩니다.
  3. PUT : – 기존 리소스를 업데이트 또는 교체하거나 새 리소스를 만드는 데 사용됩니다.
  4. 삭제 : – 리소스를 제거하는 데 사용됩니다.

API를 수동으로 테스트하는 단계 :-

API를 수동으로 사용하기 위해 브라우저 기반 REST API 플러그인을 사용할 수 있습니다.

  1. POSTMAN (Chrome) / REST (Firefox) 플러그인 설치
  2. API URL을 입력하십시오
  3. REST 방법을 선택하십시오
  4. 컨텐츠 헤더 선택
  5. 요청 JSON (POST) 입력
  6. 보내기를 클릭하십시오
  7. 출력 응답을 반환합니다

REST API를 자동화하는 단계


5
이것은 정답조차도 아닙니다
실감 나는

5

이것은 어디에서나 언급되지 않지만 Richardson의 성숙도 모델 은 실제로 Restful이 API인지 판단하는 가장 좋은 방법 중 하나입니다. 여기에 대한 자세한 내용 :

리차드슨의 성숙 모형


REST에 대한 Fielding의 제약 조건을 살펴보면 RESTful로 간주하기 위해 API가 RMM의 레이어 3에 도달해야 함을 분명히 알 수 있지만 실제로는 실패 할 가능성이 충분하기 때문에 실제로는 충분하지 않습니다. REST 아이디어-서버 API에서 클라이언트의 분리. 물론 계층 3은 HATEOAS 제약 조건을 충족하지만 여전히 요구 사항을 위반하고 클라이언트를 서버에 단단히 연결하는 것은 쉽습니다 (유형 리소스 사용)
Roman Vottner

2

REST를 이해하는 데 중요한 빌딩 블록은 엔드 포인트 또는와 같은 매핑에 있다고 말합니다 /customers/{id}/balance.

이러한 엔드 포인트가 웹 사이트 (프런트 엔드)에서 데이터베이스 / 서버 (백 엔드)로 연결되는 파이프 라인이라고 생각할 수 있습니다. 이를 사용하여 프론트 엔드는 애플리케이션에서 REST 맵핑의 해당 메소드에 정의 된 백엔드 조작을 수행 할 수 있습니다.

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