XML-RPC는 HTTP를 통한 간단하고 이식성 높은 원격 프로시져 호출 방법이다. XML-RPC는 Perl, Java, Python, C, C++, PHP 와 그 외 다른 많은 언어로 사용할 수 있으며 Unix, Windows, 그리고 Macintosh에서 실행할 수 있다.
다음은 Perl로 만든 간단한 XML-RPC 클라이언트 프로그램이다. (Ken MacLeod의 Frontier::Client 모듈 사용)
use Frontier::Client; $server = Frontier::Client->new(url => 'http://betty.userland.com/RPC2'); $name = $server->call('examples.getStateName', 41); print "$name\n"; |
이 프로그램을 실행하면, 원격 서버에 연결하여 미국의 주명(state name)을 얻어 출력한다. (이 예제에서 41번 주는 South Dakota 일 것이다.)
다음은 동일한 Python 프로그램이다. (Fredrik Lundh의 xmlrpclib 사용)
python> import xmlrpclib python> server = xmlrpclib.Server("http://betty.userland.com/RPC2") python> server.examples.getStateName(41) 'South Dakota' |
이제부터 다양한 프로그래밍 언어로 어떻게 XML-RPC 클라이언트와 서버를 만드는지에 대하여 살펴볼 것이다.
XML-RPC는 Dave Winer의 공식 명세서에 상세히 정의되어 있다. 궁금한 사항이 있다면 직접 가서 보라. 간단하고 읽기 쉽게 되어 있다.
(서버와 클라이언트 간의) 통신 상에서, XML-RPC 값은 XML 코드화된다.:
<methodCall> <methodName>sample.sumAndDifference</methodName> <params> <param><value><int>5</int></value></param> <param><value><int>3</int></value></param> </params> </methodCall> |
이것은 장황해 보이지만 쉽게 요약된다. 게다가 생각보다 빠르다. Rick Blair의 측정에 따르면, Hannes Wallnofer의 Java 환경에서 한 번의 XML-RPC 호출 왕복에 0.003초가 걸렸다.
XML-RPC는 다음과 같은 데이타형을 지원한다:
부호 있는 32비트 정수형
NULL 바이트를 포함할 수 있는 아스키 문자열 (XML의 특성에 의해 몇몇의 XML-RPC 환경에서는 유니코드를 지원함)
참 또는 거짓
배정도 실수형 (환경에 따라 제한)
날짜와 시각. XML-RPC는 타임존의 사용을 금하기 때문에 거의 쓸모 없음
임의의 길이를 가지는 저수준 이진 데이타. 통신 상에서는 Base64로 인코딩되며 상당히 유용한 데이타형 (어떤 환경에서는 0 바이트의 데이타는 수신하지 못하는 경우도 있음)
1차원 배열. 배열값은 어떠한 형도 가능함
key-value의 쌍으로 이루어진 사전형. key는 string이어야 하며 value는 어떠한 형도 가능함
XML-RPC는 그 이전의 두 프로토콜로부터 영향을 받았다. 첫째는 Dave Winer에 의해 디자인되고 예전에 DaveNet에 발표된 익명 RPC 프로토콜이다. (이 때문에 종종 XML-RPC 서버는 /RPC2에 설치된다.) 또하나, 더욱 주요하게는 SOAP 프로토콜의 초안에서 그 영향을 받았다.
XML-RPC의 역사에 관한 더 자세한 문서로는 Dave Winer가 쓴 글이 있다. 이 문서는 XML-RPC와 SOAP의 관계에 대해서도 설명하고 있다.