<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-124  評(píng)論-194  文章-0  trackbacks-0
    用PERL編寫(xiě)SOAP服務(wù)是相當(dāng)方便的(編寫(xiě)客戶端也同樣方便,可點(diǎn)這里),但是如果用其它語(yǔ)言來(lái)訪問(wèn)它,卻不容易,下面介紹一種不需要WSDL描述就能訪問(wèn)它的方法。

    先看一個(gè)PERL編寫(xiě)的WEB服務(wù),這是啟動(dòng)一個(gè)內(nèi)建的HTTP服務(wù),在977端口偵聽(tīng),然后將請(qǐng)求分發(fā)到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的內(nèi)容,它訪問(wèn)CXF傳過(guò)來(lái)的一個(gè)結(jié)構(gòu)(定義在后面),并返回一個(gè)字符串:

    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對(duì)每個(gè)服務(wù)方法都是按照對(duì)象方式調(diào)用,所以第一個(gè)參數(shù)是self,之后依次是本身的參數(shù)列表,最后是整個(gè)envelope,我們只有一個(gè)參數(shù),訪問(wèn)它就夠了。
    上面用了PERL的DUMPER,這個(gè)工具很方便,你可以清楚看到傳過(guò)來(lái)的東西。

    下面來(lái)看下CXF客戶端怎么做:
    CXF生成客戶端,有3種方法,點(diǎn)這里,其中,還有動(dòng)態(tài)生成代理的方法,點(diǎn)這里。但是,都需要WSDL文件,其實(shí)我們不需要這個(gè)文件,先自己依照PERL的WEB服務(wù)寫(xiě)一個(gè)方法定義接口:

    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是個(gè)結(jié)構(gòu)定義如下:

    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;    
    }


    最關(guān)鍵是生成代理,我寫(xiě)在了一個(gè)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));
        }
        
    }


    開(kāi)始URI老不知道在哪里設(shè)置,總在@WebService的屬性里試來(lái)試去,都不行,后來(lái)發(fā)現(xiàn)setServiceName這個(gè)方法,藥到病除。

    posted on 2007-12-05 12:00 我愛(ài)佳娃 閱讀(3096) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): Perlweb技術(shù)
    主站蜘蛛池模板: 日韩精品成人亚洲专区| 亚洲一欧洲中文字幕在线| 久久九九全国免费| 亚洲精品伊人久久久久| 免费乱码中文字幕网站| 男人进去女人爽免费视频国产| 精品亚洲AV无码一区二区| 亚洲国产精品第一区二区三区| 无码日韩精品一区二区免费暖暖| 亚洲日本天堂在线| 亚洲AV无码精品色午夜果冻不卡 | 久久午夜夜伦鲁鲁片免费无码影视| 亚洲精品日韩一区二区小说| 亚洲国产精品无码久久一区二区| 成人黄软件网18免费下载成人黄18免费视频| 午夜成人无码福利免费视频| 亚洲福利视频网站| 亚洲一区二区三区无码中文字幕 | 国产亚洲成归v人片在线观看| 亚洲一区二区三区免费视频| 一级一级毛片免费播放| 亚洲国产乱码最新视频| 久久精品亚洲视频| 亚洲国产一区视频| 香蕉视频在线观看免费国产婷婷 | 又粗又硬免费毛片| 青青青国产在线观看免费网站| jizz免费在线影视观看网站| 亚洲日韩国产AV无码无码精品| 久久精品国产亚洲AV嫖农村妇女| 午夜亚洲福利在线老司机| 国产精品成人免费一区二区| 久久免费高清视频| sss在线观看免费高清| 久久人午夜亚洲精品无码区| 亚洲一级毛片中文字幕| 亚洲欧洲日产国码久在线观看| 亚洲午夜av影院| 亚洲国产91精品无码专区| 好男人视频在线观看免费看片| 成年人网站免费视频|