PHP > LIBRARY > PHP를 이용한 웹 서비스 개발(1)
 
PHP
Library
Tip&Tech
Q&A
 
PHP Function
phpschool
그누보드
LIBRARY
  HOME > PHP > LIBRARY
 
PHP를 이용한 웹 서비스 개발(1)
작성일 : 10-02-25
조회 : 3,854  
PHP를 이용한 웹 서비스 개발(1)

등록일 : 2007년 09월 03일 | 조회수 : 3,148

 
제공 : 한빛 네트워크
저자 : Deepak Vohra
역자 : 이대엽
원문 : Developing Web Services Using PHP

웹 서비스는 웹 서비스에 대한 요청(request)을 처리하는 서버와 웹 서비스상의 메소드를 호출하는 클라이언트로 구성되어 있다. PHP 클래스 라이브러리는 XML-RPC 서버와 클라이언트를 만들기 위해 SOAP 서버와 클라이언트 및 XML-RPC 확장기능을 개발하기 위한 SOAP 확장을 제공하고 있다. PHP를 이용하여 웹 서비스를 개발하는 것에 대해 깊게 파고들기 전에 웹 서비스에 대해 간략하게 설명하도록 하겠다.

웹 서비스 소개

웹 서비스는 네트워크상으로 상호 운용가능한(interoperable) 상호작용을 위해 고안된 소프트웨어 시스템이다. 웹 서비스는 WSDL(Web Services Description Language) 문서로 정의되며 다른 시스템들은 SOAP 메시지를 이용하여 웹 서비스를 통해 상호작용하는데, SOAP 메시지는 XML 직렬화(serialization)를 거쳐 HTTP를 이용하여 전송된다. 웹 서비스는 일련의 기능들을 제공하며 메시지를 보내고 받는 에이전트에 의해 구현되는 추상적인 자원이다. 웹 서비스 제공자(provider) 개체는 제공자 에이전트를 이용하여 웹 서비스의 기능들을 제공하며 요청자(requester) 개체는 요청자 에이전트를 통해 웹 서비스의 기능들을 사용한다. 웹 서비스는 다양한 기술들을 구현하고 있는데, 그 중 몇가지는 XML, SOAP 및 WSDL이다. XML은 데이터 전송을 위한 표준 형식이다. 웹 서비스 요청과 응답은 XML 메시지로서 전달된다. XML 문서에 기술될 수 있는 엘리먼트(elements)들과 속성(attributes)들은 XML 스키마(Schema)에 기술되어 있다. SOAP은 XML 메시지의 패키징과 상호교환을 위한 표준 프레임워크를 제공한다. WSDL은 http://schemas.xmlsoap.org/wsdl/ 네임스페이스에 있는 메시지에 대한 오퍼레이션(operation)을 수행하는 종단(endpoints)의 집합으로서의 웹 서비스를 서술하는데 사용되는 XML 문서이다. WSDL 문서는 웹 서비스에 의해 제공되는 오퍼레이션(메소드)과 XML 메시지의 형식을 기술한다.

PHP 웹 서비스 확장기능 설치하기

SOAP와 XML-RPC 확장기능들은 PHP5 설치파일에 패키징되어 있다. SOAP 및 XML-RPC 확장기능은 PHP 설치시 기본값으로 활성화되어 있지는 않다. SOAP 및 XML-RPC 확장기능을 활성화하려면 다음의 확장기능 지시자(entension directives)를 php.ini 설정 파일에 추가한다.
extension=php_xmlrpc.dll
extension=php_soap.dll
아파치 2 서버를 재시작하여 SOAP 및 XML-RPC 확장기능을 활성화한다. SOAP 확장기능은 SOAP 1.1, SOAP 1.2, WSDL 1.1 명세의 서브셋(subset)들을 지원한다.

SOAP 웹 서비스 만들기

