| 订阅 | 在线投稿
分享
 
 
 

讲解ASE12.5.1以后提供的WebService功能

来源:互联网网民  宽屏版  评论
2008-06-06 05:59:58

ASE自从12.5.1以后提供了WebService的功能。ASE提供的WebService

功能总结下来包括三个部分:

•ASE提供WebService的服务端,供其它WebService客户端调用。这也叫做ASE WebService生产者。ASE WebService生产者提供了三个方法,供客户端调用,将SQL或者存储过程执行结果以SOAP格式返回给调用者。

•ASE WebService组件也可以作为WebService的客户端,调用其他WebService的服务。这也叫做ASE WebService消费者。

•用户也可以在ASE WebService服务器上自定义自己的WebService服务,供其他客户端掉用。用户自定义WebService服务可以执行一段SQL语句并返回执行结果。

本文以ASE15.0.2为例介绍一下如何配置ASE WebService生产者供其它客户端调用。

安装ASE WebService组件

在安装ASE服务器时,需要安装ASE WebService组件。这一组件是ASE的一个Feature,需要有ASE WebService的License才能使用这一功能。

安装过程如果选择ASE WebService组件,则安装时就可以配置ASE WebService服务器。配置过程也可以放到安装结束以后通过Sybase Central单独配置。

ASE WebService组件的配置

ASE WebService组件的配置包括三部分内容:生产者配置、SSL配置、消费者配置。

配置过程非常的简单,如果是通过Sybase Central配置,只需根据提示进行配置即可。如果想通过WebService来执行SQL语句或者ASE中的存储过程,只需要配置生产者即可,SSL与消费者的配置可跳过。此时只需要指定WebService服务器供客户端掉用的端口号。默认端口号是8181。

激活ASE WebService功能

配置完成后,首先使用sa登录到ASE数据库:

Isql –U sa –P –SDBNAME

执行如下语句激活WebService功能:

Sp_configure “enable webservices”,1

Go

如果没有webservice 功能的license,将不能激活该功能。

ASE WebService服务器的启动

使用命令行方式进入到C:\Sybase\WS-15_0\bin下(c:\sybase是ASE的安装目录)执行:

runws -U sa -P nopasswordspecified -S DBNAME

注意,此处如果sa口令为空,-P 后的参数一定要为nopasswordspecified 。-S 后面跟的是ASE服务器的名字,一定要与c:\sybase\ini\sql.ini里配置的服务名称相符。

如果一切正常,那么ASE WebService将为启动,端口号8181。此时如果在IE浏览器里输入:http://localhost:8181/services/ase?wsdl,将会出现ase服务的WSDL文件。ase服务提供了三个方法:

•Login:建立一个持久的数据库连接。但这个不是必需的,如果直接调用execute方法,系统会使用execute方法提供的用户名与口令建立一个临时的数据库连接。

•Logout:断开由Login建立的持久连接

•Execute:执行SQL或者存储过程。关于该方法的参数请参考Sybase官方文档。

Runws还有其他参数,详细请参考sybase官方文档。

停止ASE WebService的命令如下:

stopws -U sa -P nopasswordspecified -S DBNAME

测试:

有了WSDL,想必大家都应该知道下一步如何做了。只需要使用工具将WSDL编译成后面我们需要的客户端stub文件即可。

如果你需要立即测试ASE WebService配置是否正确,ASE提供了一个测试用的客户端。在命令行下进入到C:\Sybase\WS-15_0\samples\apacheclient,执行:

runexecute "http://localhost:8181/services/ase" DBNAME sa "" "columnstyle=attribute,tablename=ws" all 1 "select @@version"

这个测试脚本通过java调用ASE WebService发布的ase服务的execute方法,用以执行SQL: select @@version。如果一切正常,你将会看到你非常熟悉的xml输出。

Runexecute的语法如下:

runexecute “web_service_URL” aseServerName user_ID password “SQLX_option” output_class count “sql_statement”

参数如下:

• web_service_URL

正在使用的Web 服务的位置。

• aseServerName

SOAP string,表示interfaces 文件或LDAP 服务器中Adaptive ServerEnterprise 服务器的名称。

• user_ID

登录到Adaptive Server Enterprise 所需的用户ID。

• password

登录到Adaptive Server Enterprise 所需的口令。

• SQLX_option

表示一个或多个option 参数的字符串。这些参数用于指定SQLX 结果集的特性。以下是有效的选项参数:

• binary={hex | base64}

• columnstyle={element | attribute}

• format={yes | no}

• header={yes | no}

• nullstyle={attribute | omit}

• prefix=“value”

• root={yes | no}

• rowname=“value”

