REST 대 JSON-RPC? [닫은]


251

웹 응용 프로그램 용 API를 개발하기 위해 REST와 JSON-RPC 중에서 선택하려고합니다. 그들은 어떻게 비교합니까?

업데이트 2015 : 클라이언트와 서버 모두가 이해하는 기존의 성숙한 HTTP 프로토콜을 API에서 활용할 수 있기 때문에 REST를 웹 / HTTP에서 제공되는 API에 대해 개발하고 사용하기가 더 쉽다는 것을 알았습니다. 예를 들어 응답 코드, 헤더, 쿼리, 포스트 바디, 캐싱 및 기타 여러 기능을 추가 노력이나 설정없이 API에서 사용할 수 있습니다.


29
REST는 현재 가장 인기있는 답변입니다. 나는 그것이 항상 정답이라고 확신하지는 않습니다. 자원 중심 REST API와 본질적으로 작업 또는 워크 플로우 기반의 문제 도메인간에 임피던스 불일치가있을 수 있습니다. 동일한 유형의 리소스에 대해 다른 유형의 PATCH를 수행해야하거나 특정 작업이 특정 리소스에 매핑되지 않는 경우 REST 패러다임을 시작해야합니다. 조치 / 명령을 자원으로 사용하십시오. Content-Type 헤더의 명령 유형을 매개 변수로 구별합니까? 하나의 크기에 맞는 모든 답변이 있는지 확실하지 않습니다.
Landon Poch

27
JSON-RPC는 간단하고 일관되며 사용하기 편리합니다.
dnault

1
2015 년 8 월, REST를 사용하여 클라이언트와 서버를 모두 구현했으며 처음 2 일은 배우고 왜 인기가 있는지 이해했습니다. 작은 응용 프로그램이 만들어지면 정말 기뻤습니다. 클라이언트는 다양한 URL 경로, node.js의 서버 및 javascript의 클라이언트가 동일한 구조 (URL 경로)를 공유하여 통신하는 작업을 실제로 수행하지 못했습니다. 와! 제품은 단 15 일 만에 처음부터 작성되어 매우 신속했습니다. REST가가는 길입니다. 또한 인기있는 Apache CouchDB는 훌륭한 데이터베이스 인 REST를 사용하므로 REST에서도 매우 자랑스럽게 생각합니다. 간단히 말해 REST는 깔끔한 인터페이스로 옳습니다 (올바름).
Manohar Reddy Poreddy 4

6
그것은 당신이 가진 제약이나 주요 목표에 달려 있습니다. 예를 들어 성능이 주요 측면 인 경우 JSON-RPC (예 : 고성능 컴퓨팅)를 사용하십시오. 주요 목표가 다른 사람들이 해석 할 수있는 일반 인터페이스를 제공하기 위해 불가지론적인 것이면 갈 길은 REST입니다. 두 가지 목표를 모두 원한다면 두 프로토콜을 모두 포함해야합니다. 당신의 요구는 솔루션을 정의합니다.
Stathis Andronikos

@StathisAndronikos 당신이 옳습니다. 나의 주요 목표는 사용하기 쉽고 웹 응용 프로그램 (HPC 아님)에 대한 좋은 성능이었습니다.
알리 Shakiba

답변:


221

RPC의 근본적인 문제는 커플 링입니다. RPC 클라이언트는 여러 가지 방법으로 서비스 구현과 밀접하게 연결되어 있으며 클라이언트를 중단하지 않고 서비스 구현을 변경하기가 매우 어려워졌습니다.

  • 클라이언트는 프로 시저 이름을 알아야합니다.
  • 절차 매개 변수 순서, 유형 및 개수가 중요합니다. 클라이언트 구현을 중단하지 않고 서버 측에서 프로 시저 서명 (인수, 인수 순서, 인수 유형 등)을 변경하는 것은 쉽지 않습니다.
  • RPC 스타일은 프로 시저 엔드 포인트 + 프로 시저 인수 외에는 아무 것도 노출하지 않습니다. 클라이언트가 다음에 수행 할 작업을 결정하는 것은 불가능합니다.

반면 REST 스타일에서는 표현 (HTTP 헤더 + 표현)에 제어 정보를 포함시켜 클라이언트를 안내하는 것이 매우 쉽습니다. 예를 들면 다음과 같습니다.

  • 이러한 URI의 의미를 전달하는 링크 관계 유형으로 주석이 달린 링크를 포함 할 수 있습니다 (실제로 필수).
  • 클라이언트 구현은 특정 프로 시저 이름 및 인수에 의존 할 필요가 없습니다. 대신 클라이언트는 메시지 형식에 의존합니다. 이를 통해 특정 미디어 형식 (예 : Atom, HTML, Collection + JSON, HAL 등)에 대해 이미 구현 된 라이브러리를 사용할 수 있습니다.
  • 등록 된 (또는 도메인 별) 링크 관계에만 의존하는 한 클라이언트를 중단시키지 않고 URI를 쉽게 변경할 수 있습니다.
  • 최종 사용자가 사람인 경우 양식에 유사한 구조를 표현에 포함하여 클라이언트에게 이러한 설명을 UI 기능으로 표시 할 수 있습니다.
  • 캐싱 지원은 추가 이점입니다.
  • 표준화 된 상태 코드;

