问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何在Android使用Rest服务从客户端调用webservice

发布网友 发布时间:2022-04-12 22:29

我来回答

1个回答

热心网友 时间:2022-04-12 23:58

  企业提供特定的服务service,其他用户通过internet即web访问这些服务。换句话说,WebService是两个计算机之间通讯(交谈)的技术,网络中一台计算机想要调用另一台计算机的方法时,此时可以需要WebService。很火的SOA、云计算在技术层面上都是WebService

  用程序员的观点就是:企业提供实现某功能的函数,其他用过通过在线访问这些函数。

  webservice两个重要文件:.aar:服务包文件,提供服务,.wsdl:web服务接口定义语言文件,供客户端使用。

  webservice关键技术

  1、XML:可扩展的标记语言(XML)是Web service平台中表示数据的基本格式。除了易于建立和易于分析外,XML主要的优点在于它既是平台无关的,又是厂商无关的。

  2、SOAP:SOAP是web service的标准通信协议,SOAP为simple object access protocoll的缩写,简单对象访问协议.它是一种标准化的传输消息的XML消息格式。即XML文件的消息格式,由这个协议来决定。SOAP简单的理解,就是这样的一个开放协议SOAP=RPC+HTTP+XML:采用HTTP作为底层通讯协议;RPC作为一致性的调用途径,xml作为数据传送的格式。

  3、Axis2:Axis2是实现Web Service的一种技术框架,是新一代的SOAP引擎,即通过这个架构很方便地实现webservice.即在服务端通过这个技术支持,很方便地发布webservice服务,使开发只关注具体的商业实现,而由这个框架直接发布,节省了开发者的时间。在客户端同样只关注调用。为了使用这个框架,在3个地方需要部署Axis2的库:web服务器tomcat上、eclipse服务端开发axis2库、eclipse客户端开发ksoap2库。

  4、WSDL:WSDL的全称是web service Description Language,是一种基于XML格式的关于web服务的描述语言。其主要目的在于web service的提供者将自己的web服务的所有相关内容,如所提供的服务的传输方式,服务方法接口,接口参数,服务路径等,生成相应的完全文档,发布给使用者。使用者可以通过这个WSDL文档,创建相应的SOAP请求消息,通过HTTP传递给webservice提供者;web服务在完成服务请求后,将SOAP返回消息传回请求者,服务请求者再根据WSDL文档将SOAP返回消息解析成自己能够理解的内容。

  5、UDDI:UDDI 是一种目录服务,企业可以使用它对 Web services 进行注册和搜索。UDDI,英文为 "Universal Description, Discovery and Integration",可译为“通用描述、发现与集成服务”。UDDI是一种创建注册表服务的规范,以便大家将自己的web service进行注册发布供使用者查找.然而当服务提供者想将自己的web service向全世界公布,以便外部找到其服务时,那么服务提供者可以将自己的web service注册到相应的UDDI商用注册网站,目前全球有IBM等4家UDDI商用注册网站。因为WSDL文件中已经给定了web service的地址URI,外部可以直接通过WSDL提供的URI进行相应的web service调用。所以UDDI并不是一个必需的web service组件,服务方完全可以不进行UDDI的注册。

  webservice服务端的实现

  1、tomcat服务器部署:部署Axis2到tomcat:将Axis2.war解压到tomcat的webapps目录下即可,如果有数据库连接,需把数据库连接jar包添加到tomcat的lib目录下,如:oracle的ojdbc14.jar,和mysql的 mysql-connector-java-3.1.11-bin.jar。部署成功后,启动tomcat,可通过http://localhost:8080/axis2/访问,查看是否部署成功。webservice的axis服务存档aar发布文件就发布到tomcat\webapps\axis2\WEB-INF\services这个目录下

  2、安装axis2插件到eclipse:解压插件,直接拷贝到eclipse的插件目录plugins,两个插件为:org.apache.axis2.eclipse.codegen.plugin_1.6.0.jar、org.apache.axis2.eclipse.service.plugin_1.6.0.jar。打开Eclipse,选择File/New/Other菜单项,看到如下界面表明安装成功:

  安装这两个插件的目的是:方便生成Axis2的服务包(.aar文件)和生成Axis2客户端

  3、打包生成axis2服务包:

  选择服务程序类文件所在的目录,不包括包,选中Include..,表示在生成的服务包中只包括类文件,不包括其他文件。

  选择跳过WSDL文件,WSDL文件会在部署这个服务到Tomcat后,有Axis2自动生成,通过http://localhost:8080/axis2/services/newWs?wsdl可以查看文件内容。

  注意:WSDL是web服务定义语言,通过XML的方式对该服务类进行描述,客户端访问服务时要用到这个文件,可以生成这个文件给客户端,也可以上面的在线获取这个文件。

  点击“next”,进入添加服务需要的库文件界面:

  需要的库文件直接部署到tomcat中,此处不需要添加,进入下一界面:

  选择自动生成service.xml文件。点击进入下一界面:

  输入服务名和类名,点击load即可找出该服务程序的全部方法。

  输入发布路径,和文件名。生成newWs.aar服务包文件。

  部署完成后,输入http://localhost:8080/axis2/services/listServices,即可看到已部署的全部服务。

  eclipse中webservice不能发布的原因:

  1、界面问题,把发布界面最大化或拖拽,是界面刷新,就可以看到输入界面了。

  2、发布界面最后一步,load时,没有任何反映,是这个类的代码有问题,例如有加载动态库的代码,动态库找不到,则会没有反映。

  3、代码没改变的情况下好像只能生成一次,想在生成的话,需要改代码,或需要重启eclipse

  webservie服务端:java调用C++动态库的实现

  1、在eclipse中编写一个java类文件,应用中的其他类可以调用这个类中的函数:

  [cpp] view plaincopyprint?
  01.package util;
  02.
  03.public class InvokeDll
  04.{
  05. //测试函数
  06. public native int testFunc(int a, int b);
  07.
  08. //获取最近一次错误代码
  09. public native int lastErr();
  10.}
  package util;
  
  public class InvokeDll
  {
  //测试函数
  public native int testFunc(int a, int b);
  
  //获取最近一次错误代码
  public native int lastErr();
  }

  注意:函数要用native修饰符

  2、用javah命令生成C++可调用的.h文件

  a、上述java类编译生成类文件InvokeDll.class

  b、set classpath="D:\teatInvokeDll\bin",类文件生成在D:\testInvokeDll\bin\util\InvokeDll.class
  c、命令行进入D:\teatInvokeDll\bin

  d、javah util.InvokeDll
  你会发现当前目录下多了一个util_InvokeDll.h文件,文件内容如下:

  [cpp] view plaincopyprint?
  01./* DO NOT EDIT THIS FILE - it is machine generated */
  02.#include
  03./* Header for class util_InvokeDll */
  04.
  05.#ifndef _Included_util_InvokeDll
  06.#define _Included_util_InvokeDll
  07.#ifdef __cplusplus
  08.extern "C" {
  09.#endif
  10./*
  11. * Class: util_InvokeDll
  12. * Method: testFunc
  13. * Signature: (II)I
  14. */
  15.JNIEXPORT jint JNICALL Java_util_InvokeDll_testFunc
  16. (JNIEnv *, jobject, jint, jint);
  17.
  18./*
  19. * Class: util_InvokeDll
  20. * Method: lastErr
  21. * Signature: ()I
  22. */
  23.JNIEXPORT jint JNICALL Java_util_InvokeDll_lastErr
  24. (JNIEnv *, jobject);
  25.
  26.#ifdef __cplusplus
  27.}
  28.#endif
  29.#endif
  /* DO NOT EDIT THIS FILE - it is machine generated */
  #include
  /* Header for class util_InvokeDll */
  
  #ifndef _Included_util_InvokeDll
  #define _Included_util_InvokeDll
  #ifdef __cplusplus
  extern "C" {
  #endif
  /*
  * Class: util_InvokeDll
  * Method: testFunc
  * Signature: (II)I
  */
  JNIEXPORT jint JNICALL Java_util_InvokeDll_testFunc
  (JNIEnv *, jobject, jint, jint);
  
  /*
  * Class: util_InvokeDll
  * Method: lastErr
  * Signature: ()I
  */
  JNIEXPORT jint JNICALL Java_util_InvokeDll_lastErr
  (JNIEnv *, jobject);
  
  #ifdef __cplusplus
  }
  #endif
  #endif
  3、在VC中生成dll如java2dll.dll

  a、新建一个空的dll工程,名叫java2dll。

  b、把util_InvokeDll.h头文件复制到工程目录下,并添加到header files文件夹里。

  c、在source files文件目录中添加一个java2dll.cpp,文件内容是头文件里的方法的实现:

  [cpp] view plaincopyprint?
  01.#include
  02.#include "util_InvokeDll.h"
  03.
  04.JNIEXPORT jint JNICALL Java_util_InvokeDll_testFunc(JNIEnv *, jobject, jint a, jint b)
  05.{
  06. int i=0;
  07. /*HMODULE hMole = ::LoadLibrary("test.dll");
  08.
  09. PFUN newfun = (PFUN)::GetProcAddress(hMole,"testFn");
  10. i = newfun(a,b);
  11. ::FreeLibrary(hMole);
  12. */
  13. i=a+b;
  14. return i;
  15.}
  16.
  17.JNIEXPORT jint JNICALL Java_util_InvokeDll_lastErr(JNIEnv *, jobject)
  18.{
  19. int i=0;
  20. return i;
  21.}
  #include
  #include "util_InvokeDll.h"
  
  JNIEXPORT jint JNICALL Java_util_InvokeDll_testFunc(JNIEnv *, jobject, jint a, jint b)
  {
  int i=0;
  /*HMODULE hMole = ::LoadLibrary("test.dll");
  
  PFUN newfun = (PFUN)::GetProcAddress(hMole,"testFn");
  i = newfun(a,b);
  ::FreeLibrary(hMole);
  */
  i=a+b;
  return i;
  }
  
  JNIEXPORT jint JNICALL Java_util_InvokeDll_lastErr(JNIEnv *, jobject)
  {
  int i=0;
  return i;
  }d、点击“运行”->“编译”,这时你会看到很多数据类型没被声明的错误,那是因为util_InvokeDll.h使用了很多JAVA_HOME/include/jni.h文件自定义的数据类型,而jni.h又引
  用了JAVA_HOME/include/win32/jni_md.h,这时你需要把jni.h和jni_md.h引入到工程里面来,左击工程名“工程属性”->“文件/目录”->“包含文件目录”把JAVA_HOME/include和JAVA_HOME/include/win32文件夹添加,确定后,再次编译一切正常,这时在工程的目录下就找到java2dll.dll文件,这样dll文件就生成了
  4、调用其他标准的C++动态库,如test.dll

  例如test.dll,是其他人编写的标准的C++动态库,可以在上述注释掉的部分调用,testFn是它里面的函数。

  5、在webservice端的java调用

  加载库Java2dll,并调用接口函数:

  [cpp] view plaincopyprint?
  01.static
  02.{
  03. //动态库dll文件要放到系统目录或用绝对路径凋用System.load("绝对路径")
  04. System.loadLibrary("Java2dll");
  05.}
  06.
  07./实例化调用类
  08.InvokeDll dll = new InvokeDll();
  09.
  10.//调用函数
  11.String strRet = dll.testFunc(a, b)
  static
  {
  //动态库dll文件要放到系统目录或用绝对路径凋用System.load("绝对路径")
  System.loadLibrary("Java2dll");
  }
  
  //实例化调用类
  InvokeDll dll = new InvokeDll();
  
  //调用函数
  String strRet = dll.testFunc(a, b)
  

  总结:调用过程:java普通类-->java native类-->jni C++ 动态库-->标准C++动态库,最终实现java普通类对标准C++动态库的调用。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
