利用kSOAP实现在java环境下使用ASP.NET Webservices

发布时间: 2014/1/22 11:39:55

简介

这篇帮助文档像大家简要展示,在java应用程序中如何使用ASP.NET 编写的webservice。
它能在很多安卓程序中起到很大作用。前段时间,我在一个项目中就使用了该技术。比如:在线生成PDF文件。同时我还用它获取服务中的数据,比如从SQL Server中获取。以上所有都属于.NET开发技术范畴的外部应用程序。

背景

主要的思路是用下面非常简单的语法,在平台之间调用一个web方法:

而这样就可以生成了一个简单的托管代码。
利用该方法,实现在java环境下调用 一个ASP.NET 的webservice,需要我们在Java中指定的名称和Web方法的名称相匹配。

代码

如何调用

在java中调用ASP.NET 的web方法:

String helloworld = MyWebservice.Query("HelloWorld");


c# 编写的ASP.NET Web 方法

 [WebMethod]
 public string HelloWorld()
 {
     return "Hello World";   
 }


灵活的参数

当然任何一簇参数均可以被传递, 所以这个方法可以被用于重载:

C#编写的ASP.NET Web方法

[WebMethod]
public string HelloPerson(string person)
{
    return "Hello " + person;          
}

在java中,为了向请求中引入参数,我们要使用Parameter(下面引用的)类:

String response = 
    MyWebservice.Query(
        "HelloPerson", 
        new Parameter("person", "John", "person".getClass()));

正像你看到的,此处的参数名和web方法中的参数名相同。
默认的参数类型是String。
当然,如果有一系列参数的话,我们也可以使用一个数组:

 Parameter[] parameters = new Parameter[2]; 
 Parameters.Add(new Parameter("person", "John"));
 Parameters.Add(new Parameter("city", "Madrid"));
 String response = MyWebservice.Query("HelloPersonInCity", parameters);

ASP.NET web方法可以返回多种类型。并且它们所有的类型都可以被java序列化。这就是为什么java 的查询方法始终返回一个Object类型的原因。这将引导我们自己决定如何把它们序列化,其中一种可用的方式是使用ASP.NET的JSON来解析。

引用web服务

我们要实例化AspNetWebservice 类(下面引用)到指定的,并且是我们需要调用方法的服务器。

AspNetWebservice MyWebservice = new AspNetWebservice("localhost/MyWebService.asmx");

或者直接指定命名空间和soap的操作:

 AspNetWebservice MyWebservice = new AspNetWebservice(
         "http://tempuri.org/", 
         "http://tempuri.org/",  
         "localhost/MyWebService.asmx");

完全应用

public class AspNetWebservice {
        public String SOAP_NAMESPACE;
        public String WSDL_TARGET_NAMESPACE;
        public String SOAP_ADDRESS;

        public static String DEFAULT_NAMESPACE = "http://tempuri.org/"; 
        public static String DEFAULT_ACTION_NAMESPACE = "http://tempuri.org/";

    public AspNetWebservice(String soapaddress){
        this(DEFAULT_ACTION_NAMESPACE, DEFAULT_NAMESPACE, soapaddress);
    }   
    public AspNetWebservice(String sopaaction, String namespace, String soapaddress){
        SOAP_NAMESPACE= sopaaction;
        WSDL_TARGET_NAMESPACE = namespace;
        SOAP_ADDRESS = soapaddress;
    }
    public Object Query(string WebmethodName){
        return Query(WebmethodName, null);
    }
    public Object Query(String WebmethodName, Parameter[] parameters){
        SoapObject soapRequest = new SoapObject(WSDL_TARGET_NAMESPACE, WebmethodName);
        
        // The envelop request
        SoapSerializationEnvelope soapEnvelope = 
                    new SoapSerializationEnvelope(SoapEnvelope.VER11);
    
    //Enabling ASP.NET Webservices in Java
        soapEnvelope.dotNet = true;

        if(parameters != null){
            // The properties that will be passed as parameters
            PropertyInfo pi = new PropertyInfo();
            for(Parameter param: parameters){
                pi.setName(param.getName());
                pi.setValue(param.getValue());
                pi.setType(param.getType());
                // Assigning each property to the request
                soapRequest.addProperty(pi);
            }
        }

        soapEnvelope.setOutputSoapObject(soapRequest);

        HttpTransportSE httpTransport = new HttpTransportSE(SOAP_ADDRESS);
        Object response = null;
        try
        {
                     // Send the request via a customized call method
                    httpTransport.call(SOAP_NAMESPACE + WebmethodName, envelope);
                    // Getting the response
                    response = soapEnvelope.getResponse();
        }
        catch(Exception ex){
            return "It occurred an error in the request:\n" + ex.getMessage();
        }
        return response;
    }

    public class Parameter {
        private String Name;
        private String Value;
        private Object Type;
    public Parameter(String Name, String Value, Object type){
             this.Name = Name;
             this.Value = Value;
             this.Type = type;
       }
       public Parameter(String Name, String Value){
            this(Name, Value, String.Class);
       }
       public String getName(){
            return Name;
       }
       public String getValue(){
            return Value;
       }        
       public Object getType(){
            return Type;
       }
    }
}

上面的实例,基于kSoap 类库的使用。
kSoap是考虑到兼容在java环境下开发的小程序或者J2ME应用程序而创造的SOAP web服务端类库。

参考

  • 简单来说,kSoap是一个适用于J2ME或基于java程序的轻量级的SOAP引擎。http://ksoap2.sourceforge.net/about.shtml

  • 如果你想把kSoap应用到任何项目,那么你可以在这里http://sourceforge.net/projects/ksoap2下载


官方微信
官方QQ群
31647020