PHP를 이용한 웹 서비스 개발(3) :: PHP팁 게시판[SSISO Community]
 
SSISO 카페 SSISO Source SSISO 구직 SSISO 쇼핑몰 SSISO 맛집
추천검색어 : JUnit   Log4j   ajax   spring   struts   struts-config.xml   Synchronized   책정보   Ajax 마스터하기   우측부분

PHP팁 게시판
[1]
등록일:2008-03-27 09:36:40 (0%)
작성자:
제목:PHP를 이용한 웹 서비스 개발(3)
  • 등록일: 2007년 09월 05일
  • 조회수: 622
제공 : 한빛 네트워크
저자 : Deepak Vohra
역자 : 이대엽
원문 : Developing Web Services Using PHP

[이전 기사 보기]
PHP를 이용한 웹 서비스 개발(1)
PHP를 이용한 웹 서비스 개발(2)

XML-RPC 서버 만들기

PHP XML-RPC 확장은 XML-RPC 명세의 PHP 구현체이다. XML-RPC PHP 클래스 라이브러리는 XML-RPC 서버를 만들고 서버의 메소드를 호출할 수 있는 함수들을 제공한다. 몇가지 널리 사용되는 XML-RPC 함수들이 표 4에 나열되어 있다.

표 4. XML-RPC PHP 함수
함수 설명
xmlrpc_server_create () XML-RPC 서버를 생성한다.
xmlrpc_encode_request ( string method, mixed params [, array output_options] ) 메소드 요청이나 응답에 대한 XML을 생성한다. 문자열이나 오류 발생시 FALSE를 반환한다.
xmlrpc_encode ( mixed value ) PHP 변수에 대한 XML을 생성한다.
xmlrpc_decode_request ( string xml, string &method [, string encoding] ) XML을 PHP로 디코딩한다. 배열을 반환.
xmlrpc_get_type ( mixed value ) XML-RPC 데이터 타입을 반환하는데, 예를 들면 PHP 값에 대해 “struct”, “int”, “string”, “base64”를 반환한다.
xmlrpc_set_type ( string &value, string type ) PHP 문자열 값에 대한 base64내지는 datetime으로 xmlrpc 타입을 지정한다.
xmlrpc_server_register_method ( resource server, string method_name, string function ) PHP 함수를 웹 서비스 메소드로 등록한다. method_name 값은 XML-RPC 요청에 들어있는 methodName 엘리먼트의 값과 동일하다.
xmlrpc_server_call_method ( resource server, string xml, mixed user_data [, array output_options] ) XML 요청을 파싱하여 메소드를 호출한다. 메소드 호출 결과를 반환한다. user_data 매개변수는 메소드 핸들러 함수에 필요한 모든 애플리케이션 데이터를 지정한다. output_options 매개변수는 응답 XML을 생성하는데 필요한 옵션에 대한 해시 배열을 지정한다. 다음의 옵션들을 지정할 수 있다.
output_type: “php”나 “xml”과 같은 출력 데이터 타입을 지정하며 기본 데이터 타입은 “xml”이다. 만약 출력 타입이 “php”일 경우 다른 값들은 무시된다.verbosity: 생성된 메시지의 간결함(compactness) 정도를 지정한다.
escaping: 몇몇 문자들에 대한 이스케이프를 방법을 지정한다.
version: 사용할 XML의 버전을 지정하며, 버전값으로 “xmlrpc”, “soap 1.1”, “simple”을 값으로 지정할 수 있으며 들어오는 요청에 사용된 버전을 사용하도록 “auto”로 지정할 수도 있다.
encoding: 데이터의 인코딩을 지정한다. 기본값은 “iso-8859-1”이다.
output_options 매개변수를 사용하는 예를 들자면 다음과 같다: .$output_options = array( "output_type" => "xml", "verbosity" => "no_white_space", "escaping" => array("markup", "non-ascii", "non-print"), "version" => "xmlrpc", "encoding" => "utf-8" );
xmlrpc_is_fault ( array arg ) 배열값이 XML-RPC fault를 나타내는지를 판단한다.
xmlrpc_server_destroy ( resource server ) 서버 자원을 제거한다.

