微信开发中如何调用自己写的webservice
之前做的微信公众平台中有用到一些调用第三方的API接口,比如天气查询,公交查询等等,这使得我对第三方的Api的接口制作产生了很多的兴趣。 我的思路是,通过webservice来制作第三方的api接口,可以发布后便于微信公众平台中再次调用。好废话不多说,切入正题。第一步 我们先建立起自己的webservice ?这里我选择的是Axis2(好处不多说)。 使用Axis2无需复杂、额外的配置。 (1)Axis的下载和安装 1.可从http://ws.apache.org/axis2/下载Axis2的最新版本:????? 可以下载如下两个zip包: ?2.将axis2-1.5.4-war.zip文件解压到相应的目录,将目录中的axis2.war文件放到<Tomcat安装目录>webapps目录中,并启动Tomcat,在浏览器地址栏中输入如下的URL: (2)使用services.xml配置文件发布 ??用Axis2实现Web Service,虽然可以将POJO类放在axis2WEB-INFpojo目录中直接发布成Web Service,这样做不需要进行任何配置,但这些POJO类不能在任何包中。这似乎有些不方便. 为此,Axis2也允许将带包的POJO类发布成Web Service。先实现一个POJO类,代码如下: public class MyService { <p><span style="color:#0070C0;"> public StringgetGreeting(String name)</span></p><p><span style="color:#0070C0;">? </span>??? {</p><p><span style="color:#0070C0;">? </span>??????? return "<span style="color:#0070C0;">你好</span><span style="color:#0070C0;"> " + name;</span></p><p><span style="color:#0070C0;">? </span>??? }??? </p><p><span style="color:#0070C0;">? </span> ?public int getPrice()</p><p><span style="color:#0070C0;">? </span>??? {</p><p><span style="color:#0070C0;">? </span>??????? return newjava.util.Random().nextInt(1000);</p><p><span style="color:#0070C0;">? </span>??? }?? </p> //计算五险一金的函数,简易版,主要演示效果 public floatgetInsurance(int salary) { floatinsurance=(float)(salary*0.18); return insurance; } } 将上述class文件解析完后,放入到E:apache-tomcat-6.0.29apache-tomcat-6.0.29webappsaxis2WEB-INF的pojo文件中(如果没有此文件,则创建此文件)。 注意:class不能有package名 最后通过下面的URL可以获得这个WebService的WSDL内容: http://localhost:8080/axis2/services/MyService?wsdl ??例如,sayHelloNew方法有一个返回值,因此,需要使用可处理输入输出的RPCMessageReceiver类,而updateData方法没有返回值,因此,需要使用只能处理输入的RPCInOnlyMessageReceiver类。 (1)???用Java实现调用WebService的客户端程序 //这里是五险一金计算器的webservice public static voidmain(String[] args) throws Exception { // 使用RPC方式调用WebService RPCServiceClient serviceClient = newRPCServiceClient(); Options options =serviceClient.getOptions(); // 指定调用WebService的URL EndpointReference targetEPR = newEndpointReference("http://localhost:8080/axis2/services/MyService"); options.setTo(targetEPR); // 指定getGreeting方法的入参值 Integer[] salary= new Integer[] {8000}; // 指定getGreeting方法返回值的数据类型的Class对象 Class[] insurance = new Class[]{Float.class}; // 指定要调用的getGreeting方法及WSDL文件的命名空间 QName opAddEntry = new QName("http://ws.apache.org/axis2","getInsurance"); //三个参数对应调用方法名、入参和返回值 System.out.println(serviceClient.invokeBlocking(opAddEntry,salary,insurance)[0]); } } 在编写客户端代码时应注意如下几点: 1. 客户端代码需要引用很多Axis2的jar包,如果读者不太清楚要引用哪个jar包,可以在Eclipse的工程中引用Axis2发行包的lib目录中的所有jar包。 2. 在本例中使用了RPCServiceClient类的invokeBlocking方法调用了WebService中的方法。invokeBlocking方法有三个参数,其中第一个参数的类型是QName对象,表示要调用的方法名;第二个参数表示要调用的WebService方法的参数值,参数类型为Object[];第三个参数表示WebService方法的返回值类型的Class对象,参数类型为Class[]。 3. 如果被调用的WebService方法没有返回值,应使用RPCServiceClient类的invokeRobust方法,该方法只有两个参数,它们的含义与invokeBlocking方法的前两个参数的含义相同。 ?4. 在创建QName对象时,QName类的构造方法的第一个参数表示WSDL文件的命名空间名, 也就是<wsdl:definitions>元素的targetNamespace属性值。 第二步 如果上述测试没有问题的话,我们就可以在微信那边调用我们自己写的webservice了 ?if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_TEXT)) { ? ??????????????? // 接收用户发送的文本消息内容 ? ??????????????? String content = requestMap.get("Content");? //五险一金计算器 if (content.startsWith("工资")) { String keyWord = content.replaceAll("^工资","").trim(); if ("".equals(keyWord)) { textMessage.setContent(CalculatorHelper.getCalculatorHelper()); } else { String wxyj=MyWebService.searchWxyj(keyWord); textMessage.setContent("您所需要缴纳的五险一金是"+wxyj); } respMessage = MessageUtil.textMessageToXml(textMessage); }此处是微信服务器与本机服务器交互的核心代码,如果有不清楚的话,可以去看柳峰的博客 以上程序主要实现了以下功能 ?用户输入自己的工资,我的微信公众账号就会返回一个所五险一金的金额给他。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |