随笔-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("//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 我爱佳娃 阅读(3056) 评论(0)  编辑  收藏 所属分类: Perlweb技术

只有注册用户登录后才能发表评论。


网站导航: