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

几种常用的webService开发

发布时间:2020-12-16 23:53:00 所属栏目:安全 来源:网络整理
导读:? ???? 一、利用jdk web服务api实现,这里使用基于 ?SOAP message? 的 ?Web? 服务 ???? 1.首先建立一个 Web services EndPoint: package ?Hello;??? import ?javax.jws.WebService;??? ?javax.jws.WebMethod;??? ?javax.xml.ws.Endpoint;??? ?? @WebService
?
????
一、利用jdk web服务api实现,这里使用基于
?SOAP message??Web?服务
???? 1.首先建立一个Web services EndPoint:

package ?Hello;???

import ?javax.jws.WebService;???

?javax.jws.WebMethod;???

?javax.xml.ws.Endpoint;???

??

@WebService??

public ? class ?Hello? {??

?

@WebMethod??

public?String?hello(String?name)?{???

return?"Hello,?+?name?n;???

}
???

????

?
staticvoid?main(String[]?args)?{???

???
//?create?and?publish?an?endpoint???

???????Hello?hello?=new?Hello();???

???????Endpoint?endpoint?
?Endpoint.publish(http://localhost:8080/hello,?hello);????

????????}
???

}
?

?????? ? 2. 使用?apt?编译?Hello.java(例:apt -d?[存放编译后的文件目录] Hello.java?)?,会生成 jaws目录
????3.使用java Hello.Hello运行,然后将浏览器指向http://localhost:8080/hello?wsdl就会出现下列显示
?


?? 4.使用wsimport 生成客户端??
????
???? 使用如下:wsimport?-p?.?-keep?http://localhost:8080/hello?wsdl

??? 这时,会在当前目录中生成如下文件:

?????????

?
?????? 5.客户端程序:
??????
1

?HelloClient {???
2

?main(String?args[])?3

??HelloService?service?
?HelloService();???
4

??Hello?helloProxy?
?service.getHelloPort();???
5

??String?hello?
?helloProxy.hello("你好);??????????
6

??System.out.println(hello);???
7

??}
???
8

}

9

??
???? 以上方法还稍显繁琐,还有更加简单的方法
二、使用xfire,我这里使用的是myeclipse集成的xfire进行测试的
??? 利用xfire开发WebService,可以有三种方法:
????? 1一种是从javabean 中生成;
????? 2 一种是从wsdl文件中生成;
??????3 还有一种是自己建立webservice
??? 步骤如下:
????用myeclipse建立webservice工程,目录结构如下:
?

??? 首先建立webservice接口,
?????代码如下:

?????

1

?com.myeclipse.wsExample;
2

// Generated?by?MyEclipse 3 4

interface ?IHelloWorldService? {

????

????
?String?example(String?message);

}
????? 接着实现这个借口:
?1

?2 ?3 ?4

?HelloWorldServiceImpl? implements ?IHelloWorldService? ?5?6

????
?String?example(String?message)??7

????????
?message;
?8

????}

?910???修改service.xml?文件,加入以下代码:
?
< service >

????????
name HelloWorldService </ serviceClass

????????????com.myeclipse.wsExample.IHelloWorldService
?5 ?6 implementationClass ?7

????????????com.myeclipse.wsExample.HelloWorldServiceImpl
?8 ?9 style wrapped 10 use literal 11 scope application 12

????
>
?把整个项目部署到tomcat服务器中?,打开浏览器,输入 http://localhost:8989/HelloWorld/services/HelloWorldService?wsdl ,可以看到如下:?
????

?然后再展开HelloWorldService后面的wsdl可以看到:
客户端实现如下:
?com.myeclipse.wsExample.client;


?java.net.MalformedURLException;
?java.net.URL;
?org.codehaus.xfire.XFireFactory;
?org.codehaus.xfire.client.Client;
?org.codehaus.xfire.client.XFireProxyFactory;
?org.codehaus.xfire.service.Service;
?org.codehaus.xfire.service.binding.ObjectServiceFactory;
?com.myeclipse.wsExample.IHelloWorldService;
13 14