REST 측에는 더 많은 차이점과 장점이 있습니다.


20
"의미를 전달하는 링크 관계 유형으로 주석이 달린 링크를 포함해야한다는 것은 무엇을 의미합니까?"
pjz

129
"클라이언트는 프로 시저 이름을 알아야합니다."-REST를 사용하면이 이름이 매개 변수로 전달되는 대신 URI에 하드 코딩되므로 인수가 아닙니다. 그렇지 않으면 서버는 수행해야 할 방법을 알 수 없습니다.
Centurion

44
"클라이언트 구현을 중단하지 않고 서버 측에서 프로 시저 서명을 변경하는 것은 쉽지 않습니다." REST와 JSON-RPC는 모두 SOAP이 아니며 클라이언트 측에서 동적 변경에 사용할 수 있도록 기존 웹 서비스 및 해당 유형을 설명하는 WSDL이 없습니다. 따라서 웹 서비스를 변경하면 클라이언트를 변경해야합니다. 그렇지 않으면 SOAP을 사용해야합니다.
Centurion

64
나는 수많은 앱을 코딩했지만 유연한 웹 서비스를 보지 못했습니다. 백엔드 및 웹 서비스를 변경하는 경우 새로운 요구 사항에 맞게 클라이언트를 항상 리팩터링 / 업데이트해야합니다. SOAP에 대해서는 WSDL과 같이 유연성을 제공하는 무언가가 있기 때문에 결과 세트, 데이터 유형 및 사용 가능한 웹 서비스에 대한 정보를 얻을 수 있기 때문에 무언가를 자동화하고 유연성을 높일 수 있습니다. REST와 다른 사람들에게는 전혀 없습니다. 따라서 REST, JSON-RPC 및 기타 웹 서비스 유형도 수동 클라이언트 업데이트가 필요없는 마술을 제공합니다.
센츄리

15
저의 현재 팀과 이전 팀의 경우 RESTful 웹 서비스는 CRUD 유형 응용 프로그램을위한 것입니다. "서버에서 무언가가 변경 될 때마다 브라우저를 다시 작성합니까?" -아니요, 브라우저는 HTTP 실행 프로그램이므로 비즈니스 로직과 관련이 없으며 클라이언트 프로그램이 구현해야합니다 (화면 표시, 관련 작업 수행). 우리는 화염 전쟁을 시작한 것처럼 보이지만 일반적으로 실제 사용 흐름과 함께 당신이 언급하는 마법의 유연성을 갖춘 RESTfull 웹 서비스를위한 또 다른 견고한 소스를 갖고 싶습니다. 한편 많은 진술이 모호하다.
센츄리

163

이 문제를 좀 더 자세히 살펴보고 순수 REST가 너무 제한적이며 RPC가 가장 좋습니다. 대부분의 앱은 CRUD 앱입니다. REST를 고수하면 결국 특별한 목적을 위해 API에 다른 필요한 메소드를 쉽게 추가하는 방법에 대해 궁금해 할 것입니다. 대부분의 경우 REST로이를 수행하는 유일한 방법은 다른 컨트롤러를 작성하는 것인데, 이는 프로그램을 과도하게 복잡하게 만들 수 있습니다.

RPC를 결정할 경우 유일한 차이점은 동사를 URI의 일부로 명시 적으로 지정한다는 것입니다. 이는 명확하고 일관되며 버그가 적으며 실제로 문제가 없습니다. 특히 간단한 CRUD를 넘어서는 앱을 만드는 경우 RPC가 유일한 방법입니다. RESTful 순수 주의자에게 또 다른 문제가 있습니다 .HTTP POST, GET, PUT, DELETE는 HTTP에서 명확한 의미를 지니고 있습니다 .HTTP에서 REST가 다른 것들을 의미하는 것으로 바 꾸었습니다.

프로그래밍에서, 나는 두 가지를 의미하기 위해 한 가지를 사용하려고 시도하는 것이 언젠가 와서 물릴 것이라는 것을 발견했습니다. 필자는 메소드가 필요로하는대로 데이터를 자유롭게 보내고받을 수 있기 때문에 거의 모든 작업에 POST를 사용할 수있는 기능을 원합니다. 전 세계를 CRUD에 맞출 수는 없습니다.


30
이 답변은 REST가 실제로 무엇인지에 대한 일반적인 오해를 보여줍니다. REST는 CRUD와 HTTP 메소드의 매핑이 아닙니다. "다른 방법을 추가"하는 것이 문제라는 생각은 REST가 HTTP를 통한 RPC로 잘못 이해되었다는 것을 나타내며, 전혀 그렇지 않습니다. Roy Fieldings 블로그 또는 그의 논문을 읽어보십시오-Google에서 도움을 줄 것입니다-귀하의 답변에 REST를 전혀 설명하지 않습니다.
nepdev