创新5.10060声卡怎么关闭,为什么音质变得很差?我用的是KX 我已经装了声卡,和Kx管理器。可声音听见还是那么幼稚。怎么把声音调的... ...装不上KX3550,声卡是 创新5.1的 装完KX3550重启以后,提示 初始化... 我买了一个创新5.1 0060声卡,玩龙之谷游戏就声音不完全,只有背景音乐... 声卡5.10060KX驱动3550调试怎么弄 win11玩csgo游戏一直闪退什么原因 win11玩csgo游戏一直闪退的解决... 习惯养成心得体会 饥荒ios高脚鸟蛋怎么孵化高脚鸟怎么养 故事的力量可以从什么角度来分析? 地震前为什么要出现地震云 有宝妈知道杭州报销生育险需要提供什么资料 不是杭州人,在杭州工作,女工生育保险报销需要备哪些材料 万和电热水器显示屏一闪后就不显示是什么原因 四季沐歌电热水器通电之后不显示温度是什么原因? GM1S_D50L(wiFi)电热水器通电后显示屏不显示 电热水器不显示温度还响铃 电热水器温度不显示温度,而且乱跳 电热水器显示屏不显示什么原因? 为什么电热水器插着电但上边不显示水温? 快手直播下方的火焰标志为什么有的人有有的人没有呢 苏教版小学一年级语文下册课文识字5看图写画怎么写 苏教版 一年级下册语文期中试卷 淘宝上的家用脱毛仪效果怎么样?男的腿毛多可以用吗? 苏教版语文一年级下册,第3课小池塘 苏教版小学一年级下册语文蘑菇该奖给谁课堂实录 一年级下册语文苏教版期中试卷 一年级下册语文怎样总结复习苏教版2016 最新苏教版一年级语文下册全册试卷全套共22份(含答案) 苏教版小学一年级下册语文课文蘑菇该奖给谁练习题 Axis2的方式比较 杭州买的生育保险回家生拿到杭州报销的话都要什么证件 2017杭州生育保险 怎么在Word文档里把身份证恢复成原来大小 杭州生育险报销怎么算 保存PPT后 电脑卡住了不得不强制关闭了电脑电源 请问PPT还能打开吗 pro用ppt总会卡死是什么原因 端午节是在秋天吗 五月端午是什么季节 端午节节日日期 小艺音响怎么连接奥克斯空调? 醋酸面料的产品用途 开心宝贝1、2、3、4部目录 开心宝贝1到6部目录(先写1到5部的,6部出了再写) 这是开心宝贝哪一集? 苹果手机怎么安装两个 旭辉星奕怎么样?好不好?值不值得买? 庆大香格经典怎么样?好不好?值不值得买? 开心宝贝之开心星星球简谱 怎么取消QQ表情快捷方式 恒泰德钰名邸怎么样?好不好?值不值得买?