加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

WebService 使用和调试小结

发布时间:2020-12-17 02:56:02 所属栏目:安全 来源:网络整理
导读:标题:WebService 使用和调试小结 作者:jrq 链接:http://blog.csdn.net/jrq/archive/2006/05/24/752174.aspx 内容: ??? 对WebService的使用和调试做一下记录。备忘。 ??? 因使用JB2005+AXIS 发布WebService,总有一些奇奇怪怪的问题,故使用JB9。 (一)

标题:WebService 使用和调试小结

作者:jrq

链接:http://blog.csdn.net/jrq/archive/2006/05/24/752174.aspx

内容:

??? 对WebService的使用和调试做一下记录。备忘。

??? 因使用JB2005+AXIS 发布WebService,总有一些奇奇怪怪的问题,故使用JB9。


(一)使用 JB9+AXIS 发布 WebService 服务

???
? 1.新建Project--Project,新建Web--Web Application;

? 2.新建Web Service--Web Services Configuration;

? 3.WebApp选择刚建立的Web Application的名字,其他默认;

? 4.建立WebService服务端的类(test.java)。

??? -----------------------------

??? public class test {
????? private static int a;
????? private static int b;

????? public test() {
????? }

????? public void setA(int x) {
??????? this.a=x;
????? }

????? public? void setB(int y) {
???????? this.b=y;
????? }

????? public int getSum() {
??????? int c=a+b;
??????? //System.out.println("a:"+a);
??????? //System.out.println("b:"+b);
??????? //System.out.println("c:"+c);
??????? return c;
????? }
??? }

??? -----------------------------

? 5.发布 WebService 服务

??? (1)右击要发布的类,选择“Export as a Web Service”;

??? (2)如果勾选了“Generate client stub”,则发布后同时生成客户端的类及接口测试类。可以不勾择此项;

??? (3)“Deploy scope”中可以选择该项为“Session”,其他默认;

??? (4)“Selection mode”中选择“Allow selected methods”,然后在“Methods in”中选中类要发布的接口方法。可多选。

??? (5)其他默认,点击“Finish”完成发布后,自动生成WSDL(Web Service Description Language)文件。

? 6.注意

??? 类的属性使用了private static修饰符。如“private static int a”。
?
??? 类的方法不能使用static修饰符,如“public int getSum()”,因为静态的类方法是不能发布为WebService接口的。

?

(二)使用 Delphi7 编写 WebService 的客户端

? 1.新建Project & Application;

? 2.New-Other-WebService-WSDL Importer,选择WebService服务的WSDL描述文件,也可选择WSDL文件的URL;

? 3.单击“Finish”按钮,生成WSDL文件对应*.pas单元文件;

??? 其内容大致如下:

??? ------------------------------------------------------
?test = interface(IInvokable)
????? ['{787CE852-EF00-40BA-5802-9BF9DFBF79F0}']
??????? procedure setA(const a: Integer); stdcall;
??????? procedure setB(const b: Integer); stdcall;
??????? function? getSum: Integer; stdcall;
????? end;

??? function Gettest(UseWSDL: Boolean=System.False; Addr: string=''; HTTPRIO: THTTPRIO = nil): test;


??? implementation

??? function Gettest(UseWSDL: Boolean; Addr: string; HTTPRIO: THTTPRIO): test;
??? const
????? defWSDL = 'http://127.0.0.1:8088/test/services/test?wsdl';
????? defURL? = 'http://127.0.0.1:8088/test/services/test';
????? defSvc? = 'testService';
????? defPrt? = 'test';
??? var
????? RIO: THTTPRIO;
??? begin
????? Result := nil;

????? if (Addr = '') then
????? begin
??????? if UseWSDL then
????????? Addr := defWSDL
??????? else
????????? Addr := defURL;
????? end;

????? if HTTPRIO = nil then
??????? RIO := THTTPRIO.Create(nil)
????? else
??????? RIO := HTTPRIO;

????? try
??????? Result := (RIO as test);
??????? if UseWSDL then
??????? begin
????????? RIO.WSDLLocation := Addr;
????????? RIO.Service := defSvc;
????????? RIO.Port := defPrt;
??????? end else
????????? RIO.URL := Addr;
????? finally
??????? if (Result = nil) and (HTTPRIO = nil) then
????????? RIO.Free;
????? end;
??? end;


??? initialization
????? InvRegistry.RegisterInterface(TypeInfo(test),'http://127.0.0.1:8088/test/services/test','UTF-8');
????? InvRegistry.RegisterDefaultSOAPAction(TypeInfo(test),'');

??? end.
?
??? ------------------------------------------------------
?

? 4.建议:保存由WSDL文件生成的*.pas单元文件时要重命名(webtest.pas),最好不使用默认名字;

? 5.Delphi7编写的WebService客户端调用代码:

??? -----------------------------
??? uses webtest;

??? var atest: test;? //test类
??????? sum:Integer;
??? begin
?????? atest:=Gettest(); //要uses wsdl对应*.pas单元文件。
?????? atest.setA(1);
?????? atest.setB(2);
?????? sum:=atest.getSum();
?????? ShowMessage(IntToStr(sum));
??? end;

??? -----------------------------

? 6.注意

?? 如果服务端类的属性没有加static描述,则Delphi7编写的客户端使用setA()、setB()后再getSum()时不能得到正确的结果。

?? 因为WebService是无连接的,每次使用类方法时均得到一个新的对象应用,setA()、setB()后再getSum()操作不是针对同一个对象的。

?? 但加上static后,所有的对象共同使用类的同一个值。如此即可。


?? 另外,如果在JB9+AXIS发布WebService时,“Deploy scope”中选择的是“Session”,而不是默认的“Request”,

?? 在服务端类的属性即使不使用static约束,在Delphi的客户端使用setA()、setB()后再getSum(),也是可以得到正确的返回值。

?? 神奇。^_^


? 7.建议

?? 本例只做测试和解决问题。如果要给WebService服务端传递数据,最好在接口方法中使用参数。

?? 如修改为getSum(int x,int y)后再发布接口,这个即可使用一个接口方法就可以完成操作,而不必先使用set方法传递参数数据。

?

?(三)使用JB9编写 WebService 的客户端

? 1.新建Project--Project;

? 2.新建Web Service--Import a Web Service;

? 3.在WSDL URL中选择wsdl文件的URL,也可选择WebService服务的WSDL描述文件;

? 4.因为是建立WebService的客户端,所以“Generate server-side classes”选择可以不勾选;

? 5.在“Package options”中可以修改“Name”为合适的名字;

? 6.其余选择默认值,单击“Finish”生成客户端的jajva类文件。一般是6个文件,有其自己的命名规则。可参看JB。

? 7.JB9编写的WebService客户端测试类

??? -----------------------------

??? public class client {

????? public client() {
????? }

????? public static void main(String[] args) {
??????? try {
????????? TestService service = new TestServiceLocator();
????????? Test aClient = service.gettest();
????????? aClient.setA(1);
????????? aClient.setB(2);
????????? int sum = aClient.getSum();
????????? System.out.println("Sum is:"+sum);
??????? }
??????? catch (Exception e) {
????????? System.err.println("Execution failed. Exception: " + e);
??????? }
????? }

??? -----------------------------

? 8.注意

??? 如果服务端类的属性没有加static描述,则JB编写的客户端使用setA()、setB()后再getSum()时亦不能得到正确的结果。

??? 建议使用带参数的接口方法来传递参数数据。避免使用set方法。


?(四)使用Delphi7调用C#编写的WebService服务

??? Delphi7编写的客户端调用C#编写的WebService服务时,如果函数中传递的参数为汉字时,可能出现乱码现象。

??? 在网上搜索了一些资料,找到解决办法:将HTTPRIO的UseUTF8InHeader属性改为true即可。

??? 即编辑由WSDL文件生成的*.pas单元文件,在Get函数中增加一句:RIO.HTTPWebNode.UseUTF8InHeader:=True。
???
??? 代码片断大致如下:

??? ------------------

????? try
??????? RIO.HTTPWebNode.UseUTF8InHeader:=True; //添加一句,修改编码方案。
??????? Result := (RIO as test);
??????? if UseWSDL then
??????? begin
????????? RIO.WSDLLocation := Addr;
????????? RIO.Service := defSvc;
????????? RIO.Port := defPrt;
??????? end else
????????? RIO.URL := Addr;
????? finally
??????? if (Result = nil) and (HTTPRIO = nil) then
????????? RIO.Free;
????? end;

??? ----------------


[--完--]

?????????????????????????????????????????????????????????????????????? ???????? ?????? ??by? jrq

??????????????????????????????????????????????????????????????????? ???????????? ?2006/05/24 凌晨 于穗

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读