PHP 설정파일의 SOAP 확장기능을 활성화하고 난 뒤에는 SOAP PHP 클래스 라이브러리를 이용하여 SOAP 서버와 SOAP 클라이언트를 작성할 수 있다. SOAP 서버는 웹 서비스 요청을 처리하며, SOAP 클라이언트는 SOAP 웹 서비스상의 메소드를 호출한다. SOAP 라이브러리는 SOAP 서버와 SOAP 클라이언트를 작성하기 위한 다양한 함수들을 제공한다. 몇 가지 일반적으로 사용되는 SOAP 함수들이 표1에 나열되어 있다.

표 1. SOAP 함수
메소드 설명
SoapServer->__construct( mixed wsdl [, array options] ) SoapServer 객체를 생성한다. wsdl 파라미터에는 WSDL의 URI를 지정한다. SOAP 버전과 같은 SoapServer 옵션은 options 배열에 지정할 수 있다.
SoapServer->addFunction( mixed functions ) SOAP 요청을 처리할 하나 이상의 PHP 함수를 추가한다. 추가할 함수가 한 개일 경우에는 문자열로 추가할 수 있다. 하나 이상의 함수는 배열로 추가한다.
SoapServer->fault() 오류를 의미하는 SoapServer 장애
SoapServer->getFunctions() 함수의 목록을 반환한다.
SoapServer->handle() SOAP 요청을 처리하며, 필요한 함수를 호출하고 응답을 돌려보낸다.
SoapServer->setClass(string class_name [, mixed args [, mixed ...]] ) SOAP 요청을 처리할 클래스를 지정하며, 지정된 클래스로부터 모든 메소드를 내보낸다. args는 기본 클래스 생성자에 의해 사용된다.
SoapHeader->__construct() SOAP 헤더를 생성한다.
SoapClient->__soapCall( string function_name, array arguments [, array options [, mixed input_headers [, array &output_headers]]] ) SOAP 함수를 호출한다.
SoapClient->__doRequest() SOAP 요청을 수행한다.
SoapClient->__getFunctions() SOAP 함수의 목록을 반환한다.
SoapClient->__getTypes() SOAP 타입의 목록을 반환한다.

SOAP 서버 만들기

SOAP 서버 작성을 시작하기 전에 웹 서비스를 정의하는 WSDL 문서를 작성할 필요가 있다. WSDL 문서는 웹 서비스가 제공하는 오퍼레이션들을 정의한다. 필자는 카탈로그 ID에 대한 카탈로그 항목을 반환하는 getCatalogEntry 오퍼레이션을 제공하는 웹 서비스 예제를 작성할 것이다. WSDL은 http://schemas.xmlsoap.org/wsdl/ 네임스페이스에 속해있는 XML 문서이다. WSDL 문서의 몇 가지 엘리먼트들이 표 2에 나열되어 있다.

표 2. WSDL 엘리먼트
엘리먼트 설명
definitions 웹 서비스에 의해 교환되는 메시지의 자료형에 대한 정의를 지정한다. 권장되는 타입 시스템은 XML 스키마이다.
message 전송되는 데이터를 정의한다. 메시지는 하나 혹은 그 이상의 파트(part)들로 이루어진다. 파트는 타입과 연관된다.
portType 오퍼레이션의 집합과 각 오퍼레이션에 대한 입출력 메시지를 정의한다.
operation 서비스에 의해 지원되는 동작(메소드). 각 오퍼레이션들은 입출력 메시지로 이루어진다.
input 요청에 대한 메시지 형식을 지정한다.
output 응답에 대한 메시지 형식을 지정한다.
binding 오퍼레이션에 대한 메시지 형식과 프로토콜 세부사항 및 특정 portType에 대한 메시지를 정의한다.
service 포트들의 집합을 지정한다.
port 바인딩을 통해 주소를 연결하여 종단을 정의한다.

