<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ù)
    主站蜘蛛池模板: 久久久久久精品成人免费图片| 亚洲男人天堂2020| 久久亚洲私人国产精品| 国产免费一区二区三区免费视频| 大陆一级毛片免费视频观看| 亚洲国产日韩女人aaaaaa毛片在线| a在线观看免费网址大全| 亚洲国产香蕉人人爽成AV片久久| 亚洲第一第二第三第四第五第六 | 亚洲黄色免费网站| 情人伊人久久综合亚洲| 一级毛片在线完整免费观看| 日韩a级毛片免费观看| 亚洲人精品亚洲人成在线| 麻豆高清免费国产一区| 久久亚洲AV成人无码电影| 大地影院MV在线观看视频免费| 久久精品夜色噜噜亚洲A∨| 未满十八私人高清免费影院| 国产一级淫片视频免费看| 亚洲欧美成aⅴ人在线观看| 国产精品成人免费一区二区| 亚洲国色天香视频| 亚洲电影在线免费观看| 久久亚洲日韩精品一区二区三区| 日韩插啊免费视频在线观看| 亚洲av永久无码精品网站| av永久免费网站在线观看| 久久精品国产精品亚洲色婷婷 | 国产免费午夜a无码v视频| 老子影院午夜伦不卡亚洲| 日韩一区二区免费视频| 亚洲大码熟女在线观看| 在线免费观看一级毛片| 亚洲国产成人精品无码区二本| 日韩高清在线免费看| 老子影院午夜伦不卡亚洲| 免费人成视频在线观看视频| 黄色一级毛片免费| 亚洲综合精品网站| 国产又黄又爽又大的免费视频|