隨筆-124  評論-194  文章-0  trackbacks-0
          用PERL編寫SOAP服務是相當方便的(編寫客戶端也同樣方便,可點這里),但是如果用其它語言來訪問它,卻不容易,下面介紹一種不需要WSDL描述就能訪問它的方法。

          先看一個PERL編寫的WEB服務,這是啟動一個內建的HTTP服務,在977端口偵聽,然后將請求分發到ebnmstest::soap::dispatch


          package leaf::leafsvc::listener;

          use SOAP::Transport::HTTP( +trace => all);
          use SOAP::Lite ( +trace => all, maptype => {} );

          use ebnmstest::soap::dispatch;

          # don't want to die on 'Broken pipe' or Ctrl-C
          #$SIG{PIPE} = $SIG{INT} = 'IGNORE';


          my $daemon = SOAP::Transport::HTTP::Daemon
              
          -> new (LocalPort => 977)
              
          -> dispatch_to('ebnmstest::soap::dispatch')
              ;

          print "Contact to SOAP server at ", $daemon->url, "\n";

          $daemon->handle;


          這是ebnmstest::soap::dispatch的內容,它訪問CXF傳過來的一個結構(定義在后面),并返回一個字符串:

          package ebnmstest::soap::dispatch;

          use vars qw(@ISA); 
          @ISA = qw(Exporter SOAP::Server::Parameters); 
          use SOAP::Lite; 
          use Data::Dumper;


          sub hello {
              
          print "hehe";
              
              
          my $self = shift;     
              
          my $par = shift;
              
          my $envelope = pop;

              
          print Dumper ($par);
              
          print "\n-----------------------\n";
              
          print "$par->{name}, $par->{otherValues}->{item}->[0]->{value}\n";
              
          #print Dumper ($envelope);
              #my $temp = $envelope->dataof("http://c2f/temperature");     
              
              #return SOAP::Data->name('convertedTemp' =>(((9/5)*($temp->value)) + 32)); 

            
              
          return "hehe";
          }

          1;

          PERL對每個服務方法都是按照對象方式調用,所以第一個參數是self,之后依次是本身的參數列表,最后是整個envelope,我們只有一個參數,訪問它就夠了。
          上面用了PERL的DUMPER,這個工具很方便,你可以清楚看到傳過來的東西。

          下面來看下CXF客戶端怎么做:
          CXF生成客戶端,有3種方法,點這里,其中,還有動態生成代理的方法,點這里。但是,都需要WSDL文件,其實我們不需要這個文件,先自己依照PERL的WEB服務寫一個方法定義接口:

          package ebnmstest.soap;

          import javax.jws.*;
          import javax.jws.soap.*;
          import javax.jws.soap.SOAPBinding.*;

          import com.exchangebit.nms.common.sharedata.*;

          @WebService
          public interface dispatch {
              
          public String hello (AddHostData m);
          }


          其中的AddHostData是個結構定義如下:

          package com.exchangebit.nms.common.sharedata;

          import java.util.HashMap;
          import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;

          public class AddHostData implements java.io.Serializable {
              
          public String address; //ip
              public String name;
              
          public String alias; // description

              @XmlJavaTypeAdapter(OtherValuesAdapter.
          class)
              
          public HashMap <String, String> otherValues;    
          }


          最關鍵是生成代理,我寫在了一個TESTCASE里:

          package ebnmstest.soap;

          import java.net.URL;
          import java.util.ArrayList;
          import java.util.List;
          import java.util.HashMap;

          import javax.xml.namespace.QName;
          import org.apache.cxf.service.invoker.AbstractInvoker;
          import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;

          import org.apache.log4j.Logger;
          import org.apache.log4j.PropertyConfigurator;

          import junit.framework.TestCase;


          import ebnmstest.common.ModelBase;
          import com.exchangebit.nms.common.sharedata.*;

          import org.apache.cxf.aegis.databinding.AegisDatabinding;
          import org.apache.cxf.frontend.ClientProxyFactoryBean;


          public class TestLeaf extends TestCase {
              
          static Logger logger = Logger.getLogger (TestLeaf.class.getName());
              
              
          public TestLeaf(String arg0) {
                  
          super(arg0);
              }

              
              
          protected void setUp() throws Exception {
                  PropertyConfigurator.configure (
          "./target/classes/log4j.properties");
                  logger.info (
          "hehe test begin!");
              }


              
          protected void tearDown() throws Exception {
              }



              
          public void testHehe () throws Exception {
                  logger.error (
          "1");

                  
                  ClientProxyFactoryBean factory 
          = new ClientProxyFactoryBean();
                  QName svc_name 
          =    new QName("http://10.56.28.34:977/ebnmstest/soap/dispatch""dispatch");
                  
                  factory.setServiceClass(dispatch.
          class);
                  factory.setAddress(
          "http://10.56.28.34:977/ebnmstest/soap/dispatch");
                  factory.setServiceName (svc_name);
                  logger.info (
          "2");
                  
          //factory.getServiceFactory().setDataBinding(new AegisDatabinding());
                  dispatch client = (dispatch) factory.create();
                  logger.info (
          "3");

                  AddHostData m 
          = new AddHostData ();
                  m.name 
          = "good";
                  m.otherValues 
          = new HashMap ();
                  m.otherValues.put (
          "hehe""haha");     
                  m.otherValues.put (
          "hehe1""haha1");     
                  m.otherValues.put (
          "hehe2""haha2");     
                  System.out.println (client.hello (m));
              }
              
          }


          開始URI老不知道在哪里設置,總在@WebService的屬性里試來試去,都不行,后來發現setServiceName這個方法,藥到病除。

          posted on 2007-12-05 12:00 我愛佳娃 閱讀(3102) 評論(0)  編輯  收藏 所屬分類: Perlweb技術
          主站蜘蛛池模板: 漾濞| 宝应县| 济宁市| 和林格尔县| 交城县| 泌阳县| 青海省| 青岛市| 璧山县| 三河市| 博客| 商水县| 上蔡县| 祁门县| 海门市| 四子王旗| 奉贤区| 库尔勒市| 留坝县| 桐柏县| 定陶县| 珲春市| 祥云县| 株洲县| 镇赉县| 都江堰市| 芜湖县| 宜君县| 济南市| 兰州市| 浦江县| 玉门市| 霞浦县| 宜川县| 和林格尔县| 汝城县| 英德市| 丹凤县| 靖远县| 古浪县| 轮台县|