?HelloWorldClient? 15

?main(String[]?args)?throws?MalformedURLException,?Exception?16

?TODO?Auto-generated?method?stub17Service?s?ObjectServiceFactory().create(IHelloWorldService.class);
18

XFireProxyFactory?xf
?XFireProxyFactory(XFireFactory.newInstance().getXFire());
19

String?url
http://localhost:8989/HelloWorld/services/HelloWorldService;
20


21try22

????????
{????????????
23

????????????
24

????????????IHelloWorldService?hs
(IHelloWorldService)?xf.create(s,url);
25

????????????String?st
hs.example(zhangjin26

????????????System.out.print(st);
27

????????}
28catch(Exception?e)
29

????????
30

????????????e.printStackTrace();
3132333435 ?????? 这里再说点题外话,有时候我们知道一个wsdl地址,比如想用java客户端引用.net?做得webservice,使用myeclipse引用,但是却出现无法通过验证的错误,这时我们可以直接在类中引用,步骤如下:
????????
?1

static void ?main(String[]?args)? throws ?2?3????????Service?s?4

????????XFireProxyFactory?xf

????????
//远程调用.net开发的webserviceClient?c?Client(?URL(http://www.webxml.com.cn/webservices/qqOnlineWebService.asmx?wsdl));

????????Object[]?o
c.invoke(qqCheckOnline?String[]{531086641591284436}11调用.net本机开发的webservice12Client?c1http://localhost/zj/Service.asmx?wsdl13

Object[]?o1
c1.invoke(HelloWorld?String[]{}14三、使用axis1.4调用webservice方法
???前提条件:下载axis1.4包和tomcat服务器???,并将axis文件夹复制到tomcat服务器的webapp文件夹中

?? 这里我就说一下最简单的方法:
???????? 首先建立一个任意的java类(例如:HelloWorld.java),复制到axis文件夹下,将其扩展名改为jws,然后重新启动tomcat,在浏览器中输入 http://localhost:8989/axis/HelloWorld.jws?wsdl ,就会得到一个wsdl文件,其客户端调用方法如下:
??
?javax.xml.rpc.Service;
?javax.xml.rpc.ServiceException;
?javax.xml.rpc.ServiceFactory;
?java.rmi.RemoteException;
?javax.xml.namespace.QName;

?TestHelloWorld?

????
????????

????????String?wsdlUrl?
http://localhost:8989/axis/HelloWorld.jws?wsdl

????????String?nameSpaceUri?
http://localhost:8989/axis/HelloWorld.jws

????????String?serviceName?
HelloWorldService

????????String?portName?

????????ServiceFactory?serviceFactory?
?ServiceFactory.newInstance();

????????Service?afService?
serviceFactory.createService(?URL(wsdlUrl),0)">?QName(nameSpaceUri,?serviceName));

????????HelloWorldInterface?proxy?
?(HelloWorldInterface)afService.getPort(

????????System.out.println(
return?value?is?proxy.getName(john)?)?;
30 四、使用axis2开发webservice(这里首先感谢李宁老师)????
? 使用axis2 需要先下载?

?? axis2-1.4.1-bin.zip

?? axis2-1.4.1-war.zip

?? http://ws.apache.org/axis2/ ???
? 同理,也需要将axis2复制到webapp目录中

在axis2中部署webservice有两种方法,
??? 第一种是pojo方式,这种方式比较简单,但是有一些限制,例如部署的类不能加上包名
??? 第二种方式是利用xml发布webservice,这种方法比较灵活,不需要限制类的声明
??? 下面分别说明使用方法:
??? 1.pojo方式: Axis2 中不需要进行任何的配置,就可以直接将一个简单的 POJO 发布成 WebService 。其中 中所有的 public 方法将被发布成 方法。先实现一个pojo类:
?
?1

?HelloWorld ?String?getName(String?name)

????
你好??name;
????
int?add(?a,0)">?b)

????
?ab;

???由于这两个方法都是public类型,所以都会发布成webservice。 编译 HelloWorld 类后,将 HelloWorld.class 文件放到%tomcat% webappsaxis2WEB-INFpojo 目录中(如果没有 pojo 目录,则建立该目录),然后打开浏览器进行测试:
输入一下url:?

http://localhost:8080/axis2/services/listServices

会列出所有webservice
?

?
这是其中的两个webservice列表,接着,在客户端进行测试:
首先可以写一个封装类,减少编码,代码如下:
??
??
?MZ.GetWebService;
?org.apache.axis2.AxisFault;
?org.apache.axis2.addressing.EndpointReference;
?org.apache.axis2.client.Options;
?org.apache.axis2.rpc.client.RPCServiceClient;

?GetWSByAxis2?

??????
private?String?EndPointUrl;
?String?QUrlhttp://ws.apache.org/axis2?QName?opAddEntry;?
?String?WSUrl;
?RPCServiceClient?setOption()??AxisFault

??????

??????????RPCServiceClient?serviceClient?
?RPCServiceClient();

??????????Options?options?
?serviceClient.getOptions();

??????????EndpointReference?targetEPR?
?EndpointReference(WSUrl);

??????????options.setTo(targetEPR);

??????????
?serviceClient;

??????}

??????

??????
?QName?getQname(String?Option)

??????????
?QName?(QUrl,Option);

?
返回String???????String?getStr(String?Option)?

??????
this.setOption();?

?????

??????????opAddEntry?
.getQname(Option);
35

?????????String?str?
?(String)?serviceClient.invokeBlocking(opAddEntry,?
36

??????????????????????????
?Object[]?Class[]{String.?})[0];
37

?????????
?str;
38

?????}
39?返回一维String数组40?String[]?getArray(String?Option)?41

??????
4243444546

?????????String[]?strArray?
?(String[])?serviceClient.invokeBlocking(opAddEntry,128)">47

??????????????????????????
?Object[]?Class[]{String[].48?strArray;
4950从WebService中返回一个对象的实例51??????Object?getObject(String?Option,Object?o)?52

?????
{?
53

????????RPCServiceClient?serviceClient?
54

?????????QName?qname
55

?????????Object?object?
?serviceClient.invokeBlocking(qname,0)">?Object[]?Class[]{o.getClass()}56?object;
575859/////////////////////////////////////////???????读者可以自己封装数据类型,如int,byte,float等数据类型60

}
61 客户端调用方法:
MZ.GetWebService.GetWSByAxis2?ws
= new ?MZ.GetWebService.GetWSByAxis2();

ws.WSUrl
" http://localhost:8989/axis2/services/HelloWorld ;

HelloWorld?hello
?(HelloWorld)ws.getObject( getName );

????????????

???????????

?System.out.println(hello.getName(
zhangjin ));

???? 2.使用service.xml发布webservice, 这种方式和直接放在pojo目录中的POJO类不同。要想将MyService类发布成Web Service,需要一个services.xml文件,这个文件需要放在META-INF目录中,该文件的内容如下:
service?name HelloWorld

????
description

????????HelloWorld?webservice

????
parameter?name ServiceClass

????????service.HelloWorld??

????
parameter messageReceivers

????????
messageReceiver?mep http://www.w3.org/2004/08/wsdl/in-out

????????????
org.apache.axis2.rpc.receivers.RPCMessageReceiver /> http://www.w3.org/2004/08/wsdl/in-only org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver



其中<service>元素用于发布Web Service,一个<service>元素只能发布一个WebService类,name属性表示WebService名,如下面的URL可以获得这个WebServiceWSDL内容:
http://localhost:8080/axis2/services/myService?wsdl
? 除此之外,还有直接可以在其中制定webservice操作方法:可以这样些service.xml文件

???????HelloWorld?service

????????service.HelloWorld??
operation?name messageReceiver? operation add messageReceiver

????????????
15 16 如果要发布多个webservice,可以在文件两段加上 < serviceGroup><service></service>...<service></service></serviceGroup>发布

(编辑:李大同)

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

    推荐文章
      热点阅读