68
나는 매우 실용적인 사람입니다. 내가 읽은 REST에 대한 모든 설명은 CRUD를 HTTP 메소드에 맵핑하는 것으로 시작됩니다. 이론적으로는 더 추가 할 수 있지만 실제로는 그렇지 않습니다. 예를 들어 최근에 Android 장치에 PATCH를 구현하고 싶었지만 Android에서 PATCH를 허용하지 않는 것을 발견했습니다. 따라서 URI에서 해당 효과에 대해 명시 적으로 정의 된 작업과 함께 POST를 사용했습니다. 기본적으로 순수 REST는 필요한 작업을 수행하지 않으므로 작동하는 것을 사용합니다.
브루스 파틴

4
따라서 @BrucePatin, 버전 "REST"에는 GET | PUT | POST | DELETE? 일부 프레임 워크는 그렇게하지만 REST는 아닙니다. HTTP 동사는 주어진 요청의 의미에 대해 모호한 추상 주장을합니다. 엔드 포인트를 해당 클래스에 적절하게 맵핑해야합니다. GET은 많은 다른 종점에 매핑 될 수 있으므로 다른 끝점에도 가능합니다. 실제로 HTTP를 통해 REST-ful JSON-RPC를 구현할 수없는 이유는 없습니다.
spinkus

5
아주 좋은 이유가 있습니다. 수십 가지 작업을 원할 수 있으며 PATCH를 지원하지 않는 일반적인 용도 (Android)로 이미 실행되었습니다. 추워요. 규칙에 대한 몇 가지 예외를 처리해야하는 것보다 오히려 일관성이 있습니다. 일반적으로 GET, POST 및 DELETE 만 사용하겠습니다. PUT은 업데이트 작업에 대한 피드백을 허용하지 않습니다. 나는 거의 모든 것에 POST를 사용하고 있습니다. 캐싱과 관련하여 오래된 데이터를 반환하여 많은 문제가 발생했습니다. POST에 매개 변수를 넣는 것과 관련하여 ASP.NET은 이미 자동 JSON 개체에서 자동으로 처리합니다.
Bruce Patin

22
REST가 실제로 무엇인지에 대한 논쟁은 귀하의 의견을 강조하고 REST의 주요 단점을 강조합니다. 개념적으로 RESTful에 완전히 동의하는 두 사람을 찾는 것은 어렵습니다. 어쨌든 문서화되지 않은 RPC 또는 REST를 수행 해야하는 서비스가 없기 때문에 중요하지 않습니다. 문서화되어 있으면이를 사용하는 개발자는 아무런 문제가 없어야합니다.
Agile Jedi

29

첫째, HTTP-REST는 "표현 상태 전송"아키텍처입니다. 이것은 많은 흥미로운 것들을 암시합니다.

  • API는 상태 비 저장이므로 설계하기가 훨씬 쉬워지고 (복잡한 오토 마톤에서 전환을 잊어 버리기가 매우 쉽습니다) 독립 소프트웨어 부분과 통합 할 수 있습니다.
  • 캐시 방식으로 쉽게 통합 할 수있는 안전한 방법으로 읽기 방법을 설계 하게됩니다.
  • 타임 아웃을 훨씬 더 잘 처리 할 수있는 디자인 쓰기 방법을 dem 등식 으로 설계 하게됩니다.

둘째, HTTP-REST는 HTTP와 완벽하게 호환되므로 (이전 부분의 "안전한"및 "등가"참조) HTTP 라이브러리 (기존의 모든 언어에 존재)와 HTTP 리버스 프록시를 재사용 할 수 있습니다. 코드가없는 고급 기능 (캐시, 인증, 압축, 리디렉션, 재 작성, 로깅 등)을 구현할 수 있습니다.

마지막으로 HTTP를 RPC 프로토콜로 사용하는 것은 HTTP 1.1 (및 REST 발명자) 디자이너 http://www.ics.uci.edu/~fielding/pubs/dissertation/evaluation 에 따르면 큰 오류 입니다. htm # sec_6_5_2


1
권위있는 사람-누가 알아야 할 참조 +1 + .. 해킹 / 해결 방법으로 인정하지 않고 RPC over HTTP에 대해서는 논쟁하기 어렵다 ....
RJB

9
방금 2000에서 무언가를 참조했습니다. REST 대 RPC에 대한 철학적 인 주장입니다. 의미 론적으로 RPC 패턴을 적용하면 URI를 "프로 시저"로, 인코딩 된 매개 변수를 ... 잘 ... 매개 변수로 쉽게 간주 할 수 있습니다. 어느 패턴이든 HTTP보다 잘 작동합니다. SOAP, RAILS 또는 HTTP에 오버레이 된 다른 수의 패턴 / 프로토콜과 동일합니다. 계약을 위반하지 않는 일관된 API를 제공하는 한 중요하지 않습니다.
Agile Jedi

Aurélien, 왜 REST가 독립 소프트웨어 부품과 통합하기 쉬운 지 정당화 할 수 있습니까? RESTful API 또는 RPC를 사용하든 관계없이 클라이언트 소프트웨어는 API가 말하는 형식을 알아야합니다.
Alexey

