java如何通过eclipse安装axis2来调用webservice

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java如何通过eclipse安装axis2来调用webservice相关的知识,希望对你有一定的参考价值。

这是http://www.webxml.com.cn/WebServices/WeatherWS.asmx?WSDL获取天气的wsdl,请问通过eclipse如何通过程序来调用这个webservice,请高手详述下步骤!最好能带截图。谢谢!

通过eclipse安装axis2来调用webservice的方法:

1、 在eclipse的菜单栏中选择 window-->preferences-->web service -->axis2 preferences 在axis2 runtime 下的 axis2 runtime location中指定解压目录

2、右击oprationServiceImpl--->webservice --->create webservice  如下:

3、在service implemention中出现需要部署的服务类 将服务器的运行状态设置为start service 并且设置 service runtime (web服务器) web service runtime (axis的版本)

对应的web项目。勾选publish the web service 和monitor the service  ---> next --->next直到:

点击 start server 启动刚刚部署的web项目 --->next 直到 finish 此时部署就已经完成了。

4、在axis-test中编写客户端代码并调用服务器程序

package com.hualom.axis.client;


import javax.xml.namespace.QName;


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 OprationClient

    /** 

     * @param args 

     * @throws AxisFault 

     */  

    public static void main(String[] args) throws AxisFault  

        // 使用RPC方式调用WebService  

        RPCServiceClient serviceClient = new RPCServiceClient();  

        Options options = serviceClient.getOptions();  

        // 指定调用WebService的URL  

        EndpointReference targetEPR = new EndpointReference("http://localhost:8080/axis2-testServer/services/OprationServiceImpl");  

        options.setTo(targetEPR);  

        // 指定要调用的计算机器中的方法及WSDL文件的命名空间:impl.service.axis.hualom.com 服务类的包名称。  

        QName searchResult = new QName("http://impl.service.axis.hualom.com","search");

        QName noSearchResult = new QName("http://impl.service.axis.hualom.com","noSearch");

        // 设置发送到服务器的内容

        Object[] opAddEntryArgs = new Object[] "你好 server";  

        // 指定返回值的类型

        Class[] classes = new Class[] String.class ;

        // 调用服务器开放的接口并且返回结果   如果没有返回值可以直接调用  serviceClient.invokeRobust(opName, opAddEntryArgs)

        System.out.println(serviceClient.invokeBlocking(searchResult,opAddEntryArgs, classes)[0]);  

     

参考技术A

调用这个webservice不需要安装axis2,但是可以在你的工程里引入Axis2的包来编写一个RPC客户端程序。

import javax.xml.namespace.QName;import org.apache.axis2.AxisFault;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.rpc.client.RPCServiceClient;


按照RPC的方式(可以搜搜,网上很多)写一个调用函数就ok了,比如:

public Object invokeWebservice() throws AxisFault 
RPCServiceClient serviceClient = new RPCServiceClient();
Options options = serviceClient.getOptions();
EndpointReference targetEPR = new EndpointReference("http://www.webxml.com.cn/WebServices/WeatherWS.asmx?WSDL");
options.setTo(targetEPR);
options.setTimeOutInMilliSeconds(TIME_OUT);
QName opAddEntry;
Object[] opAddEntryArgs = null;
Class<?>[] classes = new Class<?>[]  String.class ;
opAddEntry = new QName("", "");
return serviceClient.invokeBlocking(opAddEntry, opAddEntryArgs, classes)[0];

追问

我也这么试过,总是报错。你好人做到底,把方法参数都补齐了告诉我一下呗!

追答

调用天气查询需要用户ID,我这边网络限制不能注册。

java如何调用webservice接口

Java调用WebService可以直接使用Apache提供的axis.jar自己编写代码,或者利用Eclipse自动生成WebService Client代码,利用其中的Proxy类进行调用。理论上是一样的,只不过用Eclipse自动生成代码省事些。
1、编写代码方式:
package com.yudun.test;
import java.rmi.RemoteException;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.message.PrefixedQName;
import org.apache.axis.message.SOAPHeaderElement;
import com.cezanne.golden.user.Exception;
import com.cezanne.golden.user.UserManagerServiceProxy;
import javax.xml.namespace.QName;
import java.net.MalformedURLException;
import javax.xml.rpc.ServiceException;
import javax.xml.soap.Name;
import javax.xml.soap.SOAPException;

public class testWebService
public static String getResult() throws ServiceException, MalformedURLException, RemoteException, SOAPException

//标识Web Service的具体路径
String endpoint = "WebService服务地址";
// 创建 Service实例
Service service = new Service();
// 通过Service实例创建Call的实例
Call call = (Call) service.createCall();
//将Web Service的服务路径加入到call实例之中.
call.setTargetEndpointAddress( new java.net.URL(endpoint) );//为Call设置服务的位置
// 由于需要认证,故需要设置调用的SOAP头信息。
Name headerName = new PrefixedQName( new QName("发布的wsdl里的targetNamespace里的url", "string_itemName") );
org.apache.axis.message.SOAPHeaderElement header = new SOAPHeaderElement(headerName);
header.addTextNode( "blablabla" );
call.addHeader(header);

