`

php和java 调用 weservice

 
阅读更多

 查看是否可以使用该webservice: wget 。。。。.asmx?wsdl查看是否ping通

php调用:

 $client = new SoapClient ("http://www.webxml.com.cn/WebServices/IpAddressSearchWebService.asmx?wsdl");

   $ret=$client->getVersionTime();

   var_dump( $ret );

输出:

object(stdClass)#16 (1) { ["getVersionTimeResult"]=> string(32) "IP数据库版本更新时间。。。" }

java 例子:

package test.com.inspur.uc.user;

 

import java.util.Iterator;

 

import org.apache.axiom.om.OMAbstractFactory;

import org.apache.axiom.om.OMElement;

import org.apache.axiom.om.OMFactory;

import org.apache.axiom.om.OMNamespace;

import org.apache.axis2.AxisFault;

import org.apache.axis2.addressing.EndpointReference;

import org.apache.axis2.client.Options;

import org.apache.axis2.rpc.client.RPCServiceClient;

 

 

public class UserDomainTest {

 

 

public static void main(String[] args) {

 

System.out.println(getAddressByIp("10.10.10.250"));

}  

/** 

* document调用,解除耦合

    */  

   public static String getAddressByIp(String ip){  

            

       RPCServiceClient serviceClient;  

       try {  

       //定义使用远程调用协议rpc调用webservice

           serviceClient = new RPCServiceClient();  

           Options options = serviceClient.getOptions();

           //指定调用rpc的url,http://www.webxml.com.cn/WebServices/IpAddressSearchWebService.asmx?wsdl描述文件

           EndpointReference targetEPR = new EndpointReference("http://www.webxml.com.cn:80/WebServices/IpAddressSearchWebService.asmx");  

           //确定目标地址

           options.setTo(targetEPR);  

           //确定调用方法<soap:operation soapAction="http://WebXml.com.cn/getCountryCityByIp" style="document"/>

           options.setAction("http://WebXml.com.cn/getCountryCityByIp");  

             

           OMFactory fac = OMAbstractFactory.getOMFactory();  

           /**

            * <wsdl:operation name="getCountryCityByIp">

           <soap:operation soapAction="http://WebXml.com.cn/getCountryCityByIp" style="document"/>

           <wsdl:input>

           <soap:body use="literal"/>

           </wsdl:input>

           <wsdl:output>

           <soap:body use="literal"/>

           </wsdl:output>

           </wsdl:operation>

           **/

           // targetNamespace="http://WebXml.com.cn/"命名空间

           OMNamespace omNs = fac.createOMNamespace("http://WebXml.com.cn/", "");  

           //方法名

           OMElement data = fac.createOMElement("getCountryCityByIp", omNs);  

             

           //添加 入参theIpAddress  

           OMElement inner = fac.createOMElement("theIpAddress", omNs);  

           inner.setText(ip);  

           data.addChild(inner);  

             

           //发送请求,并接受响应,返回值格式如下:  

//          <getCountryCityByIpResponse xmlns="http://WebXml.com.cn/">  

//            <getCountryCityByIpResult>  

//              <string>201.1.12.101</string>  

//              <string>巴西 圣保罗</string>  

//            </getCountryCityByIpResult>  

//          </getCountryCityByIpResponse>  

           OMElement result = serviceClient.sendReceive(data);  

           Iterator<OMElement> iter = result.getChildElements();  

           OMElement child = iter.next();  

           Iterator<OMElement> iter2 = child.getChildElements();  

           iter2.next();  

           return iter2.next().getText();   

       } catch (AxisFault e) {  

           e.printStackTrace();  

           return "归属地未知";  

       }  

}

 

}

 

 输出:局域网 对方和您在同一内部网

 

 

 

 

 

转:

分类: 系统运维

 

参考  http://www.ibm.com/developerworks/webservices/library/ws-apacheaxis/index.html

下载axis2-1.5.4-bin.zip文件并解压。设置axis2的环境变量 "AXIS2_HOME"

服务端

We will generate the service components for the web service. For this we will use the standard Axis2's WSDL2Java command. We will use Axis2 Data binding Framework (ADB) as the data binding framework (you are free to choose any data binding framework which Axis2 supports). For generating the server-side components of the web service, execute the following command in the same command prompt window. 

利用 wsdl 文件生成服务端代码

  1. %AXIS2_HOME%\bin\WSDL2Java -uri StockQuoteService.wsdl -d adb -s -ss -sd -ssi -o service

WSDL2Java命令参数说明: 
  -uri  指定*.wsdl文件,可以带具体路径;  
  -p  指定生成代码的包名 
  -d  使用不同的数据绑定方法;  
adb , xmlbeans  

  -o  指定生成代码放置的路径; 
  -ss 表示要生成服务端代码;  
  -ssi 表示要生成代码中,先生成接口类,再生成实现类;
 


新建web工程(服务端) 结构如下: 


  1. WebContent
  2.   |-- WEB-INF
  3.        |-- classes    
  4.        |-- lib                        添加 axis2 的jar包
  5.        |-- services        固定目录名称   将生成resources目录下的文件放入 
  6.        |     |-- StockQuoteService    目录名称可随意取
  7.        |           |-- META-INF
  8.        |                 |-- services.xml      固定名称 
  9.        |                 |-- StockQuoteService.wsdl   用于发布的wsdl文件
  10.        |-- web.xml
  11.        |-- weblogic.xml


编辑web.xml加入如下代码: 


  1.   <servlet>
        <servlet-name>AxisServlet</servlet-name>
        <servlet-class>org.apache.axis2.transport.http.AxisServlet</servlet-class>
      </servlet>
      <servlet-mapping>
        <servlet-name>AxisServlet</servlet-name>
        <url-pattern>/services/*</url-pattern>
      </servlet-mapping>
weblogic.xml 适用于weblogic 服务器
  解决 java.lang.NoSuchMethodError: javax.xml.namespace.QName.<init>(Ljava/lang/String;
Ljava/lang/String;Ljava/lang/String;)V 问题

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE weblogic-web-app PUBLIC "-//BEA Systems, Inc.//DTD Web Application 8.1//EN" "http://www.bea.com/servers/wls810/dtd/weblogic810-web-jar.dtd">
  3. <weblogic-web-app>
  4.   <container-descriptor>
  5.     <prefer-web-inf-classes>true</prefer-web-inf-classes>
  6.   </container-descriptor>
  7.   <context-root>StockQuoteWS</context-root>
  8. </weblogic-web-app>
打包发布  http://localhost:8080/StockQuoteWS/services/StockQuoteService?wsdl


客户端  调用三种方法  前两种不生成客户端代码  但不太好用 

点击(此处)折叠或打开

  1. package samples.quickstart.client;
  2. import javax.xml.namespace.QName;
  3. import org.apache.axiom.om.OMAbstractFactory;
  4. import org.apache.axiom.om.OMElement;
  5. import org.apache.axiom.om.OMFactory;
  6. import org.apache.axiom.om.OMNamespace;
  7. import org.apache.axis2.AxisFault;
  8. import org.apache.axis2.addressing.EndpointReference;
  9. import org.apache.axis2.client.Options;
  10. import org.apache.axis2.client.ServiceClient;
  11. import org.apache.axis2.rpc.client.RPCServiceClient;
  12. import samples.quickstart.StockQuoteServiceStub;
  13. import samples.quickstart.xsd.GetPrice;
  14. import samples.quickstart.xsd.GetPriceResponse;
  15. public class StockQuoteClient {
  16.   /**
  17.    * 方法一: 
  18.    * 应用rpc的方式调用 这种方式就等于远程调用,
  19.    * 即通过url定位告诉远程服务器,告知方法名称,参数等, 调用远程服务,得到结果。
  20.    * 使用 org.apache.axis2.rpc.client.RPCServiceClient类调用WebService
  21.    * 
  22.     【注】:
  23.     
  24.         如果被调用的WebService方法有返回值 应使用 invokeBlocking 方法 该方法有三个参数
  25.           第一个参数的类型是QName对象,表示要调用的方法名;
  26.           第二个参数表示要调用的WebService方法的参数值,参数类型为Object[];
  27.             当方法没有参数时,invokeBlocking方法的第二个参数值不能是null,而要使用new Object[]{}。
  28.           第三个参数表示WebService方法的 返回值类型的Class对象,参数类型为Class[]。
  29.         
  30.         
  31.         如果被调用的WebService方法没有返回值 应使用 invokeRobust 方法 
  32.           该方法只有两个参数,它们的含义与invokeBlocking方法的前两个参数的含义相同。
  33.         在创建QName对象时,QName类的构造方法的第一个参数表示WSDL文件的命名空间名,
  34.         也就是 <wsdl:definitions>元素的targetNamespace属性值。
  35.    * 
  36.    */
  37.   public static void testRPCClient() {
  38.     try {
  39.       // axis1 服务端
  40. // String url = "http://localhost:8080/StockQuote/services/StockQuoteServiceSOAP11port?wsdl"; 
  41.       // axis2 服务端
  42.       String url = "http://localhost:8080/axis2ServerDemo/services/StockQuoteService?wsdl";
  43.       // 使用RPC方式调用WebService
  44.       RPCServiceClient serviceClient = new RPCServiceClient();
  45.       // 指定调用WebService的URL
  46.       EndpointReference targetEPR = new EndpointReference(url);
  47.       Options options = serviceClient.getOptions();
  48.       //确定目标服务地址
  49.       options.setTo(targetEPR);
  50.       //确定调用方法
  51.       options.setAction("urn:getPrice");
  52.       /**
  53.        * 指定要调用的getPrice方法及WSDL文件的命名空间 
  54.        * 如果 webservice 服务端由axis2编写 
  55.        * 命名空间 不一致导致的问题
  56.        * org.apache.axis2.AxisFault: java.lang.RuntimeException: Unexpected subelement arg0 
  57.        */
  58.       QName qname = new QName("http://quickstart.samples/xsd", "getPrice");
  59.       // 指定getPrice方法的参数值
  60.       Object[] parameters = new Object[] { "13" };
  61.       
  62.       // 指定getPrice方法返回值的数据类型的Class对象
  63.       Class[] returnTypes = new Class[] { double.class };
  64.       // 调用方法一 传递参数,调用服务,获取服务返回结果集
  65.       OMElement element = serviceClient.invokeBlocking(qname, parameters);
  66.       //值得注意的是,返回结果就是一段由OMElement对象封装的xml字符串。
  67.       //我们可以对之灵活应用,下面我取第一个元素值,并打印之。因为调用的方法返回一个结果
  68.       String result = element.getFirstElement().getText();
  69.       System.out.println(result);
  70.       // 调用方法二 getPrice方法并输出该方法的返回值
  71.       Object[] response = serviceClient.invokeBlocking(qname, parameters, returnTypes);
  72.       // String r = (String) response[0];
  73.       Double r = (Double) response[0];
  74.       System.out.println(r);
  75.     } catch (AxisFault e) {
  76.       e.printStackTrace();
  77.     }
  78.   }
  79.   /**
  80.    * 方法二: 应用document方式调用
  81.    * 用ducument方式应用现对繁琐而灵活。现在用的比较多。因为真正摆脱了我们不想要的耦合
  82.    */
  83.   public static void testDocument() {
  84.     try {
  85.       // String url = "http://localhost:8080/axis2ServerDemo/services/StockQuoteService";
  86.       String url = "http://localhost:8080/StockQuote/services/StockQuoteServiceSOAP11port?wsdl";
  87.       Options options = new Options();
  88.       // 指定调用WebService的URL
  89.       EndpointReference targetEPR = new EndpointReference(url);
  90.       options.setTo(targetEPR);
  91.       // options.setAction("urn:getPrice");
  92.       ServiceClient sender = new ServiceClient();
  93.       sender.setOptions(options);
  94.       
  95.       
  96.       OMFactory fac = OMAbstractFactory.getOMFactory();
  97.       String tns = "http://quickstart.samples/";
  98.       // 命名空间,有时命名空间不增加没事,不过最好加上,因为有时有事,你懂的
  99.       OMNamespace omNs = fac.createOMNamespace(tns, "");
  100.       OMElement method = fac.createOMElement("getPrice", omNs);
  101.       OMElement symbol = fac.createOMElement("symbol", omNs);
  102.       // symbol.setText("1");
  103.       symbol.addChild(fac.createOMText(symbol, "Axis2 Echo String "));
  104.       method.addChild(symbol);
  105.       method.build();
  106.       
  107.       OMElement result = sender.sendReceive(method);
  108.       System.out.println(result);
  109.     } catch (AxisFault axisFault) {
  110.       axisFault.printStackTrace();
  111.     }
  112.   }
  113.  /**
  114.   * 为SOAP Header构造验证信息, 
  115.   * 如果你的服务端是没有验证的,那么你不用在Header中增加验证信息
  116.   * 
  117.   * @param serviceClient
  118.   * @param tns 命名空间 
  119.   * @param user 
  120.   * @param passwrod
  121.   */
  122.   public void addValidation(ServiceClient serviceClient, String tns , String user, String passwrod) {
  123.     OMFactory fac = OMAbstractFactory.getOMFactory();
  124.     OMNamespace omNs = fac.createOMNamespace(tns, "nsl");
  125.     OMElement header = fac.createOMElement("AuthenticationToken", omNs);
  126.     OMElement ome_user = fac.createOMElement("Username", omNs);
  127.     OMElement ome_pass = fac.createOMElement("Password", omNs);
  128.     
  129.     ome_user.setText(user);
  130.     ome_pass.setText(passwrod);
  131.     
  132.     header.addChild(ome_user);
  133.     header.addChild(ome_pass);
  134.     serviceClient.addHeader(header);
  135.   }
  136.   
  137.   /**
  138.    * 方法三:利用axis2插件生成客户端方式调用
  139.    * 
  140.    */
  141.   public static void testCodeClient() {
  142.     try {
  143.       String url = "http://localhost:8080/axis2ServerDemo/services/StockQuoteService";
  144.       StockQuoteServiceStub stub = new StockQuoteServiceStub(url);
  145.       GetPrice request = new GetPrice();
  146.       request.setSymbol("ABCD");
  147.       GetPriceResponse response = stub.getPrice(request);
  148.       System.out.println(response.get_return());
  149.     } catch (org.apache.axis2.AxisFault e) {
  150.       e.printStackTrace();
  151.     } catch (java.rmi.RemoteException e) {
  152.       e.printStackTrace();
  153.     }
  154.   }
  155.   public static void main(String[] args) {
  156.      StockQuoteClient.testRPCClient();
  157. // StockQuoteClient.testDocument();
  158.     // StockQuoteClient.testCodeClient();
  159.   }
  160. }





利用 axis2 的wsdl2java.bat生成客户端程序

%AXIS2_HOME%\bin\wsdl2java -uri StockQuoteService.wsdl -d adb -p axis2.service.server -o client -u
   其中-uri参数指定了wsdl文件的路径,可以是本地路径,也可以是网络路径。-p参数指定了生成的Java类的包名,-o参数指定了生成的一系列文件保存的根目录。加上可选参数 -u Unpacks the databinding classes  避免生成的ServiceStub类特别大 在执行完上面的命令后,读者就会发现在当前目录下多了个client目录,可以找到一个HelloServiceStub.java文件,该文件复杂调用WebService,读者可以在程序中直接使用这个类。

其中HelloServiceStub.java是客户端程序,HelloServiceCallbackHandler.java是异步客户端程序。


Axis2 客户端最少依赖包

  1. activation-1.1.jar
  2. axiom-api-1.2.4.jar
  3. axiom-impl-1.2.4.jar
  4. axis2-adb-1.2.jar
  5. axis2-kernel-1.2.jar
  6. commons-codec-1.3.jar
  7. commons-httpclient-3.0.1.jar
  8. commons-logging-1.1.jar
  9. stax-api-1.0.1.jar
  10. wsdl4j-1.6.2.jar
  11. wstx-asl-3.2.1.jar
  12. XmlSchema-1.3.1.jar
分享到:
评论

相关推荐

    Java调用php的webservice

    NuSOAP是一个轻量级的PHP库,支持SOAP 1.1和1.2标准,能够快速构建或调用Webservice。 ##### 1. NuSOAP配置与引入 ```php require_once("lib/nusoap.php"); ``` 这行代码表示引入NuSOAP库,确保PHP脚本能访问NuSOAP...

    oracle 调用webservice

    本文将详细介绍 Oracle 调用 Webservice 的实现过程,包括 Webservice 的基本概念、 Java 编写简单的 WebService 实例、Oracle 服务器端配置、加载 JAR 包、测试调用 PHP Webservice 和 Java Webservice 等内容。...

    php调用webservice及myeclipse创建webservice实例

    在提供的压缩包文件中,"php+webservice"很可能包含了PHP代码文件,用于演示如何调用由MyEclipse创建的Web服务。这些文件可能包括一个PHP脚本,该脚本使用SoapClient类与Web服务交互,以及MyEclipse项目中的源代码和...

    php调用java写的webservice

    在提供的压缩包文件中,可能包含了PHP源码示例和详细说明,这些资源可以帮助你更好地理解和实践PHP调用Java Web服务的过程。通过研究这些示例,你可以了解到实际项目中的具体实现细节,例如如何构建请求参数,如何...

    几种调用WebService的方法

    4. **PHP**:可以使用内置的`SoapClient`类来调用WebService。 每种编程语言都有其特定的库或框架支持WebService的调用,开发者应根据项目的具体需求选择合适的技术栈。 #### 结论 调用WebService的方法多种多样...

    调用WEBService参数

    总之,调用WebService参数涉及对WSDL的理解、客户端代理类的生成以及正确设置和传递参数。在实际开发中,确保正确理解和使用这些参数是成功调用WebService的关键。对于"WEBgangcai"的具体内容,如果没有更多信息,...

    Android调用Java WebService的实现方法.pdf

    在Android开发中,获取网络上的数据是一种常见需求。...这两者各有优缺点,前者简单易用...但对于需要处理大量数据的大型应用,使用Java、.NET或PHP等开发的Web Service进行网络数据交互,能够提供更大的灵活性和扩展性。

    动态调用WebService.

    4. **SOAP客户端库**:大多数编程语言都有对应的SOAP客户端库,如Java的JAX-WS,Python的suds,PHP的SoapClient等,它们简化了动态调用Web Service的过程。开发者只需要提供WSDL地址,库会自动生成对应的调用方法。 ...

    多语言调用WebService技术文档.doc

    - **Java调用**:Java有JAX-WS(Java API for XML Web Services)框架,如Apache CXF,可以直接生成客户端代码调用WebService。 - **C#调用**:.NET Framework提供了System.Web.Services命名空间,简化了C#调用...

    phprpc_3.0.2_java,webservice

    Phprpc为Java提供了一套API,使得开发者可以轻松地将Java对象和方法封装成远程可调用的服务。 4. **Web服务**:Web服务是一种基于HTTP协议的通信方式,允许不同的应用系统通过互联网交换数据。Phprpc结合Web服务,...

    WebService服务使用Md5和SHA1加密验证登陆

    在WebService使用Md5和SHA1加密技术对用户密码进行加密处理,从而增加用户安全性。登陆判断同样通过Md5和SHA1加密密码然后和数据库经过加密密码进行比较来(它们可都是二进制滴哦!)验证用户是否存在 很好滴东西 ...

    php调用Java axis2发布的webservice

    2.1 用java建一个简单的工程sayHi,在里面编写一个简单的服务类sayHi,里面有一个函数sayHello. package Hi; publicclass sayHi { public String sayHello(String user,String weather) { return"Hi "+ user +". It'...

    PHP写的webservice可以供C#调用

    虽然描述中提到没有尝试过供Java调用,理论上,只要PHP服务符合SOAP标准,任何支持SOAP的编程语言(包括Java)都可以调用。Java中,可以使用JAX-WS库(如Apache CXF)或者Java的`javax.xml.soap`包来实现SOAP客户端...

    转 主题:实战WebService I: XML-PRC篇(基于php)

    在博文《实战WebService I: XML-RPC篇(基于php)》中,作者通过具体的代码示例,详细介绍了如何在PHP环境中搭建和使用XML-RPC服务。文章可能涵盖了创建XML-RPC服务器、定义可调用的方法、创建XML-RPC客户端以及如何...

    在Android中调用WebService实例

    某些情况下我们可能需要与Mysql或者Oracle数据库进行数据交互,有些朋友的第一反应就是直接在Android中加载驱动...既然是调用WebService,我们首先的搭建WebService服务器。 下面演示的就是如何通过该网站提供的手机

    java_webservice_myeclipse.rar

    在“java_webservice_myeclipse.rar”压缩包中,包含了详细的步骤和图解,帮助你理解Web服务在MyEclipse中的实际操作: 1. 项目结构:通常包含src目录(源代码)、WebContent目录(Web应用资源)以及WEB-INF目录...

    根据wsdl离线文件如何调用webService接口

    在实际开发中,有一些工具可以帮助我们简化这个过程,例如Apache CXF的wsdl2java工具,它可以生成Java客户端代码,使得调用Web Service就像调用本地方法一样简单。对于其他编程语言,也有相应的工具或库,如.NET的...

    PHP调用JAVA的WebService简单实例

    总结来说,这个例子展示了如何利用PHP调用JAVA编写的WebService,以及在服务端和客户端之间如何通过SOAP进行数据交换。在实际项目中,这种方式允许不同技术栈的应用之间进行通信,增加了系统的灵活性和可扩展性。

    java调用hessianphp写得web service

    总的来说,Java调用HessianPHP写的Web服务涉及了Hessian协议的理解,Java的Hessian库使用,以及PHP服务端的HessianPHP实现。这个过程简化了Java与PHP之间的通信,使得跨语言的集成变得更为便捷。在实际开发中,根据...

    PHP WebService实现

    本文主要探讨如何使用PHP构建基于SOAP(Simple Object Access Protocol)的Web Service,以及在PHP和Java中如何调用这些服务。 首先,我们需要搭建PHP的运行环境和开发环境。对于初学者,可以选择在Windows操作系统...

Global site tag (gtag.js) - Google Analytics