XML-RPC and XML-RPC Server Classes
XML-RPC 클래스를 이용하시면 다른 서버로 요청을 보낼수 있으며 여러분의 XML-RPC 서버를 설정하여 요청을 받을수도 있습니다.
XML-RPC란 무엇인가 What is XML-RPC?
간단히 말해 XML로 인터넷을 통해 두 컴퓨터가 통신하는 방법입니다.먼저 클라이언트라는 컴퓨터가 XML-RPC 요청 을 서버라고 하는 다른컴퓨터에 에 보냅니다 . 일단 서버가 요청을 받아들이고 처리하면, 다시 응답 을 클라이언트로 보내게 됩니다.
예를들어 , MetaWeblog API 를 사용할때 , XML-RPC 클라이언트(보통 데스크탑 게시(publishing) 툴)는 여러분의 사이트에서 돌아가고 있는 XML-RPC 서버에 요청을 보내게 됩니다. 이 요청은 새로운 웹로그 입력이거나,기존 웹로그의 수정에 대한 요청일 것입니다. XML-RPC 서버가 이 요청을 수신하면 서버는 어떤 클래스/함수 가 요청을 처리할지를 결정합니다. 처리가 완료되면 , 서버는 응답메세지를 되돌려주게 됩니다.
좀더 자세한 정의를 보시려면 , XML-RPC 사이트를 참고하세요 .(영어).
클래스 초기화 Initializing the Class
대부분의 다른 클래스들 처럼 XML-RPC 와 XML-RPCS 클래스도 컨트롤러에서 $this->load->library 함수를 통해 초기화 됩니다:
Xml RPC 클래스를 로드하려면 아래와 같이 합니다:
$this->load->library('xmlrpc');
일단 로드되면 xml-rpc 라이브러리는 $this->xmlrpc 로 사용할 수 있습니다.
XML-RPC 서버클래스는 아래와같이 합니다:
$this->load->library('xmlrpc');
$this->load->library('xmlrpcs');
일단 로드되면 ,xml-rpcs 라이브러리 객체는 $this->xmlrpcs로 사용할 수 있습니다.
참고: XML-RPC 서버클래스를 사용할때는 XML-RPC 클래스와 XML-RPC 서버클래스 둘다 로드해야 합니다.
XML-RPC 요청 보내기 Sending XML-RPC Requests
요청을 XML-RPC 서버에 보내려면 다음 정보를 먼저 정의해야합니다:
- 서버의 URL
- 서버에서 호출하고자하는 메소드
- 요청 데이터(아래에서 설명함 ).
아래는 간단한 Weblogs.com 핑(ping)을 Ping-o-Matic 로 보내는 예제입니다.
$this->load->library('xmlrpc');
$this->xmlrpc->server('http://rpc.pingomatic.com/', 80);
$this->xmlrpc->method('weblogUpdates.ping');
$request = array('My Photoblog', 'http://www.my-site.com/photoblog/');
$this->xmlrpc->request($request);
if ( ! $this->xmlrpc->send_request())
{
echo $this->xmlrpc->display_error();
}
설명
위코드에서 , XML-RPC 클래스를 초기화 하고, 서버URL 과 호출한 메소드(weblogUpdates.ping)를 설정합니다.전송할 요청(이경우, 제목과 여러분 사이트URL)을 배열에 넣고 request() 함수를 사용하여 합칩니다. 마지막으로, 전체 요청을 보냅니다. 만약 send_request() 메소드가 false를 리턴하면 XML-RPC 서버로부터 되돌아오는 에러메세지를 표시하게 됩니다.
요청 해부 Anatomy of a Request
XML-RPC 요청(request) 는 간단히 말하면 XML-RPC 로 보내는 데이터 입니다. 요청을 구성하는 조각데이터들은 요청파라미터(request parameter)로써 참조됩니다 . 위 예제에서는 두개의 파라미터를 사용했습니다: 제목과 여러분 사이트URL가 그것입니다. XML-RPC 서버가 여러분의 요청을 받으면, 필요한 파라미터도 같이 넘어올 것이라고 기대합니다.
요청파라미터는 반드시 배열에 담아야하며, 각 파라미터는 7가지의 데이터타입(strings, numbers, dates, etc.)중 하나로 해야합니다. 만약 파라미터가 문자열(string) 타입이 아니라면, 요청에 데이터타입을 포함해야 합니다..
아래는 3개의 파라미터 설정 예제입니다:
$request = array('John', 'Doe', 'www.some-site.com');
$this->xmlrpc->request($request);
만약 파라미터가 문자열(string)타입이 아니라면, 아래와같이 배열내에 다시 배열을 삽입하고 데이터형을 같이 설정해주셔야 합니다:
$request = array (
array('John', 'string'),
array('Doe', 'string'),
array(FALSE, 'boolean'),
array(12345, 'int')
);
$this->xmlrpc->request($request);
데이터타입 섹션을 보시면 모든 데이터타입목록을 확인하실 수 있습니다.
XML-RPC 서버 생성 Creating an XML-RPC Server
XML-RPC 서버는 교통경찰같이 동작합니다. 요청을 기다리고 들어온 요청에 대해서는 적합한 함수로 연결(redirect) 해 줍니다.
XML-RPC 서버를 생성하려면,요청을 받을 컨트롤러에서 XML-RPC 서버 클래스를 초기화하고 들어온 요청을 적절한 클래스/함수로 연결하는 규칙을 배열로 설정해야 합니다.
아래 예제를 보세요:
$this->load->library('xmlrpc');
$this->load->library('xmlrpcs');
$config['functions']['new_post'] = array('function' => 'My_blog.new_entry'),
$config['functions']['update_post'] = array('function' => 'My_blog.update_entry');
$config['object'] = $this;
$this->xmlrpcs->initialize($config);
$this->xmlrpcs->serve();
위예제는 서버가 받아들일 두가지 요청처리 메소드를 정의하고 있습니다. 요청을 받는 메소드는 배열의 왼쪽에 있습니다. 둘중 하나의 요청이 들어오면, 오른쪽에 있는 클래스/함수로 매핑됩니다.
'object'키는 실재객체(instantiated class object)를 전달하는 특별한 키입니다. 매핑하고자하는 메소드가 CodeIgniter 부모객체(super object)의 일부가 아닐때 필요합니다.
다시말해, XML-RPC 클라이언트가 new_post 메소드에 대한 요청을 전송하면, 여러분의 서버는 My_blog 클래스를 로드한후 new_entry 함수를 호출합니다.update_post 메소드에 대한 요청이 들어오면 , 서버는 My_blog 클래스를 로드한 후 update_entry 함수를 호출 합니다.
위 예제의 함수이름은 임의로 지은것입니다.
서버 클래스를 초기화 할때 사용할 수 있는 두개의 추가 설정 키가 있습니다.debug 를 TRUE 로 설정하면, 디버깅이 활성화 되며 xss_clean 를 FALSE 로 두면 전송하는 데이터에 Security 라이브러리의 xss_clean 함수를 적용하지 않습니다..
서버 요청 처리 Processing Server Requests
XML-RPC 서버가 요청을 받고 클래스/메소드 를 로드하면, 클라이언트로 부터 받은 데이터를 그 메소드로 넘겨주게 됩니다.
위의 예제에서 new_post 메소드가 요청되면, 서버는 아래와 같은 형태의 클래스가 있을것이라고 기대합니다:
class My_blog extends CI_Controller {
function new_post($request)
{
}
}
$request 변수는 서버에서 구성(compile)된 객체이며,클라이언트로부터 전달된 데이터를 포함하고 있습니다.요청을 처리하기위해 요청파라미터(request parameters)에 접근하려면 이 객체를 사용합니다. 처리가 끝나면 여러분은 응답(Response)을 클라인트에게 되돌려줄것입니다.
아래는 Blogger API를 사용한 실재 예제입니다. getUserInfo()는 Blogger API 의 한 메소드 입니다.이 메소드를 이용하여 , XML-RPC 클라이언트는 서버로 사용자이름과 암호를 전송하고 특정사용자에대한 정보(nickname, user ID, email address, 등.)를 받습니다. 아래예제는 그 과정을 보여줍니다:
class My_blog extends CI_Controller {
function getUserInfo($request)
{
$username = 'smitty';
$password = 'secretsmittypass';
$this->load->library('xmlrpc');
$parameters = $request->output_parameters();
if ($parameters['1'] !=
$username AND $parameters['2'] != $password)
{
return $this->xmlrpc->send_error_message('100', 'Invalid Access');
}
$response = array(array('nickname' => array('Smitty','string'),
'userid' => array('99','string'),
'url' => array('http://yoursite.com','string'),
'email' => array('jsmith@yoursite.com','string'),
'lastname' => array('Smith','string'),
'firstname' => array('John','string')
),
'struct');
return $this->xmlrpc->send_response($response);
}
}
참고:
output_parameters() 함수는 클라이언트가 전송한 파라미터에 대응하는 배열을 복원(retrieve)해 냅니다. 위 예제애서, 출력 파라미터(output parameters)는 username ,password가 될것입니다.
만약 클라이언트가 전송한 username,password 가 틀린것이라면send_error_message()함수를 통해 에러메세지를 리턴합니다.
동작이 성공적으로 끝나면 클라이언트는 사용자 정보를 포함한 응답을 받게 됩니다.
응답 구성 Formatting a Response
요청(Requests) 이나 응답(Responses)은 반드시 배열로 구성되어야 합니다. 그러나, 요청(request)과는 달리 응답(response)은 단일 아이템을 포함한 배열입니다. 이 아이템은 여러 배열을 포함한 배열일수 있지만, 단 하나의 배열인덱스만을 포함할수 있습니다.다시말하면 , 아래예제가 기본적인 형태입니다:
$response = array('Response data', 'array');
응답(Response)은 보통 여러가지 정보를 포함합니다. 그렇게 하기 위해서는 아래와같이 단일 배열안애 여러가지 정보가 들어간 하위배열을 구성하시면 됩니다:
$response = array (
array(
'first_name' => array('John', 'string'),
'last_name' => array('Doe', 'string'),
'member_id' => array(123435, 'int'),
'todo_list' => array(array('clean house', 'call mom', 'water plants'), 'array'),
),
'struct'
);
위 배열은 struct로 구성되어 있습니다. 이런형태는 가장 일반적으로 사용하는 응답구성입니다.
요청과 마찬가지로 응답또한 7가지 데이터타입을 사용할 수 있습니다.
에러응답 전송하기Sending an Error Response
클라이언트에게 에러를 전송해야할경우 아래와 같이 하시면 됩니다:
return $this->xmlrpc->send_error_message('123', 'Requested data not available');
첫번째 파라미터는 에러번호이고 ,두번째 파라미터는 메세지 입니다.
클라이언트와 서버 만들기 Creating Your Own Client and Server
지금까지의 설명에 대한 이해를 돕기위해서 XML-RPC 클라이언트 와 서버를 직접 만들어봅시다.
클라이언트 The Client
xmlrpc_client.php 라는 파일을 만드신후 아래 코드를 삽입하고 applications/controllers/ 폴더에 저장합니다:
참고: 위 예제에서"url helper"를 사용하였습니다. Helpers Functions 페이지를 보시면 자세한 정보가 있습니다.
서버 The Server
xmlrpc_server.php파일을 만드신후 아래 코드를 삽입하고 applications/controllers/ 폴더에 저장합니다:
해봅세!
자 이제 아래와 같은 url 로 접근해 봅시다:
example.com/index.php/xmlrpc_client/
여러분이 서버로 보낸메세지와 응답을 보실수 있습니다.
클라이언트는 "How's is going?" 메세지를 "Greetings" 메소드요청과 함께서버로 보냅니다. 서버는 요청을 받아들인후 "process" 함수로 매핑하여 응답을 돌려줍니다.
요청 파라미터로 연관배열 사용하기 Using Associative Arrays In a Request Parameter
만약 메소드의 파라미터에 연관배열을 사용하고자 한다면 struct 데이터타입을 사용하셔야합니다:
$request = array(
array(
// Param 0
array(
'name'=>'John'
),
'struct'
),
array(
// Param 1
array(
'size'=>'large',
'shape'=>'round'
),
'struct'
)
);
$this->xmlrpc->request($request);
서버에서 요청을 처리할때 연관배열을 아래와같이 사용(retrieve)할 수 있습니다.
$parameters = $request->output_parameters();
$name = $parameters['0']['name'];
$size = $parameters['1']['size'];
$size = $parameters['1']['shape'];
XML-RPC 함수 레퍼런스 XML-RPC Function Reference
$this->xmlrpc->server()
요청을 보낼 서버의 URL과 포트번호를 설정합니다:
$this->xmlrpc->server('http://www.sometimes.com/pings.php', 80);
$this->xmlrpc->timeout()
요청이 취소될 타임아웃 기간을 초단위로 설정합니다:
$this->xmlrpc->timeout(6);
$this->xmlrpc->method()
XML-RPC 서버로부터 요청될 메소드를 설정합니다:
$this->xmlrpc->method('method');
method 는 메소드의 이름입니다.
$this->xmlrpc->request()
데이터배열을 받아서 서버로 전송될 데이터를 구성합니다:
$request = array(array('My Photoblog', 'string'), 'http://www.yoursite.com/photoblog/');
$this->xmlrpc->request($request);
$this->xmlrpc->send_request()
요청을 보내는 함수 입니다. 성공여부에 따라서TRUE 나FALSE를 리턴합니다.
$this->xmlrpc->set_debug(TRUE);
디버깅을 활성화 합니다. 여러가지 정보를 표시해주므로 개발시에 유용합니다.
$this->xmlrpc->display_error()
요청 실패에대한 에러메세지를 문자열로 리턴합니다.
echo $this->xmlrpc->display_error();
$this->xmlrpc->display_response()
요청을 하면 서버는 응답을 리턴합니다. 응답은 일반적으로 연관배열입니다.
$this->xmlrpc->display_response();
$this->xmlrpc->send_error_message()
이 함수를 이용하시면 서버에서 클라이언트로 에러메세지를 전송할수 있습니다. 첫번째 파라미터는 에러번호 , 두번재 파라미터는 에러메세지 입니다.
return $this->xmlrpc->send_error_message('123', 'Requested data not available');
$this->xmlrpc->send_response()
서버에서 클라이언트로 응답을 전송할때 사용합니다.이 메소드를 사용할때 반드시 적합한 데이터가 하나의 배열로 전송되어야 합니다.
$response = array(
array(
'flerror' => array(FALSE, 'boolean'),
'message' => "Thanks for the ping!"
)
'struct');
return $this->xmlrpc->send_response($response);
데이터타입 Data Types
XML-RPC 스펙(spec) 에 따라 아래와 같이 7가지 데이터타입을 사용하실 수 있습니다:
- int or i4
- boolean
- string
- double
- dateTime.iso8601
- base64
- struct (contains array of values)
- array (contains array of values)