다음으로는 예제 웹 서비스에 대한 WSDL 문서를 작성한다. 예제 WSDL문서인 catalog.wsdl은 각각의 요청 및 응답 메시지에 대한 메시지 엘리먼트인 getCatalogRequest와 getCatalogResponse를 정의한다. WSDL 문서는 주어진 문자열 catalogId에 대한 카탈로그 엔트리를 HTML 문자열로 반환하는 getCatalogEntry 오퍼레이션의 portType과 CatalogPortType을 정의한다. 그리고 getCatalogEntry 오퍼레이션과 입출력 메시지에 대한 CatalogBinding이라는 이름의 바인딩을 정의한다. soap:binding 엘리먼트는 바인딩이 SOAP 프로토콜 포맷으로 바인딩되도록 지정한다. soap:operation 엘리먼트는 오퍼레이션에 대한 정보를 지정한다. soap:body 엘리먼트는 메시지 파트들이 SOAP Body 엘리먼트내에서 어떻게 보여지는지를 지정한다. CatalogService의 정의는 CatalogBinding이라는 이름의 바인딩과 연결되어 있는 CatalogPort라는 포트로 구성되어 있다. soap:address 엘리먼트는 주소의 URI를 지정한다. catalog.wsdl 문서가 아래에 나열되어 있다.
<?xml version ='1.0' encoding ='UTF-8' ?> 
<definitions name='Catalog' 
  targetNamespace='http://example.org/catalog' 
  xmlns:tns=' http://example.org/catalog ' 
  xmlns:soap='http://schemas.xmlsoap.org/wsdl/soap/' 
  xmlns:xsd='http://www.w3.org/2001/XMLSchema' 
  xmlns:soapenc='http://schemas.xmlsoap.org/soap/
  encoding/' 
  xmlns:wsdl='http://schemas.xmlsoap.org/wsdl/' 
  xmlns='http://schemas.xmlsoap.org/wsdl/'> 

<message name='getCatalogRequest'> 
  <part name='catalogId' type='xsd:string'/> 
</message> 
<message name='getCatalogResponse'> 
  <part name='Result' type='xsd:string'/> 
</message> 

<portType name='CatalogPortType'> 
  <operation name='getCatalogEntry'> 
    <input message='tns:getCatalogRequest'/> 
    <output message='tns:getCatalogResponse'/> 
  </operation> 
</portType> 

<binding name='CatalogBinding' type=
'tns:CatalogPortType'> 
  <soap:binding style='rpc' 
    transport='http://schemas.xmlsoap.org/soap/http'
  /> 
  <operation name='getCatalogEntry'> 
    <soap:operation soapAction='urn:localhost-catalog#
    getCatalogEntry'/> 
    <input> 
      <soap:body use='encoded' namespace=
      'urn:localhost-catalog' 
        encodingStyle='http://schemas.xmlsoap.org/soap
       /encoding/'/> 
    </input> 
    <output> 
      <soap:body use='encoded' namespace=
   'urn:localhost-catalog' 
        encodingStyle='http://schemas.xmlsoap.org/soap/
    encoding/'/> 
    </output> 
  </operation> 
</binding> 

<service name='CatalogService'> 
  <port name='CatalogPort' binding=
  'CatalogBinding'> 
    <soap:address location='http://localhost/
    soap-server.php'/> 
  </port> 