1
@Alexey이 인수는 상태 비 저장과 관련이 있습니다. 누구의 API입니다 커피 머신 통합하는 것이 더 쉽습니다 CREATE CUP포함 할 것이라고 다른 것보다 INSERT COIN, SELECT COFFEE, SELECT SUGAR,와 START. 두 번째 API는 머신 상태에 따라 다르므로 프로 시저 호출 순서에 매우주의해야합니다.
Aurélien

1
RPC 프로토콜 인 HTTP REST입니다. 그래서 당신의 잘못된 해석은 놀랍게도 반대입니다.
Tiberiu-Ionuț Stan

24

훌륭한 답변-일부 의견을 명확히하고 싶었습니다. JSON-RPC는 빠르고 사용하기 쉽지만 언급 된 리소스와 매개 변수가 밀접하게 결합되어 있으며 REST는 느슨하게 결합 된 자원 (api / HTTP REST API에서 여러 HTTP 메소드 (GET, POST, PUT, PATCH, DELETE)를 사용합니다. REST는 경험이 부족한 개발자가 구현하기가 약간 어렵지만 이제는 스타일이 상당히 일반화되어 장기적으로 훨씬 더 많은 유연성을 제공합니다 (API 수명 연장).

REST는 리소스가 밀접하게 결합되지 않은 상태에서 단일 컨텐츠 유형에 전념하지 않도록합니다. 즉, 클라이언트가 XML, JSON 또는 YAML로 데이터를 수신해야하는 경우 시스템에 내장 된 경우 content-type / accept 헤더를 사용하는 것을 반환하십시오.

이를 통해 새로운 컨텐츠 유형 또는 클라이언트 요구 사항을 지원할 수 있도록 API를 유연하게 유지할 수 있습니다.

그러나 REST를 JSON-RPC와 진정으로 분리시키는 것은 아키텍처 유연성을 보장하면서 신중하게 고려 된 일련의 제약 조건을 따른다는 것입니다. 이러한 제약 조건에는 클라이언트와 서버가 서로 독립적으로 진화 할 수 있도록하는 것 (클라이언트의 응용 프로그램을 망칠 필요없이 변경 가능), 호출이 상태 비 저장 (상태가 하이퍼 미디어를 통해 표시됨), 상호 작용을위한 균일 한 인터페이스 제공, API는 계층화 된 시스템에서 개발되며 클라이언트가 응답을 캐시 할 수 있습니다. 주문형 코드를 제공하기위한 선택적 제약도 있습니다.

그러나이 모든 말로-MOST API는 하이퍼 미디어 (API 탐색을 돕는 응답에 포함 된 하이퍼 텍스트 링크)를 포함하지 않기 때문에 RESTing (Fielding에 따르면)이 아닙니다. 대부분의 API는 REST와 유사하며 REST의 개념 대부분을 따르지만이 제한 조건은 무시한다는 점에서 REST와 유사합니다. 그러나 점점 더 많은 API가이를 구현하고 있으며 더 많은 주류 관행이되고 있습니다.

또한 RPC 경로와 마찬가지로 하이퍼 미디어 기반 API (예 : Stormpath)가 클라이언트를 URI로 향하게하기 때문에 유연성이 있습니다 ( 어떤 경우 변경 없이 부정적인 영향을주지 않고 URI를 수정할 수 있음). 공전. RPC를 사용하면 이러한 서로 다른 URI를 광범위하게 문서화하고 서로 관련하여 작동하는 방식을 설명해야합니다.

일반적으로, 오래 지속되는 확장 가능하고 유연한 API를 구축하려는 경우 REST를 사용하는 것이 좋습니다. 이런 이유로, 나는 그것이 시간의 99 %를가는 경로라고 말할 것입니다.

행운을 빌어, 마이크


3
약간 어렵지는 않지만 오히려 훨씬 더 어렵습니다. 나는 그것을 4 개월 정도 이해하려고 노력했지만 여전히 json을 사용하여 http를 통해 stateless RPC로 전개되지 않는 서비스를 작성하는 방법을 잘 알고 있지는 않지만 여전히 확신하지 못한다. "REST"그리고 내가 방금 말한 사이의 진정한 차이있다
Austin_Anderson

19

IMO의 핵심은 행동 대 자원 지향입니다. REST는 자원 지향적이며 CRUD 조작에 적합하며 알려진 의미론을 고려하면 첫 번째 사용자에게 일부 예측 가능성을 제공하지만 메소드 또는 프로 시저에서 구현되면 자원 중심 세계에 인공 번역을 제공해야합니다. 반면에 RPC는 CRUD 가능 리소스 세트가 아닌 서비스를 제공하는 작업 지향 API에 완벽하게 적합합니다.

의심 할 여지없이 REST가 더 널리 사용되므로 API를 타사에 노출하려는 경우 확실히 몇 가지 사항이 추가됩니다.

그렇지 않은 경우 (예 : SPA에서 AJAX 프런트 엔드를 생성하는 경우) RPC를 선택합니다. 특히 JSON-RPC, 설명 언어로 JSON 스키마와 결합되고 사용 사례에 따라 HTTP 또는 웹 소켓을 통해 전송됩니다.

JSON-RPC 는 동기식 또는 비동기식 RPC에 사용될 요청 및 응답 JSON 페이로드를 정의하는 간단하고 세련된 사양입니다.

JSON 스키마 는 JSON 데이터를 설명하기위한 JSON 기반 형식을 정의하는 초안 사양입니다. JSON 스키마를 사용하여 서비스 입력 및 출력 메시지를 설명하면 유용성을 떨어 뜨리지 않고 메시지 구조가 임의로 복잡해지고 서비스 통합이 자동화 될 수 있습니다.

전송 프로토콜 (HTTP 및 웹 소켓)의 선택은 다양한 요소에 따라 달라지며, HTTP 기능 (캐싱, 유효성 재확인, 안전성, dem 등성, 콘텐츠 유형, 멀티 파트 등)이 필요한지 또는 응용 프로그램을 상호 교환해야하는지 여부가 가장 중요합니다 높은 빈도의 메시지.

지금까지는 문제에 대한 개인적인 견해가 많았지 만 이제는이 줄을 읽는 Java 개발자에게 실제로 도움이 될 수있는 것입니다. 작년 동안 내가 해왔 던 프레임 워크는 지금 궁금해하는 것과 같은 질문에서 시작되었습니다. :

http://rpc.brutusin.org

기능 테스트를위한 내장 저장소 브라우저 (JSON 스키마 덕분에) 및 일련의 예제 서비스를 보여주는 라이브 데모를 여기에서 볼 수 있습니다.

http://demo.rpc.brutusin.org

그것이 배우자를 돕기를 바랍니다!

나쵸


친절한 정신을 찾는 것이 좋습니다! 내가 이상 여기에 비슷한 중이 야 : github.com/dnault/therapi-json-rpc
dnault

:) 내가 살펴 볼게요
idelvall

