<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編寫SOAP服務(wù)是相當(dāng)方便的(編寫客戶端也同樣方便,可點(diǎn)這里),但是如果用其它語(yǔ)言來(lái)訪問(wèn)它,卻不容易,下面介紹一種不需要WSDL描述就能訪問(wèn)它的方法。

    先看一個(gè)PERL編寫的WEB服務(wù),這是啟動(dòng)一個(gè)內(nèi)建的HTTP服務(wù),在977端口偵聽,然后將請(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ù)寫一個(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)鍵是生成代理,我寫在了一個(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));
        }
        
    }


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

    posted on 2007-12-05 12:00 我愛(ài)佳娃 閱讀(3097) 評(píng)論(0)  編輯  收藏 所屬分類: Perl 、web技術(shù)
    主站蜘蛛池模板: 国产偷伦视频免费观看| 亚洲AV色欲色欲WWW| 18禁成年无码免费网站无遮挡| 亚洲色丰满少妇高潮18p| 精品久久久久久久免费人妻| 亚洲精品成人网站在线播放| 最近最好的中文字幕2019免费| 羞羞视频在线免费观看| 久久精品国产亚洲AV麻豆不卡 | 国产精品亚洲а∨天堂2021| 亚洲高清在线视频| 又大又黄又粗又爽的免费视频 | 亚洲色图视频在线观看| 狠狠久久永久免费观看| 国产精品免费看久久久| 男女猛烈无遮掩视频免费软件| 亚洲精品自产拍在线观看动漫| 国产无遮挡色视频免费视频| 456亚洲人成影院在线观| 久久久久亚洲精品影视| www亚洲一级视频com| 久久电影网午夜鲁丝片免费| 国产无遮挡又黄又爽免费网站| 午夜在线a亚洲v天堂网2019| 久久亚洲精品中文字幕| 亚洲精品乱码久久久久久自慰| 亚洲视频免费在线观看| 男男gay做爽爽免费视频| 国产精品亚洲综合五月天| 亚洲国产一区在线观看| 亚洲国产美女视频| 亚洲av极品无码专区在线观看| 国产乱妇高清无乱码免费| 午夜男人一级毛片免费| 美女被爆羞羞网站免费| 国产亚洲视频在线播放| 日本免费xxxx色视频| 无码天堂va亚洲va在线va| 亚洲香蕉网久久综合影视| 性xxxxx免费视频播放| 一二三四在线观看免费中文在线观看|