• schemaloc=“value”

• statement={yes | no}

• tablename=“value”

• targetns=“value”

• output_class

所需的输出类型。以下是此参数的有效值:

• schema — 返回

XML 模式。

• dtd — 返回

XML DTD。

• data — 返回结果集。

• all — 返回模式、DTD 和数据。

• count

执行此语句的次数。如果count 的值大于

1,则会创建一个会话并使用持久连接。

• sql_statement

要在Adaptive Server Enterprise 上执行的语句。该语句必须用双引号分隔。

你可以试着改变一下runexecute的参数看一下输出的变化:

runexecute "http://localhost:8181/services/ase" DBNAME sa "" "columnstyle=attrib ute,tablename=ws" all 1 "select @@version"

当然,你也可以改变执行的SQL语句,看看执行结果输出。

Runexecute调用的java类的源代码请参考本文的最后一部分。这个源代码可以作为一个示例程序,供参考。

其他的配置工作

对于将ASE作为其他WebService的客户端的配置(使用sp_webservices),以及如何配置自定义的WebService服务(使用create service,drop service命令),ASE都提供了相应的命令,也非常的简单易用,另外还有SSL的配置。大家不妨参考Sybase文档逐一验证。

客户端参考代码

import com.sybase.apachetest.*;

import javax.xml.rpc.Stub;

import java.net.URL;

import java.security.Security;

public class ASEExecute

