Open API에 관심을 갖게 되어 여기 저기 찾아보니 요새 많은 블로그들에서 범용으로 사용되는 프로토콜이 XMLRPC란 것을 알게 되었고, XMLRPC를 PHP에서 사용할 수 있도록 작성해 놓은 라이브러리를 찾을 수 있었다. XMLRPC for PHP 라이브러리는 소스포지의 한 프로젝트이며, 현재 2.2 버전까지 릴리즈가 되어 있다.
http://phpxmlrpc.sourceforge.net/
Open API에 관심을 갖게 만든건 미투데이의 블로그로 글 배달 서비스이다. 이 서비스를 받아들이기 위해서는 내 블로그에 XMLRPC 서버 기능을 추가해야 한다. 서버 기능이란 내 홈페이지로 request가 오면 그에 대한 처리를 하고 응답을 해 주는 기능을 말한다. 미투데이의 블로그로 글 배달 서비스의 경우 metaWeblog.newPost를 내 홈페이지에 보내게 되고, 서버 프로그램에서 그 request를 받아들여 DB에 글을 등록한 후 작성적으로 처리했다는 응답을 미투데이에 보내줘야 한다.
일단 미투데이의 블로그로 글 배달 서비스를 받기 위해선 blogger.getUsersBlogs 메소드와 metaWeblog.newPost 메소드에 대한 처리를 구현해야 한다. blogger.getUsersBlogs를 받으면 내 블로그에 대한 정보를 응답으로 보내줘야 하고, metaWeblog.newPost를 받았을 때는 글을 DB에 등록한 후 등록된 번호를 응답으로 보내줘야 한다.
참고로 FireFox의 부가기능인 ScribeFire에서는 위의 메소드 외에 metaWeblog.getCategories 메소드와 metaWeblog.getRecentPosts 메소드를 사용하여 블로그 정보를 얻어간다. 이 메소드들의 기능은 메소드 이름에 명확히 나타나 있기때문에 굳이 설명을 할 필요가 없어보인다.
이 밖에도 많은 메소드들이 존재하는데 다음의 페이지에서 간단한 정보를 얻을 수 있다. 어떤 메소드들이 있고 이 메소드에 대한 응답은 어떻게 하는지 간단하게 살펴볼 수 있다.
http://www.peopleaggregator.net/api/doc/peopleaggregator.html
이제 위의 메소드들에 대해서 서버 기능을 구현해주기만 하면 된다. XMLRPC for PHP 라이브러리는 체계적으로 잘 작성되어 있어서 어렵지 않게 구현할 수가 있다. 조금 살펴봐야 할 부분이 있다면 xmlrpcval class를 사용하는 방법 정도일 것이다. 물론 다큐먼트에 예제들이 잘 나와 있다.
xmlrpc.php라는 이름으로 서버 기능을 구현해 본다.
먼저 php파일 상단에 두 개의 파일을 인클루드 한다.
include "xmlrpc.inc";
include "xmlrpcs.inc";
그 다음 xmlrpc_server를 생성한다. 생성시 아규먼트로 메소드와 싱행할 함수의 쌍의 배열을 사용한다. 해당 메소드의 request를 받으면 콜백함수로써 등록된 함수가 실행되는 방식이다.
$s = new xmlrpc_server(
array(
"blogger.getUsersBlogs" => array("function", "blogger_getUsersBlogs"),
"metaWeblog.getCategories" => array("function", "metaWeblog_getCategories"),
"metaWeblog.getRecentPosts" => array("function", "metaWeblog_getRecentPosts"),
"metaWeblog.newPost" => array("function", "metaWeblog_newPost")
)
);
예를 들면, metaWeblog.newPost 요청을 서버에서 받은 경우 metaWeblog_newPost 함수가 실행되는 방식이다. metaWeblog_newPost 함수는 서버에서 구현해 주어야 하며 다음과 같이 작성할 수 있다.
function metaWeblog_newPost($msg)
{
// $msg에는 클라이언트로부터 받은 XML 데이터가 포함되어 있다.
$id = $msg->getParam(1);
$id = $id->scalarVal(); // ID
$password = $msg->getParam(2);
$password = $password->scalarVal(); // Password
// $id, $password를 비교해서 정상적인 접근인지 검사.
// 응답할 XML 데이터 생성
$value = new xmlrpcval(/* 응답할 데이터 */);
return new xmlrpcresp($value); // 요청한 클라이언트로 응답
}
$msg에는 XML 데이터가 담겨있다. 각 값들을 파싱하는 함수들이 존재하므로 xmlrpcval 클래스 도움말을 참조하여 값들을 뽑아오면 된다. 요청을 잘 처리했으면 잘 처리했다는 응답을 요청한 클라이언트로 보내줘야 한다. xmlrpcresp 클래스를통해 응답을 해주게 되는데, 이 때 사용되는 $value값은 xmlrpcval 클래스를 사용하여 적당히 만들어줘야 한다.
지금까지의 작업으로 미투데이에서의 metaWeblog.newPost 요청을 처리할 수 있었다. 그런데 안타깝게도 한글이 깨져나오는 문제가 아직 존재한다. 오늘은 한글 문제를 해결하기 위해 골머리좀 쓰게 될 것 같다.