문제

저는 PHP 애플리케이션용 웹 서비스를 구현 중이며 표준 웹 서비스와 RESTful 웹 서비스가 모두 제공해야 하는 것이 무엇인지 이해하려고 노력하고 있습니다.내 의도는 개발자가 "원격 개체를 인스턴스화"하고 사용할 수 있도록 웹 서비스 세부 정보를 추상화하는 래퍼 코드를 작성하는 것입니다.내 생각은 다음과 같습니다. 아마도 여러분 중 일부는 자신의 경험을 추가하고 이를 확장할 수 있습니다.

RESTful 웹 서비스

기본적으로 "주문형 XML 피드"입니다.다음과 같은 방식으로 서버 애플리케이션을 쿼리할 수 있도록 클라이언트 애플리케이션에 대한 래퍼 코드를 작성할 수 있습니다.

$users = Users::getUsers("state = 'CO'");
  • 그러면 원격 URL로부터 XML 피드를 얻게 됩니다.
  • $users는 전체 User 객체의 컬렉션으로 만들 수 있습니다.
  • XML로 남겨두거나
  • 배열 등으로 바뀌었습니다.
  • 쿼리 스크립트("state = 'CO'")는 서버 측에서 SQL로 변환됩니다.
  • RESTful 웹 서비스는 일반적으로 클라이언트 보기에서 읽기 전용이지만 POST 또는 GET을 사용하여 서버를 변경할 수 있는 코드를 작성할 수 있습니다.보안을 위해 암호화된 토큰을 전달합니다. 예:

    $users = 사용자::addUser($encryptedTrustToken, 'jim',$encryptedPassword, '제임스', '테일러');

그러면 서버 응용 프로그램에 새 사용자가 생성됩니다.

표준 웹 서비스

결국 표준 웹 서비스는 기본적으로 동일한 작업을 수행합니다.한 가지 장점은 클라이언트가 WSDL을 통해 세부 정보를 검색할 수 있다는 것입니다.그러나 그 외에 개발자가 원격으로 개체를 인스턴스화하고 편집하고 저장할 수 있는 래퍼 코드를 작성하려면 여전히 래퍼 코드를 구현해야 합니다.SOAP는 저를 위해 그 어떤 것도 하지 않습니다. 그것은 다음과 같이 할 수 있습니다:

$soap = new nusoap_client('http://localhost/test/webservice_user.php?wsdl', true);
$user = $soap->getProxy(); 
$lastName = $user->lastName();

하지만 편집하고 저장하려면 다음을 수행하세요.

$user->setLastName('Jones');
$user->save();

그럼 예를 들어해야합니다.서버 측에서 모든 상태를 처리하는 경우 SOAP는 각 클라이언트에 대해 서버 측에서 해당 객체를 보유하지 않는 것 같습니다.

아마도 내가 사용하고 있는 PHP SOAP 구현(nusoap)에는 제한 사항이 있을 수 있습니다.아마도 Java 및 .NET 구현이 훨씬 더 많은 일을 할 수 있을 것입니다.

이러한 클라우드 중 일부를 정리하기 위한 피드백을 듣는 것이 즐거울 것입니다.

도움이 되었습니까?

해결책

서로 다른 모델인데...REST는 데이터 중심, 여기서 SOAP는 운영 중심.즉.SOAP를 사용하면 "SubmitOrder" 등의 개별 작업을 수행하는 경향이 있습니다.그러나 REST를 사용하면 일반적으로 데이터를 쿼리하는 방법에 대해 훨씬 더 유동적입니다.

SOAP는 또한 훨씬 더 복잡해지는 경향이 있습니다(때때로 필요함). REST는 POX 등으로 돌아갑니다. 야그니.


.NET의 경우 "wsdl.exe"와 같은 도구는 SOAP 서비스(또는 WCF 서비스의 경우 "svcutil.exe")를 나타내는 전체 클라이언트 측 프록시 라이브러리를 제공합니다.