1
이것에 동의하십시오. 분명한 POST / GET / PUT / DELETE [PoGPuD? ;)] 매핑. 그러나 API 해당 동사에 편안하게 맞지 않으면 동사가 문제를 혼란스럽게하기 때문에 JSON-RPC가 좋은 옵션 일 수 있습니다. 그래서, 누가 그것을 사용하고 있으며 왜 큰 요인입니까?
Algy Taylor

1
정확히-REST는 명사의 왕국이며 JSON-RPC는 동사입니다.
Rob Grant

16

서비스가 모델 및 GET / POST / PUT / DELETE 패턴에서만 제대로 작동하는 경우 순수 REST를 사용하십시오.

HTTP는 원래 상태 비 저장 응용 프로그램 용으로 설계되었다는 데 동의합니다.

그러나 웹 소켓을 사용하고자하는 현대적이고 더 복잡한 (!) 실시간 (웹) 애플리케이션의 경우 (주로 상태 저장을 의미 함) 두 가지를 모두 사용하지 않는 이유는 무엇입니까? 웹 소켓을 통한 JSON-RPC는 매우 가볍기 때문에 다음과 같은 이점이 있습니다.

  • 모든 클라이언트에서 즉시 업데이트 (모델 업데이트를 위해 자체 서버 간 RPC 호출 정의)
  • 복잡성을 추가하기 쉬움 (REST 만 사용하여 Etherpad 복제본 만들기)
  • 제대로 수행하면 (실시간에 추가로 RPC 만 추가) 대부분은 REST로만 계속 사용할 수 있습니다 (주요 기능이 채팅 등인 경우 제외)

서버 측 API 만 설계 할 때 REST 모델 정의부터 시작하여 나중에 RPC 호출 수를 최소로 유지하면서 필요에 따라 JSON-RPC 지원을 추가하십시오.

(괄호 남용으로 죄송합니다)


15

나는 과거에 REST를 좋아했으며 RPC on paper보다 많은 이점을 가지고 있습니다. 클라이언트에게 다양한 컨텐츠 유형, 캐싱, HTTP 상태 코드 재사용을 제공 할 수 있으며 API를 통해 클라이언트를 안내 할 수 있으며 API 자체에 설명이없는 경우 API에 문서를 포함시킬 수 있습니다.

그러나 내 경험에 따르면 실제로 이것은 유지되지 않으며 대신 모든 것을 올바르게하기 위해 많은 불필요한 작업을 수행합니다. 또한 HTTP 상태 코드는 종종 도메인 논리에 정확하게 매핑되지 않으며 컨텍스트에서 코드를 사용하는 경우가 종종 있습니다. 그러나 제 생각에 REST에 대한 최악의 점은 리소스와 리소스가 허용하는 상호 작용을 디자인하는 데 많은 시간을 소비한다는 것입니다. 그리고 API에 몇 가지 중요한 추가 기능을 추가 할 때마다 새로운 기능을 추가 할 수있는 좋은 솔루션을 찾고 있으며 이미 구석에 자신을 디자인하지 않았기를 바랍니다.

