• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

DELPHI+JAVA之间使用WebService

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
  对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;

    ----------------


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
matlab 播放window摄像头。发布时间:2022-07-18
下一篇:
MATLAB实现闭环传递函数与状态空间之间的相互转换发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap