微信开发中如何调用自己写的webservice

来源:互联网 发布:淘宝联盟怎么赚不到钱 编辑:程序博客网 时间:2024/05/21 07:47

之前做的微信公众平台中有用到一些调用第三方的API接口,比如天气查询,公交查询等等,这使得我对第三方的Api的接口制作产生了很多的兴趣。

我的思路是,通过webservice来制作第三方的api接口,可以发布后便于微信公众平台中再次调用。好废话不多说,切入正题。

第一步 我们先建立起自己的webservice

 这里我选择的是Axis2(好处不多说)

使用Axis2无需复杂、额外的配置。

(1)Axis的下载和安装

1.可从http://ws.apache.org/axis2/下载Axis2的最新版本:     

可以下载如下两个zip包:
      axis2-1.5.4-bin.zip     axis2-1.5.4-war.zip
其中 axis2-1.5.4-bin.zip文件中包含了Axis2中所有的jar文件, axis2-1.5.4-war.zip文件用于将WebService发布到Web容器中。

 2.将axis2-1.5.4-war.zip文件解压到相应的目录,将目录中的axis2.war文件放到<Tomcat安装目录>\webapps目录中,并启动Tomcat,在浏览器地址栏中输入如下的URL:
     http://localhost:8080/axis2/,如看到axis2的主页面则安装成功

(2)使用services.xml配置文件发布

  用Axis2实现Web Service,虽然可以将POJO类放在axis2\WEB-INF\pojo目录中直接发布成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.29\apache-tomcat-6.0.29\webapps\axis2\WEB-INFpojo文件中(如果没有此文件,则创建此文件)

注意:class不能有package

最后通过下面的URL可以获得这个WebService的WSDL内容:

http://localhost:8080/axis2/services/MyService?wsdl
  其中name属性名就是上面URL中"?"和"/"之间的部分

  例如,sayHelloNew方法有一个返回值,因此,需要使用可处理输入输出的RPCMessageReceiver类,而updateData方法没有返回值,因此,需要使用只能处理输入的RPCInOnlyMessageReceiver类。

(1)   用Java实现调用WebService的客户端程序
 WebService是为程序服务的,只在浏览器中访问WebService是没有意义的。(此外注意微信那边只接受80端口,我的webservice只写在本地,用于测试之用)用WebService的客户端代码如下:

//这里是五险一金计算器的webservicepublic 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[]
       当方法没有参数时,invokeBlocking方法的第二个参数值不能是null,而要使用new Object[]{}。

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);                                     }
此处是微信服务器与本机服务器交互的核心代码,如果有不清楚的话,可以去看柳峰的博客

以上程序主要实现了以下功能

 用户输入自己的工资,我的微信公众账号就会返回一个所五险一金的金额给他。


1 0
原创粉丝点击