대부분의 경우 이미 원격 프로 시저 호출 집합으로 API를 모델링하는 방법에 대해 완벽하고 훌륭하고 명백한 아이디어를 가지고 있기 때문에 이것은 종종 시간 낭비처럼 느껴집니다. REST의 제약 조건 내에서 문제를 모델링하기 위해이 모든 노력을 기울인다면 다음 문제는 클라이언트에서 호출하는 방법입니다. 우리의 프로그램은 호출 프로 시저를 기반으로하므로 좋은 RPC 클라이언트 라이브러리를 작성하는 것은 쉽지 않습니다. 좋은 REST 클라이언트 라이브러리를 그렇게 많이 구축하지 않으며 대부분의 경우 서버의 REST API에서 클라이언트의 프로 시저 세트로 다시 맵핑합니다. 도서관.

이 때문에 RPC는 오늘날 훨씬 단순하고 자연스럽게 느껴집니다. 내가 정말로 그리워하는 것은 자체 설명하고 상호 운용 가능한 RPC 서비스를 쉽게 작성할 수있는 일관된 프레임 워크입니다. 따라서 나 자신을 위해 RPC를 더 쉽게 만들 수있는 새로운 방법을 실험하기 위해 내 자신의 프로젝트를 만들었고 다른 누군가도 유용하다고 생각할 수도 있습니다. https://github.com/aheck/reflectrpc


OpenRPC를 확인하십시오. "자체 설명 및 상호 운용이 가능한 RPC 서비스를 쉽게 작성할 수 있어야합니다"
Belfordz

11

에 따르면 리처드슨의 성숙도 모델 , 문제는 아니다 REST 대에 RPC ,하지만 얼마나 REST ?

이 관점에서 REST 표준 준수는 4 가지 수준으로 분류 할 수 있습니다.

  • 레벨 0 : 조치 및 매개 변수 측면에서 생각하십시오. 이 기사에서 설명 하듯 이 이는 본질적으로 JSON-RPC와 동일합니다 (이 기사에서는 XML-RPC에 대해 설명하지만 두 가지 모두에 대해 동일한 인수가 사용됨).
  • 1 단계 : 자원 측면에서 생각하십시오. 자원과 관련된 모든 것은 동일한 URL에 속합니다
  • 레벨 2 : HTTP 동사 사용
  • 3 단계 : 증오

REST 표준의 작성자에 따르면 레벨 3 서비스 만 RESTful이라고 할 수 있습니다. 그러나 이것은 품질이 아닌 컴플라이언스 메트릭입니다 . 계산을 수행하는 원격 함수를 호출하려는 경우 응답에 관련 하이퍼 미디어 링크가 있거나 사용 된 HTTP 동사를 기반으로하는 동작 구분이없는 것이 의미가 없습니다. 따라서 이러한 호출은 본질적으로 RPC와 유사한 경향이 있습니다. 그러나 컴플라이언스 수준이 낮다고해서 반드시 상태 저장 또는 높은 커플 링을 의미하는 것은 아닙니다. 아마도 REST 대 RPC 를 생각하는 대신 가능한 한 많은 REST를 사용해야하지만 더 이상은 사용하지 않아야합니다. RESTful 준수 표준에 맞게 애플리케이션을 왜곡하지 마십시오.


1
레벨 0, 1 및 2의 경우 +1입니다. 그러나 HATEOS의 성공적인 구현을 본 적이 없지만 두 번의 실패한 시도는 보지 못했습니다.
mjhm

8

왜 JSON RPC인가 :

REST API의 경우 필요한 각 기능 / 방법에 대한 컨트롤러를 정의해야합니다. 결과적으로 클라이언트가 액세스 할 수있는 10 개의 메소드가있는 경우 클라이언트의 요청을 특정 메소드에 인터페이스하기 위해 10 개의 컨트롤러를 작성해야합니다.

또 다른 요인은 각 방법 / 기능에 따라 서로 다른 컨트롤러가 있지만 클라이언트는 POST 또는 GET을 사용해야한다는 점을 기억해야합니다. 이것은 일을 더욱 복잡하게 만듭니다. 데이터를 보내려면 POST를 사용하는 경우 요청의 내용 유형을 설정해야합니다.

JSON RPC의 경우 대부분의 JSONRPC 서버는 POST HTTP 메소드에서 작동하고 컨텐츠 유형은 항상 application / json이므로 작업이 크게 단순화됩니다. 클라이언트 측에서 적절한 HTTP 메소드 및 컨텐츠 설정을 사용하는 것을 기억해야합니다.

서버가 클라이언트에 노출시키려는 다양한 방법 / 기능에 대해 별도의 컨트롤러를 만들 필요는 없습니다.

왜 REST인가 :

서버가 클라이언트 측에 노출시키려는 다른 기능에 대한 별도의 URL이 있습니다. 결과적으로 이러한 URL을 포함 할 수 있습니다.

이러한 요점의 대부분은 논쟁의 여지가 있으며 사람의 필요에 전적으로 달려 있습니다.


3

항상 그렇듯이, 그것은 달려 있다고 생각합니다 ...