xmlrpc-webservice.php라는 이름의 PHP 스크립트를 C:/Apache2/htdocs 디렉터리에 만든다. PHP 스크립트에는 hello_func라는 함수를 하나 정의한다. 클라이언트에서 호출하는 모든 함수는 3개의 매개변수를 받아들일 필요가 있는데, 첫번째 매개변수는 호출되는 XML-RPC 메소드의 이름이다. 두 번째 매개변수는 클라이언트로부터 전달되는 매개변수들의 배열을 담는다. 세 번째 매개변수는 xmlrpc_server_call_method() 함수의 user_data 매개변수로 전달되는 애플리케이션 데이터이다. hello_func 함수에서는 클라이언트로부터 전달되는 첫 번째 매개변수인 이름을 받아, Hello 메시지를 출력한다.
function hello_func($method_name, $params, $app_data)
{
$name = $params[0];
return "Hello $name.";
}
xmlrpc_server_create() 메소드를 이용하여 XML-RPC 서버를 생성한다.
$xmlrpc_server=xmlrpc_server_create();
xmlrpc_server_create 메소드가 서버를 생성하지 못할 경우 FALSE를 반환한다. xmlrpc_register_method 메소드를 이용하여 서버에 hello_func 함수를 등록한다. xmlrpc_server_register_method 메소드의 첫 번째 인자는 XML-RPC 서버 응답이다. 두 번째 인자는 웹 서비스에 의해 제공되는 메소드의 이름이며, XML-RPC 요청에 들어있는 <methodName> 엘리먼트의 값이다. 세 번째 인자는 서버에 등록되는 PHP 함수이다.
$registered=xmlrpc_server_register_method 
($xmlrpc_server, "hello", "hello_func" );
PHP 함수가 등록되면 xmlrpc_server_registere_method는 TRUE를 반환한다.

XML-RPC 클라이언트 만들기

다음으로는 요청을 XML-RPC 서버로 전송하는 XML-RPC 클라이언트를 만들어보도록 하겠다. 먼저 요청에 보낼 XML 문자열을 지정한다.
$request_xml = <<< END
<?xml version="1.0"?>
<methodCall>
<methodName>hello</methodName>
<params>
<param>
<value>
<string>Deepak</string>
</value>
</param>
</params>
<methodCall>
END;
PHP에 XML을 이스케이프하기 위해 <<<END ...END;를 사용하였다. XML 문서 구분자로는 END 외에도 사용할 수 있다. methodCall 엘리먼트는 호출될 웹 서비스 메소드를 지정한다. xmlrpc_server_call_method 함수를 이용하여 웹 서비스 메소드를 호출한다. xmlrpc_server_call_method 함수의 첫 번째 인자는 서버 리소스이다. 두 번째 인자는 XML-RPC 요청을 담고 있는 문자열이다. 세 번째 인자는 메소드 핸들러 함수의 세 번째 매개변수로 전달되는 애플리케이션 데이터이다.
$response=xmlrpc_server_call_method( $xmlrpc_server, 
$request_xml, '', array(output_type => "xml"));
서버로부터 반환된 XML-RPC 응답을 출력한다.
print $response;
xmlrpc-webservice.php PHP 스크립트가 아래에 나타나 있다.
<?php
function hello_func($method_name, $params, $app_data)
{
$name = $params[0];
return "Hello $name.";
}

$xmlrpc_server=xmlrpc_server_create();
$registered=xmlrpc_server_register_method
($xmlrpc_server, "hello", "hello_func" );

$request_xml = <<< END
<?xml version="1.0"?>
<methodCall>
<methodName>hello</methodName>
<params>
<param>
<value>
<string>Deepak</string>
</value>
</param>
</params>
</methodCall>
END;
$response=xmlrpc_server_call_method( $xmlrpc_server,
$request_xml, '', array(output_type => "xml"));
print $response;
?>
xmlrpc-webservice.php 스크립트를 C:/Apache2/htdocs 디렉터리로 복사한다. http://localhost/xmlrpc-webservice.php URL을 통해 PHP 스크립트를 호출한다. 서버로부터 전달되는 응답을 브라우저에 출력해 보면 그림 2와 같다.


그림 2. XML-RPC 웹 서비스로부터 전달된 응답

요청에 오류가 들어있을 때 응답 XML이 <fault> 엘리먼트로 반환되도록 요청 XML을 유효하지 않은 XML로 만들어 본다. 예를 들면 $request_xml의 </methodCall>을 <methodCall>로 바꾸고 xmlrpc-webservice.php를 호출한다. 서버로부터 전달되는 응답은 struct엘리먼트 값으로 이루어져 있는 <fault> 엘리먼트이며, faultCode와 faultString 멤버로 구성되어 있으며 그림 3에 나타나 있는 것과 같다.


그림 3. fault 엘리먼트로 반환된 응답

참고자료

좀 더 자세한 내용을 보려면 W3C의 WSDL 페이지SOAP Primer를 참조한다.

출처 : http://network.hanb.co.kr/view.php?bi_id=1434
[본문링크] PHP를 이용한 웹 서비스 개발(3)
[1]
코멘트(이글의 트랙백 주소:/cafe/tb_receive.php?no=3030
작성자
비밀번호

 

SSISOCommunity

[이전]

Copyright byCopyright ⓒ2005, SSISO Community All Rights Reserved.