데이터 규약(data contract) 작성을 위해서 사용되는 XSD 추론도구중 하나로 웹 서비스를 개발할때나 XML을 가지고 놀때 사용하면 좋음.

사용방법
java -jar trang.jar EvaluateHandRequest.xml, EvaluateHandResponse.xml PokerType.xsd

Posted by 짱가쟁이
출처

XmlRpcServlet 을 사용한 단순한 형태의 standalone webserver 이다. web server 의 servlet api 를 활용하여 구현된다.


1. org/apache/xmlrpc/webserver/XmlRpcServlet.properties

- 위 경로에 맞춰서 프로퍼티를 생성하고 서비스 클래스 패스를 작성하면 땡.

 

2. 서비스 클래스 작성

- 적당히 알아서 만들어 주면 땡.

 

3. ServletServer.java

- servlet api 가 없으면 밑의 빨갛게 칠해진 코드에서 컴파일 에러가 나온다. (tomcat 6.0 의 servlet-api.jar 사용)


Example Code

import org.apache.xmlrpc.webserver.ServletWebServer;
import org.apache.xmlrpc.webserver.XmlRpcServlet;

public class ServletServer {

 private static final int port = 8080;

    public static void main(String[] args) throws Exception {
        XmlRpcServlet servlet = new XmlRpcServlet();
        ServletWebServer webServer = new ServletWebServer(servlet, port);
        webServer.start();
    }

}



Posted by 짱가쟁이
출처

XmlRpcServlet 를 이용하면 XML-RPC Server 를 손쉽게 만들 수 있다.

1개의 설정파일과 서비스를 위한 class 및 web.xml 을 수정하면 문서처럼 10분이면 끝난다.

테스트는 eclipse + apach 6.0 에서 수행함.


web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
 <display-name>xml_rpc_web</display-name>
 
 <servlet>
        <servlet-name>XmlRpcServlet</servlet-name>
        <servlet-class>org.apache.xmlrpc.webserver.XmlRpcServlet</servlet-class>
        <init-param>
          <param-name>enabledForExtensions</param-name>
          <param-value>true</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>XmlRpcServlet</servlet-name>
        <url-pattern>/bbaeggar</url-pattern>
    </servlet-mapping>
   
</web-app>

XmlRpcServlet.properties
- 요넘은 org/apache/xmlrpc/webserver/XmlRpcServlet.properties 경로에 만들어 줘야함.
Calculator=org.apache.xmlrpc.demo.Calculator
Login=org.apache.xmlrpc.demo.Login


3. 서비스 클래스..

위에 프로퍼티에서 사용되는 서비스 클래스는 알아서 만들어주면 될듯.


4. 테스트

Client.java

import java.net.URL;


import org.apache.xmlrpc.client.XmlRpcClient;
import org.apache.xmlrpc.client.XmlRpcClientConfigImpl;
import org.apache.xmlrpc.client.XmlRpcCommonsTransportFactory;

public class Client {

 public static void main(String[] args) throws Exception {
        // create configuration
        XmlRpcClientConfigImpl config = new XmlRpcClientConfigImpl();
        config.setServerURL(new URL("http://127.0.0.1:8080/xml_rpc_web/bbaeggar"));
        config.setEnabledForExtensions(true); 
        config.setConnectionTimeout(60 * 1000);
        config.setReplyTimeout(60 * 1000);

        XmlRpcClient client = new XmlRpcClient();
     
        // use Commons HttpClient as transport
        client.setTransportFactory(
            new XmlRpcCommonsTransportFactory(client));
        // set configuration
        client.setConfig(config);

        // make the a regular call
        Object[] params = new Object[]
            { new Integer(2), new Integer(3) };
        Integer result = (Integer) client.execute("Calculator.add", params);
         System.out.println("2 + 3 = " + result);
        
         for(int i = 0;i<100;i++) {
      // make the a regular call
         Object[] params1 = new Object[]
             { "bbaeggar", "0000" };
         Boolean result1 = (Boolean) client.execute("Login.login", params1);
          System.out.println("is Login = " + result1);
         }
     
    }

}


ps.

http://ws.apache.org/xmlrpc/server.html <- 여기를 잘 읽다보면 stand-alone 형태로도 서비스를 제공할 수 있어 더 좋은듯.

 


