2006/04/01 13:17 Developer
XML_RPC 동작 원리
XML-RPC의 스펙
http://www.xmlrpc.com/spec
XML-RPC HOWTO
http://kldp.org/HOWTO/html/XML-RPC-HOWTO/index.html
xmlrpc libraty for PHP
http://scripts.incutio.com/xmlrpc/
http://www.devshed.com/c/a/php/using-xmlrpc-with-php/6/
지원하는 데이터타입은 어떤 JAVA 클래스도 가능하지만, 현재의 라이브러리 버전은 매개변수와 리턴값은 다음과 같은 형태만 지원한다. 따라서 다음의 형태가 아닌 다른 형태로 매개변수와 리턴값을 처리하면 에러가 발생한다.
아래 표는 현재 아파치 XML-RPC에서 사용 가능한 타입입니다.
| XML-RPC data type | Data Types generated by the Parser | Types expected by the Invoker as input parameters of RPC handlers |
|---|---|---|
| <i4> or <int> | java.lang.Integer | int |
| <boolean> | java.lang.Boolean | boolean |
| <string> | java.lang.String | java.lang.String |
| <double> | java.lang.Double | double |
| <dateTime.iso8601> | java.util.Date | java.util.Date |
| <struct> | java.util.Hashtable | java.util.Hashtable |
| <array> | java.util.Vector | java.util.Vector |
| <base64> | byte[ ] | byte[ ] |
다시 정리를 해보면,
데이터 객체를 reflectionAPI를 이용해서 프러퍼티와 값을 알아낸후 XML 타입으로 인코딩을 네트워크를 흘러서 간 다음 다시 그것에서 XML을 다시 클라이언트 환경에 맞는 랭귀지의 데이터 타입으로 디코딩을 해주는 것이다.
참고 : JAXP-RPC는 XML-RPC와는 전혀 다르고, RMI와 통신방법이나 LifeCycle이 유사하다.(객체 Serialization)
org.apache.xmlrpc.DefaultTypeFactory클래스를 보면 데이터 기본형을 맞추어주는 부분이다.
물론, cdata에 해당하는 부분은 네크워크상에서 base64 로 인코딩을 해서 글자가 깨지지 않게 해준다. 필요하다면, <struct>와 <array>에 해당하는 xmlrpc타입을 다른 자바형태입으로 확장을 하는 클래스를 작성해서 사용 할수도 있다.
org.apache.xmlrpc.DefaultXmlRpcTransportFactory는 XML의 전달방법에 대한 객체를 생성해준다. default는 일반 xml문서이고, gzip등등 압축을 통해서 전달할 수도 있다.
* DefaultXmlRpcTransport : default를 사용하는 Transport
* CommonsXmlRpcTransport : gzip으로 받을 경우의 Transport
--> ologist생각 : 내용 자체를 encryption, decrytion을 하는 클래스를 작성해서 해서 보안을 강화할 수도 있다.
org.apache.xmlrpc.XmlRpcClient클래스는 기본적으로 xmlrpc에서 사용하는 클래스이다.
: public XmlRpcClient(URL url, XmlRpcTransportFactory transportFactory)를 통해서 전달방법을 선택할 수가 있다.
* org.apache.xmlrpc.secure.* 패키지 클래스들을 참고해서 회사 보안 정책에 맞는 클래스를 구현해서 사용을 하면 된다.
org.apache.xmlrpc.secure.SecureWebServer
org.apache.xmlrpc.secure.SecureXmlRpcClient
- IP체크를 통해서 보안을 유지할 수 있다.
org.apache.xmlrpc.AuthenticatedXmlRpcHandler 인증을 통한 예제, 인터페이스를 구현후 WebServer에 add를 한다.
org.apache.xmlrpc.XmlWriter 를 확장을 해서 원하는 데이터 타입을 추가할 수가 있다.
[CODE] /* * Copyright 1999,2005 The Apache Software Foundation. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */package org.apache.xmlrpc;
import java.text.ParseException;
import org.apache.commons.codec.binary.Base64; import org.apache.commons.codec.DecoderException; import org.apache.xmlrpc.util.DateTool;
/** * The default implementation of the <code>TypeFactory</code> * interface. Provides the following mappings: * * <table cellpadding="3" cellspacing="2" border="1" width="100%"> * <tr><th>XML-RPC data type</th> <th>Java class</th></tr> * <tr><td><i4> or <int></td> <td>java.lang.Integer</td></tr> * <tr><td><boolean></td> <td>java.lang.Boolean</td></tr> * <tr><td><string></td> <td>java.lang.String</td></tr> * <tr><td><double></td> <td>java.lang.Double</td></tr> * <tr><td><dateTime.iso8601></td> <td>java.util.Date</td></tr> * <tr><td><base64></td> <td>byte[ ]</td></tr> * </table> * * @author <a href="Andrew'>mailto:andrew@kungfoocoder.org">Andrew Evers</a> * @see org.apache.xmlrpc.TypeFactory * @since 1.2 */ public class DefaultTypeFactory implements TypeFactory { /** * Thread-safe wrapper for the <code>DateFormat</code> object used * to parse date/time values. */ private static DateTool dateTool = new DateTool(); private static final Base64 base64Codec = new Base64();
/** * Creates a new instance. */ public DefaultTypeFactory() { }
public Object createInteger(String cdata) { return new Integer(cdata.trim()); }
public Object createBoolean(String cdata) { return ("1".equals(cdata.trim ()) ? Boolean.TRUE : Boolean.FALSE); }
public Object createDouble(String cdata) { return new Double(cdata.trim ());
}
public Object createDate(String cdata) { try { return dateTool.parse(cdata.trim()); } catch (ParseException p) { throw new RuntimeException(p.getMessage()); } }
public Object createBase64(String cdata) { try { return base64Codec.decode((Object) cdata.getBytes()); } catch (DecoderException e) { //TODO: consider throwing an exception here? return new byte[0]; } }
public Object createString(String cdata) { return cdata; } }
[/CODE]