`
IT梦想家
  • 浏览: 17889 次
社区版块
存档分类
最新评论

WebService程序数据集之WSDL取数

阅读更多

在通用的webservice集合中,在集合中使用wsdl取数的方式获取数据,并将数据转换为程序数据集,那么怎样通过wsdl取数并转换为程序数据集呢?

首先将wsdl获取到的数据数据转换为二维数组,然后通过FineReport的程序数据集接口,将数据导入到接口中,wsdl取数的方式有三种,RPC方式调用、document方式调用以及通过axis2的wsdl2java.bat生成客户端调用,前两种方式不生成客户端代码,比较繁琐,最后一种方式生成客户端代码,但是比较简洁。

在浏览器中输入wsdl文件的地址可得知,wsdl中定义了两个取数函数,getDatabaseInfo 和getMobileCodeInfo ,前者无参数传入,后者需要传入mobileCode参数。


Document方式调用

以上述wsdl为例,使用getDatabaseInfo函数,不传入参数,document方式调用函数代码如下:

 

  • Wsdl数据获取
try {
// 指定调用WebService的URL
String url = "http://www.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl";
EndpointReference targetEPR = new EndpointReference(url);
// 创建一个OMFactory,下面的namespace、方法与参数均需由它创建
OMFactory fac = OMAbstractFactory.getOMFactory();
// 命名空间
OMNamespace omNs = fac.createOMNamespace("http://WebXml.com.cn","a");
// 下面创建的是参数对数
/*
 * OMElement symbol = fac.createOMElement("mobileCode", omNs);
 * symbol.addChild(fac.createOMText(symbol, "18795842"));
 */
// 下面创建一个method对象 ,方法
OMElement method = fac.createOMElement("getDatabaseInfo", omNs);
// method.addChild(symbol);
Options options = new Options();
options.setTo(targetEPR);
options.setAction("http://WebXml.com.cn/getDatabaseInfo");
ServiceClient sender = new ServiceClient();
sender.setOptions(options);
OMElement result1 = sender.sendReceive(method);
} catch (AxisFault axisFault) {
axisFault.printStackTrace();
}

 

  •   OMElement对象转换

由于document方式函数调用取数方式获取到的数据为OMElement对象,所以需要将OMElement转换为二维数组,转换函数代码如下:

public static String[][] getResults(OMElement element) {
        if (element == null) {
            return null;
        }
        Iterator iterator = element.getChildElements();
        Iterator innerItr;
        List<String> list = new ArrayList<String>();
        OMElement result = null;
        while (iterator.hasNext()) {
            result = (OMElement) iterator.next();
            innerItr = result.getChildElements();
            while (innerItr.hasNext()) {
            	OMElement elem = (OMElement)innerItr.next();  
       list.add(elem.getText());
            }
        }
        String[] result1 = list.toArray(new String[list.size()]);
        String results[][] = new String[result1.length][3];
String b1, b2, b3;
for (int i = 0; i < result1.length; i++) {
if (result1[i].length() != 0) {
b1 = result1[i].substring(0, result1[i].indexOf(" "));
b2 = result1[i].substring(result1[i].indexOf(" ") + 1).substring(0,result1[i].substring(result1[i].indexOf(" ") + 1).indexOf(" "));
b3 = result1[i].substring(result1[i].indexOf(" ") + 1).substring(result1[i].substring(result1[i].indexOf(" ") + 1).indexOf(" ") + 1);
results[i][0] = b1;
results[i][1] = b2;
results[i][2] = b3;
}
}
        return results;
}

  

  • 获取数据转换为程序数据集

定义WebServiceTableWsdlDataDemo1.java类,扩展AbstractTableData,将获得的数组数据转为程序数据集。完整代码如下:

package com.fr.data;
 
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMFactory;
import org.apache.axiom.om.OMNamespace;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.client.ServiceClient;
import com.fr.general.data.TableDataException;
 
public class MobileWsdlTableDataDemo1 extends AbstractTableData{
private String[][] data;  
    
    public MobileWsdlTableDataDemo1() {  
        this.data = this.getData();  
    }
    
    public int getColumnCount() throws TableDataException {  
        return data[0].length;  
    }  
  
    //获取列的名称为数组中第一行的值  
    public String getColumnName(int columnIndex) throws TableDataException {  
        return data[0][columnIndex];  
    }  
  
    //获取行数为数据的长度-1  
    public int getRowCount() throws TableDataException {  
        return data.length - 1;  
    }  
  
    //获取值  
    public Object getValueAt(int rowIndex, int columnIndex) {  
        return data[rowIndex + 1][columnIndex];  
    }  
  
    public static String[][] getResults(OMElement element) {
        if (element == null) {
            return null;
        }
        Iterator iterator = element.getChildElements();
        Iterator innerItr;
        List<String> list = new ArrayList<String>();
        OMElement result = null;
        while (iterator.hasNext()) {
            result = (OMElement) iterator.next();
            innerItr = result.getChildElements();
            while (innerItr.hasNext()) {
            	OMElement elem = (OMElement)innerItr.next();  
       list.add(elem.getText());
            }
        }
        String[] result1 = list.toArray(new String[list.size()]);
        String results[][] = new String[result1.length][3];
String b1, b2, b3;
for (int i = 0; i < result1.length; i++) {
if (result1[i].length() != 0) {
b1 = result1[i].substring(0, result1[i].indexOf(" "));
b2 = result1[i].substring(result1[i].indexOf(" ") + 1).substring(0,result1[i].substring(result1[i].indexOf(" ") + 1).indexOf(" "));
b3 = result1[i].substring(result1[i].indexOf(" ") + 1).substring(result1[i].substring(result1[i].indexOf(" ") + 1).indexOf(" ") + 1);
results[i][0] = b1;
results[i][1] = b2;
results[i][2] = b3;
}
}
        return results;
}
 
 
public String[][] getData() {
try {
String url = "http://www.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl";
      EndpointReference targetEPR = new EndpointReference(url);	      
      //创建一个OMFactory,下面的namespace、方法与参数均需由它创建  
      OMFactory fac = OMAbstractFactory.getOMFactory();
      // 命名空间
      OMNamespace omNs = fac.createOMNamespace("http://WebXml.com.cn", "a");
      //下面创建的是参数对数
     /*
      *OMElement symbol = fac.createOMElement("mobileCode", omNs);
      symbol.addChild(fac.createOMText(symbol, "18795842"));
      */
      //下面创建一个method对象  ,方法
      OMElement method = fac.createOMElement("getDatabaseInfo", omNs);
      // method.addChild(symbol);	      
      Options options = new Options();	      
      options.setTo(targetEPR);
      options.setAction("http://WebXml.com.cn/getDatabaseInfo");
      ServiceClient sender = new ServiceClient();
      sender.setOptions(options);    
      OMElement result1 = sender.sendReceive(method);
      String[][] result = getResults(result1);
      	 return result;
} catch (org.apache.axis2.AxisFault e) {
e.printStackTrace();
} catch (java.rmi.RemoteException e) {
e.printStackTrace();
}
return new String[][] { {} };
}
 
    }

 

将编译好的class文件拷贝到%FR_HOME%/WebReport/WEB-INF/classes/com/fr/data文件夹下。

如果想要传参,在代码中传递的参数为手机号码,返回对应的省、市、运营商,完整代码如下:

package com.fr.data;  
  
import java.util.ArrayList;  
import java.util.Iterator;  
import java.util.List;  
 
import org.apache.axiom.om.OMAbstractFactory;  
import org.apache.axiom.om.OMElement;  
import org.apache.axiom.om.OMFactory;  
import org.apache.axiom.om.OMNamespace;  
import org.apache.axis2.addressing.EndpointReference;  
import org.apache.axis2.client.Options;  
import org.apache.axis2.client.ServiceClient;  
 
import com.fr.base.FRContext;
import com.fr.general.data.TableDataException;  
import com.fr.general.FRLogger;
  
public class MobileWsdlTableDataDemoPara extends AbstractTableData{  
    private String[][] data;    
      
    public MobileWsdlTableDataDemoPara() {    
        this.data = this.getData();    
    }  
      
    public int getColumnCount() throws TableDataException {    
        return data[0].length;    
    }    
    
    //获取列的名称为数组中第一行的值    
    public String getColumnName(int columnIndex) throws TableDataException {    
        return data[0][columnIndex];    
    }    
    
    //获取行数为数据的长度-1    
    public int getRowCount() throws TableDataException {    
        return data.length - 1;    
    }    
    
    //获取值    
    public Object getValueAt(int rowIndex, int columnIndex) {    
        return data[rowIndex + 1][columnIndex];    
    }    
    
    public static String[][] getResults(OMElement element) {  
        if (element == null) {  
            return null;  
        }  
        Iterator iterator = element.getChildElements();  
        //Iterator innerItr;  
        List<String> list = new ArrayList<String>();  
        OMElement result = null;  
        while (iterator.hasNext()) {  
            result = (OMElement) iterator.next();
            list.add(result.getText());
        }  
        String[] result1 = (String[]) list.toArray(new String[list.size()]);  
        String results[][] = new String[result1.length][3];  
        String b1, b2, b3;  
        for (int i = 0; i < result1.length; i++) {  
            if (result1[i].length() != 0) {  
                b1 = result1[i].substring(0, result1[i].indexOf(" "));  
                b2 = result1[i].substring(result1[i].indexOf(" ") + 1).substring(0,result1[i].substring(result1[i].indexOf(" ") + 1).indexOf(" "));  
                b3 = result1[i].substring(result1[i].indexOf(" ") + 1).substring(result1[i].substring(result1[i].indexOf(" ") + 1).indexOf(" ") + 1);  
                results[i][0] = b1;  
                results[i][1] = b2;  
                results[i][2] = b3;  
            }  
        }  
        return results;  
}  
  
   
    public String[][] getData() {  
        try {  
        	FRLogger.getLogger().error("进入了");
        	String url = "http://www.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl";  
            EndpointReference targetEPR = new EndpointReference(url);             
            //创建一个OMFactory,下面的namespace、方法与参数均需由它创建    
            OMFactory fac = OMAbstractFactory.getOMFactory();  
            // 命名空间  
            OMNamespace omNs = fac.createOMNamespace("http://WebXml.com.cn/", "a"); 
            //下面创建的是参数对数  
             
            OMElement symbol = fac.createOMElement("mobileCode", omNs);
            symbol.addChild(fac.createOMText(symbol, "18651038607"));
            
            OMElement symbol2 = fac.createOMElement("userID", omNs);
            symbol2.addChild(fac.createOMText(symbol2, ""));  
            
            
             
            //下面创建一个method对象  ,方法  
            OMElement method = fac.createOMElement("getMobileCodeInfo", omNs);  
            method.addChild(symbol);  
            method.addChild(symbol2);
            Options options = new Options();              
            options.setTo(targetEPR);  
            options.setAction("http://WebXml.com.cn/getMobileCodeInfo");  
            ServiceClient sender = new ServiceClient();  
            sender.setOptions(options);      
            OMElement result1 = sender.sendReceive(method);
            String[][] result = getResults(result1);
           return result;  
        } catch (org.apache.axis2.AxisFault e) {  
            e.printStackTrace();  
        } catch (java.rmi.RemoteException e) {  
            e.printStackTrace();  
        }  
        return new String[][]{{}};  
    }
    
    public static void main(String[] args) {
    	MobileWsdlTableDataDemoPara ss = new MobileWsdlTableDataDemoPara();
    
    	//ss.getData();
    }
   
}  

 

  • 设计器中调用程序数据集

新建报表,定义数据集,选择程序数据集,选择定义好的程序数据集WebServiceWsdlTableDataDemo1.class,点击预览,效果如下:


带参的程序数据集MobileWsdlTableDataDemoPara,点击预览,效果如下:



 

在设计器中调用程序数据集,同样要将上述导入到eclipse中的jar包拷贝到%FR_HOME\WebReport\WEB-INF\lib目录下,否则预览是没有数据的。

通过axis2生成客户端调用

Axis2提供了一个wsdl2java.bat命令可以根据WSDL文件自动产生调用WebService的代码。

  • wsdl2java.bat生成代码
wsdl2java -uri http://www.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl -p mobile -o mobile

 

如下图:


uri:wsdl文件地址,可以是本地路径,也可以是网络路径;

-p:指定了生成的Java类的包名;

-o:指定了生成的一系列文件保存的根目录。

wsdl2java.bat插件还有很多参数,这里不一一详述了。

命令语句执行完成之后,在参数-o指定的文件目录里面就能看到生成的WebService代码了,这里指定的目录为当前目录下面的mobile文件夹(如果没有改文件夹,会自动新建),如下图:


  • 通过生成的WebService代码取数

将上一步骤生成的WebService代码即2个java文件所在的包一起拷到该工程的src目录中,如下图:


但是生成的MobileCodeWSStub会有一些报错需要修改一下,具体三种修改方式如下:

修改前:


修改后:


修改前:


修改后:


修改前:


修改后:


这样就可以直接使用工程中的MobileCodeWSStub类,从wsdl取数,并转换为二维数组,代码如下:

try {
      String url = "http://www.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl";
      MobileCodeWSStub stub = new MobileCodeWSStub(url);
//	      MobileCodeWSStub.GetMobileCodeInfo aa = new MobileCodeWSStub.GetMobileCodeInfo();
      MobileCodeWSStub.GetDatabaseInfo bb = new MobileCodeWSStub.GetDatabaseInfo();
//	      aa.setMobileCode("18795842832");
//	      String rs=stub.getMobileCodeInfo(aa).getGetMobileCodeInfoResult();
     String[] p=stub.getDatabaseInfo(bb).getGetDatabaseInfoResult().getString();
     String result[][] = new String[p.length][3];
     String b1,b2,b3;
     for(int i = 0;i<p.length;i++)
     {	       
    	 if(p[i].length()!=0)
    	 {
       b1 = p[i].substring(0, p[i].indexOf(" "));
       b2 = p[i].substring(p[i].indexOf(" ")+1).substring(0,p[i].substring(p[i].indexOf(" ")+1).indexOf(" "));
       b3 = p[i].substring(p[i].indexOf(" ")+1).substring(p[i].substring(p[i].indexOf(" ")+1).indexOf(" ")+1);
       result[i][0] = b1;
       result[i][1] = b2;
       result[i][2] = b3;
}
   }
     return result;
} catch (org.apache.axis2.AxisFault e) {
e.printStackTrace();
} catch (java.rmi.RemoteException e) {
e.printStackTrace();
}
return new String[][] { {} };
}

 

  • 获取数据转换为程序数据集

定义WebServiceWsdlTableDataDemo2.java类,扩展AbstractTableData,将获得的数组数据转为程序数据集。完整代码如下:

package com.fr.data;  
  
import java.util.logging.Logger;  
  
import mobile.MobileCodeWSStub;  
import org.apache.axis2.AxisFault;  
import org.apache.axis2.addressing.EndpointReference;  
import org.apache.axis2.client.Options;  
import org.apache.axis2.rpc.client.RPCServiceClient;  
  
import com.fr.data.AbstractTableData;  
import com.fr.general.data.TableDataException;  
import com.fr.third.javax.xml.namespace.QName;  
  
public class WebServiceWsdlTableDataDemo2 extends AbstractTableData{  
    /** 
     *  
     */  
    private static final long serialVersionUID = 1L;  
    private String[][] data;    
      
    public WebServiceWsdlTableDataDemo2() {    
        this.data = this.getData();    
    }  
      
    public int getColumnCount() throws TableDataException {    
        return data[0].length;    
    }    
    
    //获取列的名称为数组中第一行的值    
    public String getColumnName(int columnIndex) throws TableDataException {    
        return data[0][columnIndex];    
    }    
    
    //获取行数为数据的长度-1    
    public int getRowCount() throws TableDataException {    
        return data.length - 1;    
    }    
    
    //获取值    
    public Object getValueAt(int rowIndex, int columnIndex) {    
        return data[rowIndex + 1][columnIndex];    
    }    
    
    public String[][] getData() {  
         try {  
              String url = "http://www.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl";  
              MobileCodeWSStub stub = new MobileCodeWSStub(url);  
//            MobileCodeWSStub.GetMobileCodeInfo aa = new MobileCodeWSStub.GetMobileCodeInfo();  
              MobileCodeWSStub.GetDatabaseInfo bb = new MobileCodeWSStub.GetDatabaseInfo();  
//            aa.setMobileCode("18795842832");  
//            String rs=stub.getMobileCodeInfo(aa).getGetMobileCodeInfoResult();  
             String[] p=stub.getDatabaseInfo(bb).getGetDatabaseInfoResult().getString();  
             String result[][] = new String[p.length][3];  
             String b1,b2,b3;  
             for(int i = 0;i<p.length;i++)  
             {               
                 if(p[i].length()!=0)  
                 {  
               b1 = p[i].substring(0, p[i].indexOf(" "));  
               b2 = p[i].substring(p[i].indexOf(" ")+1).substring(0,p[i].substring(p[i].indexOf(" ")+1).indexOf(" "));  
               b3 = p[i].substring(p[i].indexOf(" ")+1).substring(p[i].substring(p[i].indexOf(" ")+1).indexOf(" ")+1);  
               result[i][0] = b1;  
               result[i][1] = b2;  
               result[i][2] = b3;  
            }             
           }  
             return result;  
        } catch (org.apache.axis2.AxisFault e) {  
            e.printStackTrace();  
        } catch (java.rmi.RemoteException e) {  
            e.printStackTrace();  
        }  
        return new String[][] { {} };  
    }  
    public static void main(String[] args) {  
        for(int i=0; i<new WebServiceWsdlTableDataDemo2().getData().length; i++) {  
            System.out.println(new WebServiceWsdlTableDataDemo2().getData()[i]);  
        }  
    }  
    }  

 

将编译好的WebServiceWsdlTableDataDemo2.class文件,拷贝到%FR_HOME%/WebReport/WEB-INF/classes/com/fr/data文件夹下
将编译好的mobile文件夹,拷贝到%FR_HOME%/WebReport/WEB-INF/classes/文件夹下

 

  • 设计器中调用程序数据集

新建报表,定义数据集,选择程序数据集,选择定义好的程序数据集WebServiceWsdlTableDataDemo2.class,点击预览,效果如下:


在设计器中调用程序数据集,同样要将上述导入到eclipse中的jar包拷贝到%FR_HOME\WebReport\WEB-INF\lib目录下,否则预览是没有数据的。

 

  • 大小: 110 KB
  • 大小: 23.1 KB
  • 大小: 10.3 KB
  • 大小: 14 KB
  • 大小: 67.3 KB
  • 大小: 17.1 KB
  • 大小: 108.3 KB
  • 大小: 109.8 KB
  • 大小: 132.6 KB
  • 大小: 125.3 KB
  • 大小: 149 KB
  • 大小: 136.5 KB
  • 大小: 14.3 KB
0
0
分享到:
评论

相关推荐

    webservice soap wsdl

    "webservice soap wsdl" Web Service 是一种网络接口,为应用程序提供了交互和分布式处理的效果,与平台、开发语言无关。Web Service 的核心是 WSDL(Web Services Description Language),它是一种用于描述 Web ...

    C#_.NET_动态调用webservice的三种方式

    从目标URL下载WSDL数据是动态调用WebService的第一步。在.NET Framework中,我们可以使用System.Web.Services.Description命名空间中的ServiceDescription类来下载WSDL数据。 第二步:创建和格式化WSDL文档文件 ...

    MobileWebService.wsdl文件

    对于"MobileWebService.wsdl",开发者可以利用工具(如Apache CXF、Microsoft .NET的wsdl.exe或wsimport命令)生成Java或.NET代码,然后在自己的应用程序中使用这些代理类来查询手机号码。 值得注意的是,描述中...

    WebService动态调用

    【WebService动态调用】是IT领域中一种常见的技术实践,主要涉及如何在不同的应用程序之间实现数据交换和功能共享。在Web服务的世界里,WebService是一种基于XML的开放式标准,允许不同平台、不同编程语言的应用程序...

    一个简单的WEBSERVICE 例子

    WebService 是一种支持通过网络进行调用的服务形式,它允许不同平台、不同编程语言的应用程序之间进行数据交换和通信。WebService 的主要优势在于它的平台无关性和语言无关性,这意味着可以在任何操作系统上运行,...

    webservice

    从更深层次来看,WebService是基于一系列开放标准(如XML、SOAP、WSDL等)构建的分布式应用程序,能够实现跨平台、跨语言的互操作性。这意味着开发者可以用任何喜欢的语言,在任何平台上编写WebService,并且这些...

    WebService压缩方法整合

    1. **WebService基本概念**:WebService是一种基于开放标准(如XML、WSDL和SOAP)的Web应用程序,允许不同系统之间的数据交换。它通过HTTP协议进行通信,使得分布式计算变得简单且可互操作。 2. **数据压缩**:在...

    C#.NET_动态调用webservice的三种方式

    为了能够将`ServiceDescriptionImporter`生成的代码编译成动态程序集,我们需要先创建一个`CodeCompileUnit`对象: ```csharp CodeCompileUnit compileUnit = new CodeCompileUnit(); ``` **步骤2:**使用...

    MyEclipse开发WebService实例详解

    在IT行业中,开发Web服务是常见的任务之一,用于构建分布式系统和实现跨平台的数据交换。MyEclipse作为一款强大的Java集成开发环境,提供了便捷的工具支持来创建、调试和部署Web服务。本篇文章将深入探讨如何使用...

    调用webservice,通过post传参读取返回的XML

    通过整合这些元素,我们可以构建一个Web应用程序,该应用程序能够通过POST方式调用WebService,传递参数,并解析返回的XML数据,以便在页面上展示。这涉及到了客户端与服务器端的交互,XML数据的处理以及ASP.NET Web...

    PB12.5+webservice实例

    在与Web服务结合时,数据窗口可以用于展示Web服务返回的数据集。可以通过创建一个基于Web服务的DataWindow,配置其SQL源为Web服务调用,从而实现数据的动态加载和显示。 五、实例详解 在提供的"PB12.5+webservice...

    调用WebService与后台数据交互示例

    在IT行业中,Web服务是应用程序之间进行通信的一种标准方法,特别是通过互联网进行数据交换。WebService是一种基于XML(Extensible Markup Language)的协议,允许不同系统之间的数据共享,无论它们使用何种编程语言...

    Java 调用 webservice

    Axis1.4支持SOAP 1.1协议,并且能够处理WSDL(Web服务描述语言)文档,使得Java应用程序能够方便地调用WebService。 要使用Axis1.4在Java中调用WebService,你需要遵循以下步骤: 1. **导入依赖**:首先,将Axis...

    C#动态调用WebService服务

    WebService是一种基于开放标准(如SOAP、WSDL和UDDI)的,可以在不同操作系统和编程语言之间交换数据的网络服务。它的接口通常以WSDL(Web Services Description Language)文件的形式定义,允许客户端和服务端通过...

    WebService一——使用JDK开发WebService

    WebService是一种基于XML(Extensible Markup Language)的网络服务标准,它允许不同系统间的应用程序进行交互,不受操作系统、编程语言的限制。本篇文章将探讨如何使用Java Development Kit(JDK)来开发一个基本的...

    WebService在·NET中的实战应用三

    数据集在跨应用程序边界传递时,通常需要序列化为XML,而"Surrogate"可能是指数据集的代理类,用于优化序列化过程。 5. **WebService异步示意图.jpg** - 图片可能展示了WebService的异步调用机制。在.NET中,可以...

    webservice的完整例子

    Web服务(WebService)是一种基于互联网的、平台独立的交互方式,允许不同的应用程序之间进行通信和数据交换。在本示例中,我们关注的是Axis框架下的Web服务实现,它是一个流行的开源工具,用于创建和部署Web服务。...

    C# webservice实例与在IIS上的部署

    **C# Webservice实例与在IIS上的部署** 在IT领域,C# Webservice是一种基于.NET框架...无论是Web应用还是Winform应用,都能通过调用这个Webservice获取并处理从数据库返回的数据集。这为跨平台的系统集成提供了便利。

    PDA 实现GPRS(WEBSERVICE)

    PDA应用程序需要解析WSDL文件以确定如何与Web Service交互。 7. **HTTPS安全通信**:在涉及到敏感数据交换时,PDA应用程序可能会使用HTTPS(HTTP over SSL/TLS)确保数据传输的安全性。 8. **异常处理和错误恢复**...

    WebService/多数据库连接

    WebService是一种基于开放标准(如XML、SOAP、WSDL和UDDI)的分布式应用程序交互模型。它允许不同的系统通过网络进行通信,无论它们是用何种编程语言或运行在哪个操作系统上。在本项目中,WebService作为接口,可以...

Global site tag (gtag.js) - Google Analytics