2. XML-RPC란 무엇인가?

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 클라이언트와 서버를 만드는지에 대하여 살펴볼 것이다.

2.1. 어떻게 동작하는가

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초가 걸렸다.

2.2. 지원되는 데이타형

XML-RPC는 다음과 같은 데이타형을 지원한다:

int

부호 있는 32비트 정수형

string

NULL 바이트를 포함할 수 있는 아스키 문자열 (XML의 특성에 의해 몇몇의 XML-RPC 환경에서는 유니코드를 지원함)

boolean

참 또는 거짓

double

배정도 실수형 (환경에 따라 제한)

dateTime.iso8601

날짜와 시각. XML-RPC는 타임존의 사용을 금하기 때문에 거의 쓸모 없음

base64

임의의 길이를 가지는 저수준 이진 데이타. 통신 상에서는 Base64로 인코딩되며 상당히 유용한 데이타형 (어떤 환경에서는 0 바이트의 데이타는 수신하지 못하는 경우도 있음)

array

1차원 배열. 배열값은 어떠한 형도 가능함

struct

key-value의 쌍으로 이루어진 사전형. key는 string이어야 하며 value는 어떠한 형도 가능함

2.3. XML-RPC의 역사

XML-RPC는 그 이전의 두 프로토콜로부터 영향을 받았다. 첫째는 Dave Winer에 의해 디자인되고 예전에 DaveNet에 발표된 익명 RPC 프로토콜이다. (이 때문에 종종 XML-RPC 서버는 /RPC2에 설치된다.) 또하나, 더욱 주요하게는 SOAP 프로토콜의 초안에서 그 영향을 받았다.

XML-RPC의 역사에 관한 더 자세한 문서로는 Dave Winer가 쓴 글이 있다. 이 문서는 XML-RPC와 SOAP의 관계에 대해서도 설명하고 있다.