// SOAPHeaderElement soapHeaderElement = new SOAPHeaderElement("发布的wsdl里的targetNamespace里的url", "SoapHeader");
// soapHeaderElement.setNamespaceURI("发布的wsdl里的targetNamespace里的url");
// try
//
// soapHeaderElement.addChildElement("string_itemName").setValue("blablabla");
//
// catch (SOAPException e)
//
// e.printStackTrace();
//
// call.addHeader(soapHeaderElement);
//调用Web Service的方法
org.apache.axis.description.OperationDesc oper;
org.apache.axis.description.ParameterDesc param;
oper = new org.apache.axis.description.OperationDesc();
oper.setName("opName");
param = new org.apache.axis.description.ParameterDesc(new javax.xml.namespace.QName("", "arg0"), org.apache.axis.description.ParameterDesc.IN, new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "string"), java.lang.String.class, false, false);
param.setOmittable(true);
oper.addParameter(param);
param = new org.apache.axis.description.ParameterDesc(new javax.xml.namespace.QName("", "arg1"), org.apache.axis.description.ParameterDesc.IN, new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "string"), java.lang.String.class, false, false);
param.setOmittable(true);
oper.addParameter(param);
param = new org.apache.axis.description.ParameterDesc(new javax.xml.namespace.QName("", "arg2"), org.apache.axis.description.ParameterDesc.IN, new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "string"), java.lang.String.class, false, false);
param.setOmittable(true);
oper.addParameter(param);
oper.setReturnType(new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "string"));
oper.setReturnClass(java.lang.String.class);
oper.setReturnQName(new javax.xml.namespace.QName("", "return"));
oper.setStyle(org.apache.axis.constants.Style.WRAPPED);
oper.setUse(org.apache.axis.constants.Use.LITERAL);
oper.addFault(new org.apache.axis.description.FaultDesc(
new javax.xml.namespace.QName("发布的wsdl里的targetNamespace里的url", "Exception"),
"Exception",
new javax.xml.namespace.QName("发布的wsdl里的targetNamespace里的url", "Exception"),
true
));
call.setOperation( oper );
call.setOperationName(new javax.xml.namespace.QName("发布的wsdl里的targetNamespace里的url", "opName"));
//调用Web Service,传入参数
String res = ( String ) call.invoke( new Object[]("arg0","arg1"));
System.out.println("===============");
return res;

/**
* @param args
*/
public static void main(String[] args)
try
System.out.println(getResult());
catch (MalformedURLException e)
e.printStackTrace();
catch (RemoteException e)
e.printStackTrace();
catch (ServiceException e)
e.printStackTrace();
catch (SOAPException e)
e.printStackTrace();




2、利用Eclipse自动生成WebService client代码就容易多了:(由于还不会发图片,就用语言描述了,大家酬和看吧。。。)
首先,new project,选择other,在输入框中输入Web Service Client,选中搜索后的结果,点击Next,在Service definition中输入 WebService的发布地址,点击Finish
这样,WebService Client代码已经生成好了。
接下来写一个Test类,在main函数中输入如下代码:

String endpoint = "服务器的WebService的地址";
YourWebServiceNameProxy umsp = new YourWebServiceNameProxy (endpoint);
try
String resultStr = umsp.opMethod("arg0","arg1");
System.out.println(resultStr);
catch (Exception e)
System.out.println("异常");
e.printStackTrace();
catch (RemoteException e)
System.out.println("RemoteException异常");
e.printStackTrace();

如果还有疑问的话还有视频,如果对你有帮助请采纳!
参考技术A Java通过WSDL文件来调用webservice:

注意,以下的代码并没有经过真正的测试,只是说明这些情况,不同版本的Axis相差很大,大家最好以apache网站上的例子为准,这里仅仅用于说明其基本用法。
1,直接AXIS调用远程的web service
这种方法比较适合那些高手,他们能直接看懂XML格式的WSDL文件,我自己是看不懂的,尤其我不是专门搞这行的,即使一段时间看懂,后来也就忘记了。直接调用模式如下:
import java.util.Date;
import java.text.DateFormat;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import javax.xml.namespace.QName;
import java.lang.Integer;
import javax.xml.rpc.ParameterMode;

public class caClient

public static void main(String[] args)

try
String endpoint = "http://localhost:8080/ca3/services/caSynrochnized?wsdl";
//直接引用远程的wsdl文件
//以下都是套路
Service service = new Service();
Call call = (Call) service.createCall();
call.setTargetEndpointAddress(endpoint);
call.setOperationName("addUser");//WSDL里面描述的接口名称
call.addParameter("userName", org.apache.axis.encoding.XMLType.XSD_DATE,
javax.xml.rpc.ParameterMode.IN);//接口的参数
call.setReturnType(org.apache.axis.encoding.XMLType.XSD_STRING);//设置返回类型

