一个最简单的供Android调用webService的rest服务端怎么搭建

 我来答
唯爱凌宝宝
推荐于2016-03-25 · TA获得超过2万个赞
知道大有可为答主
回答量:8282
采纳率:15%
帮助的人:8939万
展开全部
 Eclipse+Axis2构建WebService实战总结

  什么是webservice?

  企业提供特定的服务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 <jni.h>
  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 <jni.h>
  /* 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 <stdio.h>
  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 hModule = ::LoadLibrary("test.dll");
  08.
  09. PFUN newfun = (PFUN)::GetProcAddress(hModule,"testFn");
  10. i = newfun(a,b);
  11. ::FreeLibrary(hModule);
  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 <stdio.h>
  #include "util_InvokeDll.h"
  
  JNIEXPORT jint JNICALL Java_util_InvokeDll_testFunc(JNIEnv *, jobject, jint a, jint b)
  {
  int i=0;
  /*HMODULE hModule = ::LoadLibrary("test.dll");
  
  PFUN newfun = (PFUN)::GetProcAddress(hModule,"testFn");
  i = newfun(a,b);
  ::FreeLibrary(hModule);
  */
  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++动态库的调用。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式