REST는 광범위한 대중 지원이라는 큰 장점을 가지고 있으며 이는 많은 도구와 책을 의미합니다. 여러 조직의 많은 소비자가 사용하는 API를 만들어야하는 경우 한 가지 이유만으로도 인기가 있습니다. 프로토콜은 물론 명령을 URL / 동사 / 응답에 매핑하는 방법이 너무 많기 때문에 전체 실패입니다.

따라서 백엔드와 통신 해야하는 단일 페이지 웹 응용 프로그램을 작성할 때 REST가 너무 복잡하다고 생각합니다. 이 상황에서는 앱과 API가 함께 진화 할 수 있으므로 장기 호환성에 대해 걱정할 필요가 없습니다.

한 번에 단일 페이지 웹 응용 프로그램을 위해 REST로 시작했지만 웹 응용 프로그램과 서버 사이의 세분화 된 명령으로 인해 빠르게 미쳤습니다. 경로 매개 변수로 인코딩해야합니까? 몸에? 쿼리 매개 변수? 헤더? URL / Verb / Response 디자인 후 Javascript, Java의 디코더 로이 엉망을 코딩 한 다음 실제 메소드를 호출해야했습니다. 많은 도구가 있지만 도메인 코드에서 HTTP 의미를 얻지 못하는 것은 정말 까다로운 작업입니다. (응집력)

중간 규모의 복잡한 사이트에 Swagger / OpenAPI 파일을 만들어 해당 파일의 원격 프로 시저를 설명하는 단일 Java 인터페이스와 비교해보십시오. 복잡성이 증가하고 있습니다.

따라서 단일 페이지 webapp에 대해 REST에서 JSON-RPC로 전환했습니다. a 서버에서 Java 인터페이스를 인코딩하여 브라우저에 제공 한 작은 라이브러리를 개발했습니다. 브라우저에서 이것은 각 함수에 대한 약속을 반환하는 응용 프로그램 코드에 대한 프록시를 만들었습니다.

다시 말하지만 REST는 유명하기 때문에 잘 지원되고 있습니다. 기본 상태 비 저장 리소스 철학과 계층 적 모델을 인식하는 것도 중요합니다. 그러나 이러한 원칙은 RPC 모델에서도 쉽게 사용할 수 있습니다. JSON은 HTTP를 통해 작동하므로이 영역에서 REST와 동일한 장점을 갖습니다. 차이점은 필연적으로 이러한 원칙에 잘 맞지 않는 이러한 기능을 실행할 때 불필요한 작업을 많이 수행하지 않아도된다는 것입니다.


1
이 답변을 통해 GraphQL과 JSON-RPC의 유사점과 GraphQL이 SPA에 널리 사용되는 이유를 알 수있었습니다.
Dennis

OpenRPC는 OpenAPI를 / 자신감에 동등하지만, JSON-RPC에 대한
Belfordz

1

REST는 HTTP와 밀접하게 연결되어 있으므로 API over HTTP 만 공개하는 경우 REST는 대부분의 상황에 적합합니다. 그러나 메시징 또는 웹 소켓과 같은 다른 전송을 통해 API를 노출해야하는 경우 REST는 적용 할 수 없습니다.


2
REST는 아키텍처 스타일이며 프로토콜에 따라 다릅니다.
Mark Cidade 2018 년

4
당신이 옳습니다 REST는 건축 원칙입니다. 그러나 이론적 토대는 HTTP 프로토콜의 영향을 많이 받았으며 보편적 인 적용 가능성에 대한 주장에도 불구하고 웹 도메인 이외의 실용적인 응용 프로그램을 찾지 못했습니다. 따라서 누군가 REST를 언급 할 때 아키텍처 원칙이 아니라 웹 서비스를 참조한다고 말하는 것이 안전합니다.
dtoux

1

이해하기 쉬운 웹 애플리케이션 용 API를 개발하려면 REST와 JSON-RPC 중에서 JSON-RPC를 선택하는 것이 좋습니다. 메소드 호출 및 통신에 대한 맵핑을 쉽게 이해할 수 있으므로 JSON-RPC가 선호됩니다.

가장 적합한 접근법을 선택하는 것은 제약이나 주요 목표에 달려 있습니다. 예를 들어 성능이 주요 특성 인 경우 JSON-RPC (예 : 고성능 컴퓨팅)를 사용하는 것이 좋습니다. 그러나 다른 사람들이 추론 할 수있는 일반적인 인터페이스를 제공하기 위해 주요 목표가 불가지론이라면 REST를 사용하는 것이 좋습니다. 두 가지 목표를 모두 달성해야하는 경우 두 프로토콜을 모두 포함하는 것이 좋습니다.