String temp = "测试人员";
String result = (String)call.invoke(new Object[]temp);
//给方法传递参数,并且调用方法
System.out.println("result is "+result);

catch (Exception e)
System.err.println(e.toString());



2,直接SOAP调用远程的webservice
这种模式我从来没有见过,也没有试过,但是网络上有人贴出来,我也转过来
import org.apache.soap.util.xml.*;
import org.apache.soap.*;
import org.apache.soap.rpc.*;

import java.io.*;
import java.net.*;
import java.util.Vector;

public class caService
public static String getService(String user)
URL url = null;
try
url=new URL("http://192.168.0.100:8080/ca3/services/caSynrochnized");
catch (MalformedURLException mue)
return mue.getMessage();

// This is the main SOAP object
Call soapCall = new Call();
// Use SOAP encoding
soapCall.setEncodingStyleURI(Constants.NS_URI_SOAP_ENC);
// This is the remote object we're asking for the price
soapCall.setTargetObjectURI("urn:xmethods-caSynrochnized");
// This is the name of the method on the above object
soapCall.setMethodName("getUser");
// We need to send the ISBN number as an input parameter to the method
Vector soapParams = new Vector();

// name, type, value, encoding style
Parameter isbnParam = new Parameter("userName", String.class, user, null);
soapParams.addElement(isbnParam);
soapCall.setParams(soapParams);
try
// Invoke the remote method on the object
Response soapResponse = soapCall.invoke(url,"");
// Check to see if there is an error, return "N/A"
if (soapResponse.generatedFault())
Fault fault = soapResponse.getFault();
String f = fault.getFaultString();
return f;
else
// read result
Parameter soapResult = soapResponse.getReturnValue ();
// get a string from the result
return soapResult.getValue().toString();

catch (SOAPException se)
return se.getMessage();



3,使用wsdl2java把WSDL文件转成本地类,然后像本地类一样使用,即可。
这是像我这种懒人最喜欢的方式,仍然以前面的global weather report为例。
首先 java org.apache.axis.wsdl.WSDL2Java http://www.webservicex.net/globalweather.asmx.WSDL
原本的网址是http://www.webservicex.net/globalweather.asmx?WSDL,中间个各问号,但是Linux下面它不能解析,所以去掉问号,改为点号。
那么就会出现4个文件:
GlobalWeather.java GlobalWeatherLocator.java GlobalWeatherSoap.java GlobalWeatherSoapStub.java
其中GlobalWeatherSoap.java是我们最为关心的接口文件,如果你对RMI等SOAP实现的具体细节不感兴趣,那么你只需要看接口文件即可,在使用的时候,引入这个接口即可,就好像使用本地类一样。
参考技术B

Java通过WSDL文件来调用webservice直接调用模式如下:

import java.util.Date;

import java.text.DateFormat;

import org.apache.axis.client.Call;

import org.apache.axis.client.Service;

import javax.xml.namespace.QName;

import java.lang.Integer;

import javax.xml.rpc.ParameterMode;

public class caClient

public static void main(String[] args)

try

String endpoint = "http://localhost:8080/ca3/services/caSynrochnized?wsdl";

//直接引用远程的wsdl文件

//以下都是套路 

Service service = new Service();

Call call = (Call) service.createCall();

call.setTargetEndpointAddress(endpoint);

call.setOperationName("addUser");//WSDL里面描述的接口名称

call.addParameter("userName", org.apache.axis.encoding.XMLType.XSD_DATE,

javax.xml.rpc.ParameterMode.IN);//接口的参数

call.setReturnType(org.apache.axis.encoding.XMLType.XSD_STRING);//设置返回类型  

String temp = "测试人员";

String result = (String)call.invoke(new Object[]temp);

//给方法传递参数,并且调用方法

System.out.println("result is "+result);

catch (Exception e)

System.err.println(e.toString());


参考技术C http://www.blogjava.net/zjhiphop/archive/2009/04/29/webservice.html
有几种方法

以上是关于java如何通过eclipse安装axis2来调用webservice的主要内容,如果未能解决你的问题,请参考以下文章

Eclipse+Axis2发布WSDL类型的Web Service并用SoapUI测试调用(2021.11.15)

Eclipse+Axis2发布WSDL类型的Web Service并用SoapUI测试调用(2021.11.15)

Eclipse+Axis2发布WSDL类型的Web Service并用SoapUI测试调用(2021.11.15)

如何在eclipse创建基于axis2的webservice服务端

AXIS2远程调用WebService示例(Eclipse+AXIS)

axis2 wsdl生成java文件 参数类型与wsdl定义的不一样