var someResult = proxy.SubmitOrder(...);

.NET을 사용한 REST의 경우 ADO.NET 데이터 서비스가 가장 확실한 플레이어인 것 같습니다.여기에서 도구(datasvcutil.exe)는 LINQ 지원을 통해 전체 클라이언트 측 데이터 컨텍스트를 제공합니다.LINQ는 복잡한 쿼리를 형성하는 .NET의 비교적 새로운 방법입니다.따라서 다음과 같습니다(강력한/정적 유형 검사 및 Intellisense 사용).

var qry = from user in ctx.Users
          where user.State == 'CO'
          select user;

(이는 ADO.NET 데이터 서비스에 대한 적절한 REST 구문으로/에서 변환됩니다.)

다른 팁

나는 Marc Gravell이 언급한 내용을 반영하고 있습니다.사람들이 저에게 REST에 대해 물을 때(그들은 일반적으로 SOAP 및 SOA에 대한 아이디어를 가지고 있습니다) 저는 REST = ROA가 리소스/데이터 지향적이므로 패러다임이 다르므로 디자인 문제도 다르다고 말할 것입니다.

귀하의 경우, 제가 올바르게 읽은 것이라면 래퍼 코드 작성을 피하고 개체와 해당 속성을 원격으로 저장할 수 있는(그리고 개발자에게 완전히 숨길 수 있는) 솔루션이 필요하다는 것입니다.더 나은 해결책을 제안할 수는 없습니다..음, 다음 중 하나가 귀하의 요구 사항을 충족하는 데 근접한 경우 알려주세요.

  1. EJB3/JPA
  2. 카우치DB (레스트/JSON)

귀하의 질문을 잘못 해석한 경우에도 알려주십시오.

XML-RPC와 SOAP를 비교하면 후자가 더 나은 데이터 유형 처리를 제공합니다. 전자의 경우 더 간단한 데이터 유형을 처리하지만 이를 도메인 개체로 변환하려면 레이어나 어댑터를 작성해야 합니다.

yc

Soap은 표준 그룹이 승인한 합의된 XML 스키마 세트일 뿐입니다.이 제품의 장점은 상호 운용성을 위해 설계되었으며 많은 엔터프라이즈급 기능을 지원한다는 것입니다.모든 플랫폼의 Soap은 원하는 작업을 제공하지 않습니다.이러한 기능을 얻으려면 서비스 계약을 설계하고 구현해야 합니다.

Soap이나 REST가 특히 적합하지 않은 원격 개체를 원하는 것 같습니다.어쩌면 당신이 보는 것이 더 나을 것입니다. XML-RPC.

주요 차이점은 기본적으로 도구입니다.

많은 고급 SOAP 스택은 개발자부터 DTO/문서 및 RPC로만 작업하는 곳까지 방대한 양의 SOAP 인프라를 보호합니다.

HTTP를 통한 REST는 개발자에게 더 많은 부담을 줍니다(형식 협상[XML, JSON, HTTP POST], 결과 구문 분석[DOM, 맵, DTO 마샬링 등]).

분명히, 이 세부 사항을 더 쉽게 처리하기 위해 논리 계층을 작성할 수 있습니다.그리고 이를 더 쉽게 만들기 위해 일부 REST 프레임워크가 도착했지만 현재로서는 그러한 서비스를 사용하거나 소비하려는 경우 여전히 TODO 목록에 있는 작업입니다.

내 의견은 원격 상태를 원한다면 웹 서비스에 대해 말하는 것이 아니라는 것입니다.나는 원격 상태를 다루는 현대 모델에 대해 알지 못합니다.나는 원격 상태가 필요하다면 (따를 종교 없이) 스스로 해야 한다고 생각합니다.여기에서 저기로 XML을 던지고 이론은 신경 쓰지 마십시오.

원격 상태가 나쁘다는 점을 추가해야 합니다.가능하다면 피하세요.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top