加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 23:26:15 所属栏目:安全 来源:网络整理
导读:之前做的微信公众平台中有用到一些调用第三方的API接口,比如天气查询,公交查询等等,这使得我对第三方的Api的接口制作产生了很多的兴趣。 我的思路是,通过webservice来制作第三方的api接口,可以发布后便于微信公众平台中再次调用。好废话不多说,切入正

之前做的微信公众平台中有用到一些调用第三方的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类放在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-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); 
                    
                }
此处是微信服务器与本机服务器交互的核心代码,如果有不清楚的话,可以去看柳峰的博客

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读