실제로 REST를 JSON-RPC와 분리하는 사실은 아키텍처 유연성을 확인하는 신중하게 고려 된 일련의 제약 조건을 따르는 것입니다. 제약 조건은 클라이언트와 서버가 서로 독립적으로 성장할 수 있도록 (클라이언트의 응용 프로그램을 망칠 필요없이 변경 가능), 호출은 상태 비 저장 (상태는 하이퍼 미디어로 간주 됨), 균일 함을 보장합니다. 인터페이스는 상호 작용을 위해 제공되며 API는 계층 시스템에서 고급화됩니다 (Hall, 2010). JSON-RPC는 빠르며 소비하기 쉽지만, 언급 된 리소스와 매개 변수가 밀접하게 연결되어 있고 GET / POST를 사용하는 동사 (api / addUser, api / deleteUser)에 의존하는 반면 REST는 느슨하게 연결된 리소스 (api / users)를 HTTP에 추가하십시오. REST API는 GET, PUT, POST, DELETE, PATCH와 같은 여러 HTTP 메소드에 의존합니다.

가벼운 데이터 교환 형식 인 JSON (JavaScript Object Notation으로 표시)은 사람이 읽고 쓸 수 있습니다. 기계가 구문 분석하고 생성하는 데 어려움이 없습니다. JSON은 전적으로 언어에 독립적 인 텍스트 형식이지만 C #, C, C ++, Java, Perl, JavaScript, Python 및 기타 여러 언어로 구성된 언어 제품군의 프로그래머에게 익숙한 규칙을 실행합니다. 이러한 속성으로 인해 JSON은 완벽한 데이터 교환 언어이며 더 나은 선택이 가능합니다.


"기계가 파싱하는 번거 로움이 없습니다."-JSON이 많이 손상되었습니다 (예 : 페이로드에서 이스케이프되지 않은 따옴표)
alancalvitti

1

잘못된 질문 : 존재하지 않는 manichean을 부과합니다!

JSON-RPC를 "less verb"( 메소드 없음 )와 함께 사용 하고 sendo id, 매개 변수, 오류 코드 및 경고 메시지에 필요한 최소한의 표준화를 유지할 수 있습니다. JSON-RPC 표준은 "휴식을 할 수 없습니다"라고 말하지 않고 기본 정보를 포장하는 방법 만 말합니다.

"REST JSON-RPC"가 존재합니다 ! 간단하고 확실한 계약을 통해 최소한의 정보 패킹을 위해 "모범 사례"가 포함 된 REST입니다.


( 이 답변 과 교훈적인 맥락에서)

REST를 다룰 때 일반적으로 자원 측면에서 생각하는 것이 좋습니다. 이 경우 리소스는 "은행 계좌"가 아니라 해당 은행 계좌의 거래입니다. 그러나 JSON-RPC는 "method"매개 변수를 의무화하지 않으며 모두 엔드 포인트의 "경로"로 인코딩됩니다.

  • REST 예금POST /Bank/Account/John/TransactionJSON 요청과 {"jsonrpc": "2.0", "id": 12, "params": {"currency":"USD","amount":10}}.
    JSON 응답은 다음과 같습니다.{"jsonrpc": "2.0", "result": "sucess", "id": 12}

  • REST Withdraw with POST /Bank/Account/John/Transaction...와 유사합니다.

  • ... GET /Bank/Account/John/Transaction/12345@13... 정확한 거래에 대한 JSON 레코드를 반환 할 수 있습니다 (예 : 사용자는 일반적으로 자신의 계정에 차변 및 크레딧 레코드를 원함). 로 뭔가 {"jsonrpc": "2.0", "result": {"debits":[...],"credits":[...]}, "id": 13}. (REST) ​​GET 요청에 대한 규칙은 "@id"로 id 인코딩을 포함 할 수 있으므로 JSON을 보낼 필요는 없지만 응답 팩에서 여전히 JSON-RPC를 사용합니다.



0

리소스를 요청하면 설계 상 RESTful API가 더 좋습니다. 간단한 CRUD 이외의 많은 매개 변수와 복잡한 방법으로 복잡한 데이터를 요청하는 경우 RPC가 올바른 방법입니다.


이것은 주제를 지나치게 단순화 한 것입니다. 특히 "디자인 상 더 낫다"는 이유는 무엇입니까? JSON-RPC는 간단 수 없습니다 또는 그 인수가 매개 변수와 복잡한 방법을 많이 "를 '더 나은'되고, 그래서 당신이 원하는대로 복잡하고"또한 거짓 수 있습니다 그것은이 문제에 더 좋거나 더 나쁜..
Belfordz

RPC가 JSON 또는 프로토 타입 또는 XML을 사용하여 데이터를 직렬화하는지 여부는 중요하지 않습니다. 요점은 내가 말한 API입니다. 나는 모든 경우에 하나가 다른 것보다 낫다는 것을 의미하지는 않습니다. 그러나 두 구현 중에서 선택할 때 매개 변수와 메소드가 중요하다고 생각합니다. 단순하다면 RESTful API는 대부분의 프로그래머가 잘 이해하고 있으며 http 요청을 쉽게 구성 할 수 있습니다. 복잡하다면 RPC가 그러한 API를 더 잘 표현할 수 있으며 IDE와 컴파일러가이를 도와 줄 수 있습니다.
Adrian Liu

-1

RPC 프로토콜에 vdata를 사용합니다 : http://vdata.dekuan.org/

1, PHP와 JavaScript는 모두 괜찮습니다. 2, CORS (Cross-origin resource sharing) 통화는 여전히 괜찮습니다.

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