如何调用webservice接口
ava调用WebService可以直接使用Apache提供的axisjar自己编写代码,或者利用Eclipse自动生成WebService Client代码,利用其中的Proxy类进行调用。理论上是一样的,只不过用Eclipse自动生成代码省事些。
1、编写代码方式:
package comyuduntest;
import javarmiRemoteException;
import orgapacheaxisclientCall;
import orgapacheaxisclientService;
import orgapacheaxismessagePrefixedQName;
import orgapacheaxismessageSOAPHeaderElement;
import comcezannegoldenuserException;
import comcezannegoldenuserUserManagerServiceProxy;
import javaxxmlnamespaceQName;
import javanetMalformedURLException;
import javaxxmlrpcServiceException;
import javaxxmlsoapName;
import javaxxmlsoapSOAPException;
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) servicecreateCall();
//将Web Service的服务路径加入到call实例之中
callsetTargetEndpointAddress( new javanetURL(endpoint) );//为Call设置服务的位置
// 由于需要认证,故需要设置调用的SOAP头信息。
Name headerName = new PrefixedQName( new QName("发布的wsdl里的targetNamespace里的url", "string_itemName") );
orgapacheaxismessageSOAPHeaderElement header = new SOAPHeaderElement(headerName);
headeraddTextNode( "blablabla" );
calladdHeader(header);
// SOAPHeaderElement soapHeaderElement = new SOAPHeaderElement("发布的wsdl里的targetNamespace里的url", "SoapHeader");
// soapHeaderElementsetNamespaceURI("发布的wsdl里的targetNamespace里的url");
// try
// {
// soapHeaderElementaddChildElement("string_itemName")setValue("blablabla");
// }
// catch (SOAPException e)
// {
// eprintStackTrace();
// }
// calladdHeader(soapHeaderElement);
//调用Web Service的方法
orgapacheaxisdescriptionOperationDesc oper;
orgapacheaxisdescriptionParameterDesc param;
oper = new orgapacheaxisdescriptionOperationDesc();
opersetName("opName");
param = new orgapacheaxisdescriptionParameterDesc(new javaxxmlnamespaceQName("", "arg0"), orgapacheaxisdescriptionParameterDescIN, new javaxxmlnamespaceQName("http://wwww3org/2001/XMLSchema", "string"), javalangStringclass, false, false);
paramsetOmittable(true);
operaddParameter(param);
param = new orgapacheaxisdescriptionParameterDesc(new javaxxmlnamespaceQName("", "arg1"), orgapacheaxisdescriptionParameterDescIN, new javaxxmlnamespaceQName("http://wwww3org/2001/XMLSchema", "string"), javalangStringclass, false, false);
paramsetOmittable(true);
operaddParameter(param);
param = new orgapacheaxisdescriptionParameterDesc(new javaxxmlnamespaceQName("", "arg2"), orgapacheaxisdescriptionParameterDescIN, new javaxxmlnamespaceQName("http://wwww3org/2001/XMLSchema", "string"), javalangStringclass, false, false);
paramsetOmittable(true);
operaddParameter(param);
opersetReturnType(new javaxxmlnamespaceQName("http://wwww3org/2001/XMLSchema", "string"));
opersetReturnClass(javalangStringclass);
opersetReturnQName(new javaxxmlnamespaceQName("", "return"));
opersetStyle(orgapacheaxisconstantsStyleWRAPPED);
opersetUse(orgapacheaxisconstantsUseLITERAL);
operaddFault(new orgapacheaxisdescriptionFaultDesc(
new javaxxmlnamespaceQName("发布的wsdl里的targetNamespace里的url", "Exception"),
"Exception",
new javaxxmlnamespaceQName("发布的wsdl里的targetNamespace里的url", "Exception"),
true
));
callsetOperation( oper );
callsetOperationName(new javaxxmlnamespaceQName("发布的wsdl里的targetNamespace里的url", "opName"));
//调用Web Service,传入参数
String res = ( String ) callinvoke( new Object[]("arg0","arg1"));
Systemoutprintln("===============");
return res;
}
/
@param args
/
public static void main(String[] args) {
try {
Systemoutprintln(getResult());
} catch (MalformedURLException e) {
eprintStackTrace();
} catch (RemoteException e) {
eprintStackTrace();
} catch (ServiceException e) {
eprintStackTrace();
} catch (SOAPException e) {
eprintStackTrace();
}
}
}
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 = umspopMethod("arg0","arg1");
Systemoutprintln(resultStr);
} catch (Exception e) {
Systemoutprintln("异常");
eprintStackTrace();
} catch (RemoteException e) {
Systemoutprintln("RemoteException异常");
eprintStackTrace();
}
目前对JavaWeb的理解是:用一次提交过程来表示,当点击一个提交的标签<input>。会将url传到tomcat服务器,在tomcat的配置文件中找到管理javaweb项目的配置文件serverxml,在serverxml中配置管理web项目的路径。从当前web项目的路径中找到webxml文件(webxml文件是配置servlet的内容,把网络请求和响应的信息都是放在servlet中的service方法里处理)。在servlet中创建ServletRequest对象和ServletResponse对象,并调用service方法,在service方法中对浏览器做出响应操作。
1:浏览器发出请求: http://localhost:80/day11/hello
2:解析请求信息:
http:协议
localhost:找互联网上的哪一台主机
80: 从主机中找到对应80端口的程序--->Tomcat服务器
/day11: 当期项目的上下文路径
/hello: 当期请求的资源名
3:找到Tomcat根/config/serverxml文件
解析serverxml文件:
判断获取哪一个<Context/>元素的path属性为day11
若找不到:404错误
若 找到:解析该<Context/>元素,得到docBase属性,获取当期访问Web项目的根的绝对路径:
H:\javaPros\Servlet\webapp
4:从H:\javaPros\Servlet\webapp下的WEB-INF下找到webxml文件
判断webxml中是否有<url-pattern>的文本内容为/hello
若找不到:404错误
若 找到:继而可以获取该资源对应Servlet类的全限定名称:com_520it_01_helloHelloServlet
5:判断Servlet实例缓存池中是否有
com_520it_01_helloHelloServlet的对象
Map<String,Servlet> cache = (Tomcat提供的);
key:存Servlet类的全限定名称
value:该Servlet类的对象
Servlet obj = cacheget("com_520it_01_helloHelloServlet");
if(obj==null){
//Servlet实例缓存中没有该类的对象,第一次
GOTO 6:
}else{
//有对象,非第一次
GOTO 8:
}
6:使用反射调用构造器,创建对象
obj = ClassforName("com_520it_01_helloHelloServlet")newInstance();
把当前创建的Servlet对象,存放在缓存之中,供下次使用
cacheput("com_520it_01_helloHelloServlet",obj);
7:创建ServletConfig对象,并调用init方法
objinit(config);
8:创建ServletRequest对象和ServletResponse对象,并调用service方法
objservice(req,resp);
9:在service方法中对浏览器做出响应操作
调用方法大致有三种方法:
1)使用,直接AXIS调用远程的web service
2)直接SOAP调用远程的webservice
3)使用wsdl2java把WSDL文件转成本地类,然后像本地类一样使用,即可。
我一般使用第三种,挺简单的:
比如webservice的代码如下:
@WebService
public class ServiceHello {
/
供客户端调用的方法
@param name
@return String
/
public String getValue(String name){
return "我叫"+name;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Endpointpublish("http://localhost:9001/Service/ServiceHello", new ServiceHello());
Systemoutprintln("service success!");
}
}
1)先建立客户端webservice项目,使用命令将WSDL文件转成本地类,比如:
C:\Users\aiher\Workspaces\MyEclipse 2015\TheClient\src>wsimport -s -p comhyanclient -keep http://localhost:9001/Service/ServiceHellowsdl
2)编写客户端测试类,调用服务端web service接口的某个方法,如下:
public class ServiceTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
ServiceHello hello = new ServiceHelloService()getServiceHelloPort();
String name = hellogetValue("Hyan");
Systemoutprintln("name-:"+name);
}
}
0条评论