{

public static void main(String[] args)

{

try

{

if (args.length <

{

System.out.println ("Gotta have 8 args only got: " + args.length + "\n";

System.out.println ("Argument 1: Endpoint for SOAP ";

System.out.println ("Argument 2: ASE Service Name ";

System.out.println ("Argument 3: ASE Username to login as ";

System.out.println ("Arugment 4: ASE Password to use in login ";

System.out.println ("Argument 5: SQL X Options ";

System.out.println ("Argument 6: Dataoutput (one of all, schema, dtd or data or count)";

System.out.println ("Arugment 7: Number of times to execute (in session) ";

System.out.println ("Arugment 8: SQL to execute ";

System.exit (1);

}

String endpoint = args[0];

System.setProperty ("java.protocol.handler.pkgs", "com.sun.net.ssl.internal.www.protocol";

Security.addProvider (new com.sun.net.ssl.internal.ssl.Provider());

URL endURL = new URL (endpoint);

String serverName = args[1];

String userName = args[2];

String password = args [3];

if (password.compareTo("nopasswordspecified") == 0)

{

System.out.println ("Replacing password with null token.");

password = "";

}

String sqlxOptions = args[4];

String dataOutput = args[5];

String numExecutionStr = args[6];

int numExecution = 1;

try

{

Integer tmp = new Integer (numExecutionStr);

numExecution = tmp.intValue ();

}

catch (NumberFormatException err)

{

System.out.println ("Could not convert " + numExecutionStr + " to a number.");

System.out.println ("Assuming 1 execution.");

numExecution = 1;

}

String sql = args[7];

System.out.println ("SOAP Endpoint: " + endpoint);

System.out.println ("ASE Service Name: " + serverName);

System.out.println ("ASE Username: " + userName);

System.out.println ("ASE Password: ********** " );

System.out.println ("SQL X options: " + sqlxOptions);

System.out.println ("Data Output: " + dataOutput);

System.out.println ("Number of executions: " + numExecution);

System.out.println ("Sql Select to execute: " + sql);

ExecuteStoredProcServiceLocator service = new ExecuteStoredProcServiceLocator ();

if (numExecution != 1)

{

service.setMaintainSession (true);

}

ExecuteStoredProc port = service.getase(endURL);

for (int ii = 0; ii < numExecution; ii++)

{

DataReturn[] data = port.execute (serverName,

userName,

password,

sqlxOptions,

sql);

if (data != null)

{

for (int jj = 0; jj < data.length; jj++)

{

System.out.println ("rinting result set #" + jj );

if (dataOutput.compareTo ("all") == 0

|| dataOutput.compareTo ("dtd") == 0)

{

System.out.println ("data.getDTD is: \n" + data[jj].getDTD ());

}

if (dataOutput.compareTo ("all") == 0

|| dataOutput.compareTo ("data") == 0)

{

System.out.println ("data.getXML is: \n" + data[jj].getXML ());

}

if (dataOutput.compareTo ("all") == 0

|| dataOutput.compareTo ("schema") == 0)

{

System.out.println ("data.getSchema is: \n" + data[jj].getSchema ());

}

System.out.println ("data.updateCount is: " + data[jj].getUpdateCount ());

}

}

}

}

catch (Exception ex)

{

ex.printStackTrace();

}

}

}

 
特别声明:以上内容(如有图片或视频亦包括在内)为网络用户发布,本站仅提供信息存储服务。
 
ASE自从12.5.1以后提供了WebService的功能。ASE提供的WebService 功能总结下来包括三个部分: •ASE提供WebService的服务端,供其它WebService客户端调用。这也叫做ASE WebService生产者。ASE WebService生产者提供了三个方法,供客户端调用,将SQL或者存储过程执行结果以SOAP格式返回给调用者。 •ASE WebService组件也可以作为WebService的客户端,调用其他WebService的服务。这也叫做ASE WebService消费者。 •用户也可以在ASE WebService服务器上自定义自己的WebService服务,供其他客户端掉用。用户自定义WebService服务可以执行一段SQL语句并返回执行结果。 本文以ASE15.0.2为例介绍一下如何配置ASE WebService生产者供其它客户端调用。 安装ASE WebService组件 在安装ASE服务器时,需要安装ASE WebService组件。这一组件是ASE的一个Feature,需要有ASE WebService的License才能使用这一功能。 安装过程如果选择ASE WebService组件,则安装时就可以配置ASE WebService服务器。配置过程也可以放到安装结束以后通过Sybase Central单独配置。 ASE WebService组件的配置 ASE WebService组件的配置包括三部分内容:生产者配置、SSL配置、消费者配置。 配置过程非常的简单,如果是通过Sybase Central配置,只需根据提示进行配置即可。如果想通过WebService来执行SQL语句或者ASE中的存储过程,只需要配置生产者即可,SSL与消费者的配置可跳过。此时只需要指定WebService服务器供客户端掉用的端口号。默认端口号是8181。 激活ASE WebService功能 配置完成后,首先使用sa登录到ASE数据库: Isql –U sa –P –SDBNAME 执行如下语句激活WebService功能: Sp_configure “enable webservices”,1 Go 如果没有webservice 功能的license,将不能激活该功能。 ASE WebService服务器的启动 使用命令行方式进入到C:\Sybase\WS-15_0\bin下(c:\sybase是ASE的安装目录)执行: runws -U sa -P nopasswordspecified -S DBNAME 注意,此处如果sa口令为空,-P 后的参数一定要为nopasswordspecified 。-S 后面跟的是ASE服务器的名字,一定要与c:\sybase\ini\sql.ini里配置的服务名称相符。 如果一切正常,那么ASE WebService将为启动,端口号8181。此时如果在IE浏览器里输入:http://localhost:8181/services/ase?wsdl,将会出现ase服务的WSDL文件。ase服务提供了三个方法: •Login:建立一个持久的数据库连接。但这个不是必需的,如果直接调用execute方法,系统会使用execute方法提供的用户名与口令建立一个临时的数据库连接。 •Logout:断开由Login建立的持久连接 •Execute:执行SQL或者存储过程。关于该方法的参数请参考Sybase官方文档。 Runws还有其他参数,详细请参考sybase官方文档。 停止ASE WebService的命令如下: stopws -U sa -P nopasswordspecified -S DBNAME 测试: 有了WSDL,想必大家都应该知道下一步如何做了。只需要使用工具将WSDL编译成后面我们需要的客户端stub文件即可。 如果你需要立即测试ASE WebService配置是否正确,ASE提供了一个测试用的客户端。在命令行下进入到C:\Sybase\WS-15_0\samples\apacheclient,执行: runexecute "http://localhost:8181/services/ase" DBNAME sa "" "columnstyle=attribute,tablename=ws" all 1 "select @@version" 这个测试脚本通过java调用ASE WebService发布的ase服务的execute方法,用以执行SQL: select @@version。如果一切正常,你将会看到你非常熟悉的xml输出。 Runexecute的语法如下: runexecute “web_service_URL” aseServerName user_ID password “SQLX_option” output_class count “sql_statement” 参数如下: • web_service_URL 正在使用的Web 服务的位置。 • aseServerName SOAP string,表示interfaces 文件或LDAP 服务器中Adaptive ServerEnterprise 服务器的名称。 • user_ID 登录到Adaptive Server Enterprise 所需的用户ID。 • password 登录到Adaptive Server Enterprise 所需的口令。 • SQLX_option 表示一个或多个option 参数的字符串。这些参数用于指定SQLX 结果集的特性。以下是有效的选项参数: • binary={hex | base64} • columnstyle={element | attribute} • format={yes | no} • header={yes | no} • nullstyle={attribute | omit} • prefix=“value” • root={yes | no} • rowname=“value” • schemaloc=“value” • statement={yes | no} • tablename=“value” • targetns=“value” • output_class 所需的输出类型。以下是此参数的有效值: • schema — 返回 XML 模式。 • dtd — 返回 XML DTD。 • data — 返回结果集。 • all — 返回模式、DTD 和数据。 • count 执行此语句的次数。如果count 的值大于 1,则会创建一个会话并使用持久连接。 • sql_statement 要在Adaptive Server Enterprise 上执行的语句。该语句必须用双引号分隔。 你可以试着改变一下runexecute的参数看一下输出的变化: runexecute "http://localhost:8181/services/ase" DBNAME sa "" "columnstyle=attrib ute,tablename=ws" all 1 "select @@version" 当然,你也可以改变执行的SQL语句,看看执行结果输出。 Runexecute调用的java类的源代码请参考本文的最后一部分。这个源代码可以作为一个示例程序,供参考。 其他的配置工作 对于将ASE作为其他WebService的客户端的配置(使用sp_webservices),以及如何配置自定义的WebService服务(使用create service,drop service命令),ASE都提供了相应的命令,也非常的简单易用,另外还有SSL的配置。大家不妨参考Sybase文档逐一验证。 客户端参考代码 import com.sybase.apachetest.*; import javax.xml.rpc.Stub; import java.net.URL; import java.security.Security; public class ASEExecute { public static void main(String[] args) { try { if (args.length < { System.out.println ("Gotta have 8 args only got: " + args.length + "\n"; System.out.println ("Argument 1: Endpoint for SOAP "; System.out.println ("Argument 2: ASE Service Name "; System.out.println ("Argument 3: ASE Username to login as "; System.out.println ("Arugment 4: ASE Password to use in login "; System.out.println ("Argument 5: SQL X Options "; System.out.println ("Argument 6: Dataoutput (one of all, schema, dtd or data or count)"; System.out.println ("Arugment 7: Number of times to execute (in session) "; System.out.println ("Arugment 8: SQL to execute "; System.exit (1); } String endpoint = args[0]; System.setProperty ("java.protocol.handler.pkgs", "com.sun.net.ssl.internal.www.protocol"; Security.addProvider (new com.sun.net.ssl.internal.ssl.Provider()); URL endURL = new URL (endpoint); String serverName = args[1]; String userName = args[2]; String password = args [3]; if (password.compareTo("nopasswordspecified") == 0) { System.out.println ("Replacing password with null token."); password = ""; } String sqlxOptions = args[4]; String dataOutput = args[5]; String numExecutionStr = args[6]; int numExecution = 1; try { Integer tmp = new Integer (numExecutionStr); numExecution = tmp.intValue (); } catch (NumberFormatException err) { System.out.println ("Could not convert " + numExecutionStr + " to a number."); System.out.println ("Assuming 1 execution."); numExecution = 1; } String sql = args[7]; System.out.println ("SOAP Endpoint: " + endpoint); System.out.println ("ASE Service Name: " + serverName); System.out.println ("ASE Username: " + userName); System.out.println ("ASE Password: ********** " ); System.out.println ("SQL X options: " + sqlxOptions); System.out.println ("Data Output: " + dataOutput); System.out.println ("Number of executions: " + numExecution); System.out.println ("Sql Select to execute: " + sql); ExecuteStoredProcServiceLocator service = new ExecuteStoredProcServiceLocator (); if (numExecution != 1) { service.setMaintainSession (true); } ExecuteStoredProc port = service.getase(endURL); for (int ii = 0; ii < numExecution; ii++) { DataReturn[] data = port.execute (serverName, userName, password, sqlxOptions, sql); if (data != null) { for (int jj = 0; jj < data.length; jj++) { System.out.println ("rinting result set #" + jj ); if (dataOutput.compareTo ("all") == 0 || dataOutput.compareTo ("dtd") == 0) { System.out.println ("data.getDTD is: \n" + data[jj].getDTD ()); } if (dataOutput.compareTo ("all") == 0 || dataOutput.compareTo ("data") == 0) { System.out.println ("data.getXML is: \n" + data[jj].getXML ()); } if (dataOutput.compareTo ("all") == 0 || dataOutput.compareTo ("schema") == 0) { System.out.println ("data.getSchema is: \n" + data[jj].getSchema ()); } System.out.println ("data.updateCount is: " + data[jj].getUpdateCount ()); } } } } catch (Exception ex) { ex.printStackTrace(); } } }
󰈣󰈤
 
 
 
>>返回首页<<
 
 热帖排行
 
 
 
静静地坐在废墟上,四周的荒凉一望无际,忽然觉得,凄凉也很美
©2005- 王朝网络 版权所有