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 "归属地未知";
}
}
}
输出:局域网 对方和您在同一内部网
转:
分类: 系统运维
下载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 文件生成服务端代码
- %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工程(服务端) 结构如下:
- WebContent
- |-- WEB-INF
- |-- classes
- |-- lib 添加 axis2 的jar包
- |-- services 固定目录名称 将生成resources目录下的文件放入
- | |-- StockQuoteService 目录名称可随意取
- | |-- META-INF
- | |-- services.xml 固定名称
- | |-- StockQuoteService.wsdl 用于发布的wsdl文件
- |-- web.xml
- |-- weblogic.xml
编辑web.xml加入如下代码:
- <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>
解决 java.lang.NoSuchMethodError: javax.xml.namespace.QName.<init>(Ljava/lang/String;
Ljava/lang/String;Ljava/lang/String;)V 问题
- <?xml version="1.0" encoding="UTF-8"?>
- <!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">
- <weblogic-web-app>
- <container-descriptor>
- <prefer-web-inf-classes>true</prefer-web-inf-classes>
- </container-descriptor>
- <context-root>StockQuoteWS</context-root>
- </weblogic-web-app>
客户端 调用三种方法 前两种不生成客户端代码 但不太好用
点击(此处)折叠或打开
- package samples.quickstart.client;
- import javax.xml.namespace.QName;
- 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.client.ServiceClient;
- import org.apache.axis2.rpc.client.RPCServiceClient;
- import samples.quickstart.StockQuoteServiceStub;
- import samples.quickstart.xsd.GetPrice;
- import samples.quickstart.xsd.GetPriceResponse;
- public class StockQuoteClient {
- /**
- * 方法一:
- * 应用rpc的方式调用 这种方式就等于远程调用,
- * 即通过url定位告诉远程服务器,告知方法名称,参数等, 调用远程服务,得到结果。
- * 使用 org.apache.axis2.rpc.client.RPCServiceClient类调用WebService
- *
- 【注】:
- 如果被调用的WebService方法有返回值 应使用 invokeBlocking 方法 该方法有三个参数
- 第一个参数的类型是QName对象,表示要调用的方法名;
- 第二个参数表示要调用的WebService方法的参数值,参数类型为Object[];
- 当方法没有参数时,invokeBlocking方法的第二个参数值不能是null,而要使用new Object[]{}。
- 第三个参数表示WebService方法的 返回值类型的Class对象,参数类型为Class[]。
- 如果被调用的WebService方法没有返回值 应使用 invokeRobust 方法
- 该方法只有两个参数,它们的含义与invokeBlocking方法的前两个参数的含义相同。
- 在创建QName对象时,QName类的构造方法的第一个参数表示WSDL文件的命名空间名,
- 也就是 <wsdl:definitions>元素的targetNamespace属性值。
- *
- */
- public static void testRPCClient() {
- try {
- // axis1 服务端
- // String url = "http://localhost:8080/StockQuote/services/StockQuoteServiceSOAP11port?wsdl";
- // axis2 服务端
- String url = "http://localhost:8080/axis2ServerDemo/services/StockQuoteService?wsdl";
- // 使用RPC方式调用WebService
- RPCServiceClient serviceClient = new RPCServiceClient();
- // 指定调用WebService的URL
- EndpointReference targetEPR = new EndpointReference(url);
- Options options = serviceClient.getOptions();
- //确定目标服务地址
- options.setTo(targetEPR);
- //确定调用方法
- options.setAction("urn:getPrice");
- /**
- * 指定要调用的getPrice方法及WSDL文件的命名空间
- * 如果 webservice 服务端由axis2编写
- * 命名空间 不一致导致的问题
- * org.apache.axis2.AxisFault: java.lang.RuntimeException: Unexpected subelement arg0
- */
- QName qname = new QName("http://quickstart.samples/xsd", "getPrice");
- // 指定getPrice方法的参数值
- Object[] parameters = new Object[] { "13" };
- // 指定getPrice方法返回值的数据类型的Class对象
- Class[] returnTypes = new Class[] { double.class };
- // 调用方法一 传递参数,调用服务,获取服务返回结果集
- OMElement element = serviceClient.invokeBlocking(qname, parameters);
- //值得注意的是,返回结果就是一段由OMElement对象封装的xml字符串。
- //我们可以对之灵活应用,下面我取第一个元素值,并打印之。因为调用的方法返回一个结果
- String result = element.getFirstElement().getText();
- System.out.println(result);
- // 调用方法二 getPrice方法并输出该方法的返回值
- Object[] response = serviceClient.invokeBlocking(qname, parameters, returnTypes);
- // String r = (String) response[0];
- Double r = (Double) response[0];
- System.out.println(r);
- } catch (AxisFault e) {
- e.printStackTrace();
- }
- }
- /**
- * 方法二: 应用document方式调用
- * 用ducument方式应用现对繁琐而灵活。现在用的比较多。因为真正摆脱了我们不想要的耦合
- */
- public static void testDocument() {
- try {
- // String url = "http://localhost:8080/axis2ServerDemo/services/StockQuoteService";
- String url = "http://localhost:8080/StockQuote/services/StockQuoteServiceSOAP11port?wsdl";
- Options options = new Options();
- // 指定调用WebService的URL
- EndpointReference targetEPR = new EndpointReference(url);
- options.setTo(targetEPR);
- // options.setAction("urn:getPrice");
- ServiceClient sender = new ServiceClient();
- sender.setOptions(options);
- OMFactory fac = OMAbstractFactory.getOMFactory();
- String tns = "http://quickstart.samples/";
- // 命名空间,有时命名空间不增加没事,不过最好加上,因为有时有事,你懂的
- OMNamespace omNs = fac.createOMNamespace(tns, "");
- OMElement method = fac.createOMElement("getPrice", omNs);
- OMElement symbol = fac.createOMElement("symbol", omNs);
- // symbol.setText("1");
- symbol.addChild(fac.createOMText(symbol, "Axis2 Echo String "));
- method.addChild(symbol);
- method.build();
- OMElement result = sender.sendReceive(method);
- System.out.println(result);
- } catch (AxisFault axisFault) {
- axisFault.printStackTrace();
- }
- }
- /**
- * 为SOAP Header构造验证信息,
- * 如果你的服务端是没有验证的,那么你不用在Header中增加验证信息
- *
- * @param serviceClient
- * @param tns 命名空间
- * @param user
- * @param passwrod
- */
- public void addValidation(ServiceClient serviceClient, String tns , String user, String passwrod) {
- OMFactory fac = OMAbstractFactory.getOMFactory();
- OMNamespace omNs = fac.createOMNamespace(tns, "nsl");
- OMElement header = fac.createOMElement("AuthenticationToken", omNs);
- OMElement ome_user = fac.createOMElement("Username", omNs);
- OMElement ome_pass = fac.createOMElement("Password", omNs);
- ome_user.setText(user);
- ome_pass.setText(passwrod);
- header.addChild(ome_user);
- header.addChild(ome_pass);
- serviceClient.addHeader(header);
- }
- /**
- * 方法三:利用axis2插件生成客户端方式调用
- *
- */
- public static void testCodeClient() {
- try {
- String url = "http://localhost:8080/axis2ServerDemo/services/StockQuoteService";
- StockQuoteServiceStub stub = new StockQuoteServiceStub(url);
- GetPrice request = new GetPrice();
- request.setSymbol("ABCD");
- GetPriceResponse response = stub.getPrice(request);
- System.out.println(response.get_return());
- } catch (org.apache.axis2.AxisFault e) {
- e.printStackTrace();
- } catch (java.rmi.RemoteException e) {
- e.printStackTrace();
- }
- }
- public static void main(String[] args) {
- StockQuoteClient.testRPCClient();
- // StockQuoteClient.testDocument();
- // StockQuoteClient.testCodeClient();
- }
- }
利用 axis2 的wsdl2java.bat生成客户端程序
其中HelloServiceStub.java是客户端程序,HelloServiceCallbackHandler.java是异步客户端程序。
Axis2 客户端最少依赖包
- activation-1.1.jar
- axiom-api-1.2.4.jar
- axiom-impl-1.2.4.jar
- axis2-adb-1.2.jar
- axis2-kernel-1.2.jar
- commons-codec-1.3.jar
- commons-httpclient-3.0.1.jar
- commons-logging-1.1.jar
- stax-api-1.0.1.jar
- wsdl4j-1.6.2.jar
- wstx-asl-3.2.1.jar
- XmlSchema-1.3.1.jar