Posted by 짱가쟁이

- 위 sample 을 돌려보고 싶으면 위의 두개가 없어서 안돌아감.. 알아서 다운받고 사용하면 잘 돌아갈듯 싶지만.. 이클립스 버그인지.. 아니면 내부적으로 돌아가고 있는 엔진이 문제인지는 모르것지만.. 클라이언트측에서 서버측 원격메소드를 찾지 못하는 버그가 발생됨. 이때 당황하지 말고 clean &  build 수행 후 다시 run 하면 결과가 잘나온다.

 


Posted by 짱가쟁이
2010. 6. 30. 09:25
출처

SOAP (Simple Object Access Protocol)

 

소프트웨어간에 메시지(오브젝트)를 교환하는 형태의 프로토콜이다. 이는 확장가능한 분산 프로토콜로 HTTP나 SMTP 등의 다양한 통신 프로토콜을 사용하여 전달할 수 있으며, XML-RPC를 확장 계승한 형태이다.

SOAP 는 XML을 근간으로 헤더(header)와 바디(body)를 조합하는 디자인 패턴으로 설계되어
있다. 헤더(header)는 선택사항으로 반복이나 보안 및 트랜잭션(transaction)을 정보로 하는 메타정보를 갖고 있으며, 바디(body) 부분은 핵심 정보로 이루어져 있다.

 

XML-RPC (eXtensible Markeup Language - Remote Procedure Call)

 

HTTP를 통해 XML 기반의 메시지를 교환하는 프로토콜이다.
XML에 데이터 타입을 담을 수 있는 간단한 방법을 제공하여 원격지에 있는 함수(method)를 호출할 수 있도록 구성되어 있다.

* SOAP은 그 자체가 하나의 독립적인 HTTP 메시지를 구성했지만, XML-RPC는 HTTP의 POST 요청의 내용을 단순히 XML로 구성한 것에서 차이가 있다.
공통점은 인터넷 표준인 HTTP 프로토콜을 이용하고 플랫폼으로부터 독립적인 XML을 이용한다는 것.

 

 


XML-RPC

SOAP

CORBA

 

개발편의

개발이 용이.

쉬운 구조.

XML-RPC

보다 복잡함.

개발이 어려움.

매우 복잡함.

 

통합

운영체제 및 언어

독립적.

스텁코드가 필요 없음.

운영체제 및 언어에

독립적.

스텁 코드가 불필요.

제품간에 호환성에

다소 문제가 있음.

클라이언트 스텁

필요함.

 

서비스

형태

간단한 웹 서비스.

복잡한 웹 서비스.

응용프로그램

및 전사적 시스템.

 

확장

간단한 구조.

XML 스키마 기반에 확장성이 뛰어남.

확장성이 뛰어남.

 

보안

HTTPS.

HTTPS

XML 서명(진행 중)

XML 암호화(진행 중)

XML ACL(진행 중)

Object Security

Service.

ORB기반

보안 메커니즘.

 

서비스

제공서비스가 없음.

UDDI, 보안.

Name Service. Event Service, Transaction Service, Object Security Service 등 다수.

 

 


Posted by 짱가쟁이
참조

1. Services Client-side Code 생성
- build.xml
  : Ant Build 하기 전에 Web Service Server 를 실행시켜야 함.
<project default="wsimport">

  <target name="wsimport">
    
    <exec executable="wsimport">    
      <arg line="-keep -s ./src -p com.hoon.webclient.service
          -d ./bin http://localhost:8080/hello?wsdl"/>
    </exec>
  
   <exec executable="wsimport">    
      <arg line="-keep -s ./src -p com.hoon.webclient.service
          -d ./bin http://localhost:8080/login?wsdl"/>
    </exec>
  
  </target>

</project>

- Ant Build 실행하면 코드 생성됨 (com.hoon.webclient.service)


2. Client Application 생성

LoginClient.java
package com.hoon.webclient.login;

import javax.xml.ws.BindingProvider;

import com.hoon.webclient.service.SampleLogin;
import com.hoon.webclient.service.SampleLoginService;