</service>
</definitions>
catalog.wsdl 문서를 PHP 스크립트가 실행되고 있는 C:Apache2htdocs 디렉터리로 복사한다. soap-server.php라는 이름의 PHP 스크립트를 작성하여 CatalogService 웹 서비스에서 제공되는 오퍼레이션을 정의한다. soap-server.php 스크립트에는 catalogId를 인자로 받아들여 HTML 문서로 구성되어 있는 문자열을 반환하는 getCatalogEntry() 함수를 정의한다. 반환되는 HTML 문서의 문자열은 지정된 catalogId에 대한 카탈로그 엔트리를 구성한다.
function getCatalogEntry($catalogId) { 
  if($catalogId=='catalog1')
          return "<HTML> … </HTML>";
elseif ($catalogId='catalog2')
return "<HTML>…</HTML>";

}
기본적으로 WSDL 캐시가 활성화된다. soap.wsdl_cache_enabled 설정 옵션을 0으로 설정하여 WSDL 캐시를 비활성화한다.
ini_set("soap.wsdl_cache_enabled", "0");
catalog.wsdl WSDL을 이용하는 SoapServer 객체를 생성한다.
$server = new SoapServer("catalog.wsdl");
addFunction() 메소드를 이용하여 SoapServer 객체에 getCatalogEntry 함수를 추가한다. SOAP 웹 서비스는 getCatalogEntry 오퍼레이션을 제공한다.
$server->addFunction("getCatalogEntry");
SOAP 요청을 처리한다.
$server->handle();
soap-server.php 스크립트가 아래에 나타나 있다.
<?php 
function getCatalogEntry($catalogId) { 
  if($catalogId=='catalog1')

return "<HTML>
 <HEAD>
  <TITLE>Catalog</TITLE>
 </HEAD
 <BODY>
<p> </p>
 <table border>
<tr><th>CatalogId</th>
<th>Journal</th><th>Section
</th><th>Edition</th><th>
Title</th><th>Author</th>
</tr><tr><td>catalog1</td>
<td>IBM developerWorks</td><td>
XML</td><td>October 2005</td>
<td>JAXP validation</td>
<td>Brett McLaughlin</td></tr>
</table>
</BODY>
</HTML>";

elseif ($catalogId='catalog2')

return "<HTML>
 <HEAD>
  <TITLE>Catalog</TITLE>
 </HEAD
 <BODY>
<p> </p>
 <table border>

<tr><th>CatalogId</th><th>
Journal</th><th>Section</th>
<th>Edition</th><th>Title
</th><th>Author
</th></tr><tr><td>catalog1
</td><td>IBM developerWorks</td>
<td>XML</td><td>July 2006</td>
<td>The Java XPath API
</td><td>Elliotte Harold</td>
</tr>
</table>
</BODY>
</HTML>";
} 

ini_set("soap.wsdl_cache_enabled", "0"); 
$server = new SoapServer("catalog.wsdl"); 
$server->addFunction("getCatalogEntry"); 
$server->handle(); 

?>
다음 섹션에서는 SOAP 서버에 요청을 전송하는 SOAP 클라이언트를 작성해볼 것이다.

 
 

Total 25
번호 제   목 조회
공지 php 라이브러리 93
25 php 라이브러리 93
24 isset, empty, is_null의 상관 관계와 정보 요약 / define(), de… 1366
23 cookie(쿠키) & session(세션) 4762
22 PHP4 + NuSOAP 4203
21 Java + PHP SOAP 모듈 설치 4721
20 PHP SOAP Extension 6291
19 PHP를 이용한 웹 서비스 개발(3) 3272
18 PHP를 이용한 웹 서비스 개발(2) 3112
17 PHP를 이용한 웹 서비스 개발(1) 3855
16 파일-텍스트 카운터 만들기/파일-이미지 카운터 만들기/DB-이미… 2704
15 간단한 문자열분리,찾기,변환 => explode,substr,strstr,ereg… 7664
14 php 이전 경로를 알아내는 함수 6382
13 php 함수정리 1 5426
12    php 함수정리 all 4174
11 CLASS 3633
10 GD and Image 함수 목록 6185
9 file()관련함수 4037
8 array 배열 함수 목록 4099
7 String 함수 목록 3727
6 each() 2980
 1  2  
 
개인홈페이지 덤벙닷컴은 프로그래머와 디자이너위한 IT커뮤니티 공간입니다.
Copyright ⓒ www.dumbung.com. All rights reserved.