微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

之前做的微信公众平台中有用到一些调用第三方的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的客户端代码如下:

//这里是五险一金计算器的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[]
       当方法没有参数时,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); 
                    
                }
此处是微信服务器与本机服务器交互的核心代码,如果有不清楚的话,可以去看柳峰的博客

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