public class LoginClient {

public static void main(String args[]) {
 
        SampleLoginService shs = new SampleLoginService();
 
        SampleLogin sh = (SampleLogin) shs.getSampleLoginPort();
 
        ((BindingProvider)sh).getRequestContext().put(BindingProvider.
            ENDPOINT_ADDRESS_PROPERTY, "http://localhost:8080/login");

        System.out.println( ((BindingProvider)sh).toString() );

        System.out.println(sh.checkLogin("bbaeggar", "000"));
굵게
    }
}

SayHelloClient.java
package com.hoon.webclient.hello;

import javax.xml.ws.BindingProvider;

import com.hoon.webclient.service.SayHello;
import com.hoon.webclient.service.SayHelloService;

public class SayHelloClient {

 public static void main(String args[]) {
 
        SayHelloService shs = new SayHelloService();
 
        SayHello sh = (SayHello) shs.getSayHelloPort();
 
        ((BindingProvider)sh).getRequestContext().put(BindingProvider.
            ENDPOINT_ADDRESS_PROPERTY, "http://localhost:8080/hello");

        System.out.println( ((BindingProvider)sh).toString() );

        System.out.println(sh.getGreeting("bbaeggar"));
    }
}


3. Run

Posted by 짱가쟁이

Web service server 는 Apache CXF로 구현하고, Client는 ASP로 운영을 하겠다고 하는데..
좀 더러운건.. Asp 테스트 프로그램까지 만들어 줘야 한다는거..
뭐 테스트를 위해서 찾게된 넘이 MSSOAP라는 넘이다. 요넘 뭐가 이렇게 복잡한지 처음에는 도통 알아 먹기가 힘든지 쩌ㅃ~
자 우선은 high, low level 로 구현할 수 있다고 하는데.. 뭐 당연히 상위레벨이 구현은 편하기는 하더라.. 대신 파라메터를 Object로 입력받으면 어쩔수 없이 하위레벨로 구현을 해야 한다.
밑에 넘이 하위 레벨로 구현한 넘이다.

<%
 
    set Serializer       = Server.CreateObject("MSSOAP.SoapSerializer30")
    set Reader          = Server.CreateObject("MSSOAP.SoapReader30")
    Set Connector    = Server.CreateObject("MSSOAP.HttpConnector30")
 
    Connector.Property("EndPointURL") = "http://localhost:8080/star_map_sp/StarMapService/SOAP?wsdl"
    Connector.Connect
    Connector.Property("SoapAction") = "uri:KHAA01"
    Connector.BeginMessage

    Set Serializer = Server.CreateObject("MSSOAP.SoapSerializer30")
    Serializer.Init Connector.InputStream
    Serializer.StartEnvelope
    Serializer.StartBody
    Serializer.StartElement "MethodName"        '요넘 이 메소드 명
    Serializer.StartElement "RootElementName"  ' XML root  element
    Serializer.StartElement "ElementName"
    Serializer.WriteString "value"
    Serializer.EndElement
    Serializer.StartElement "ElementsName"
    Serializer.WriteString "value"
    Serializer.EndElement
    Serializer.EndElement
    Serializer.EndElement
    Serializer.EndBody
    Serializer.EndEnvelope
 
    Connector.EndMessage

    Reader.Load Connector.OutputStream
  
    Set oNodeList = Reader.RPCParameter("KHAA01Res").childNodes

    For x=1 to oNodeList.length
            Set obj = oNodeList.Item(x-1)
          
            if(obj.baseName = "test") then
                Response.Write obj.baseName
          Response.Write "  :  "
          Response.Write obj.text
      elseif(obj.baseName = "object") then
          Response.Write "<BR><BR>"
          Response.Write obj.baseName
          Response.Write "<BR>"
          Set childList = obj.childNodes      
          For i=1 to childList.length
              Response.Write childList.Item(i-1).baseName
              Response.Write "  :  "
              Response.Write childList.Item(i-1).text
              Response.Write "<BR>"
          Next
      end if   
      Response.Write "<BR>"
   Next

%>

대충 보면 Connect로 URL과 메소드명을 설정하고, Serializer 로 입력 파라메터를 구현한다.
뭐.. 수신한 데이터는 알아서 사용하면 됨.

'VBS' 카테고리의 다른 글

[VBS] - BASE64 String to Image  (0) 2010.06.25
Posted by 짱가쟁이
이전버튼 1 이전버튼