[출처] http://www.hanb.co.kr/network/view.html?bi_id=1432


PHP를 이용한 웹 서비스 개발(1)


경축! 아무것도 안하여 에스천사게임즈가 새로운 모습으로 재오픈 하였습니다.
어린이용이며, 설치가 필요없는 브라우저 게임입니다.
https://s1004games.com

                       
제공 : 한빛 네트워크
저자 : 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 클라이언트를 작성해볼 것이다.




본 웹사이트는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
번호 제목 글쓴이 날짜 조회 수
28 neural-network by php file 졸리운_곰 2016.03.16 152
27 Learning Library for PHP file 졸리운_곰 2016.03.16 371
26 php 전문가 시스템 php expert system file 졸리운_곰 2016.03.15 56
25 How to Insert JSON Data into MySQL using PHP file 졸리운_곰 2015.12.04 817
24 이클립스(Eclipse) PHP 개발환경 설정. file 졸리운_곰 2015.11.14 216
23 PHP로 만든 달력 file 졸리운_곰 2015.10.27 117
22 라이트 cms 다운로드 ritecms_2.2.1.zip file 졸리운_곰 2015.10.27 24
21 드루팔 다운로드 drupal-7.41.zip file 졸리운_곰 2015.10.27 11
20 도쿠위키 다운로드 dokuwiki-5422200921b.tgz file 졸리운_곰 2015.10.27 47
19 미디어위키 다운로드 mediawiki-1.25.3.tar.gz file 졸리운_곰 2015.10.27 34
18 워드프레스 다운로드 wordpress-4.3.1-ko_KR.zip file 졸리운_곰 2015.10.27 34
17 제로보드 다운로드 XE Core ver. 1.8.13 xe.zip file 졸리운_곰 2015.10.27 30
16 XE 스킨 제작 매뉴얼 v1.1 XE-Skin_Manual-ko(v1.1).pdf file 졸리운_곰 2015.10.26 21
15 제로보드 XE 개발자 가이드 file 졸리운_곰 2015.10.26 23
14 php로 웹 수집 : Basic PHP Web Scraping Script Tutorial 졸리운_곰 2015.09.20 64
13 PHP 와 MYSQL 연동 졸리운_곰 2015.08.11 585
12 PHP 기반의 Micro Frameworks 정리 졸리운_곰 2015.05.15 276
11 PHP의 composer 란 무엇인가?, PHP 의존성 관리도구 졸리운_곰 2015.05.15 372
10 슬림(Slim): 마이크로 프레임워크 [모바일 restful 서버] 졸리운_곰 2015.05.15 243
9 15 very useful PHP code snippets for PHP developers 졸리운_곰 2015.05.12 246
대표 김성준 주소 : 경기 용인 분당수지 U타워 등록번호 : 142-07-27414
통신판매업 신고 : 제2012-용인수지-0185호 출판업 신고 : 수지구청 제 123호 개인정보보호최고책임자 : 김성준 sjkim70@stechstar.com
대표전화 : 010-4589-2193 [fax] 02-6280-1294 COPYRIGHT(C) stechstar.com ALL RIGHTS RESERVED