java webservice 1(简单搭建服务端、客户端)

阳光穿透心脏的1/2处 2023-10-08 12:38 137阅读 0赞

文章目录

      • 1、webservice 简介
      • 2、CXF 框架(xml调用)
        • 2.1、创建服务端项目,发布xml
        • 2.2、创建客户端项目,解析xml
      • 3、调取别人发布的webservice 思路
      • 4、区别版本

1、webservice 简介

常见的web服务:

  • 天气信息
  • 手机淘宝、京东
  • 股票查询

这些信息都是公开的,服务商家通常会提供一个xml的web信息接口,供开发者调用。

webservice是可以跨语言传送数据的。

Java 中共有三种WebService 规范,分别是JAXM&SAAJ、JAX-WS(JAX-RPC)、JAX-RS。

  • JAXM&SAAJ : 基于javax.messaging.*包 (需要手动下载这个包)
  • JAX-WS(JAX-RPC):基于javax.xml.ws.*包(原生java支持)
  • JAX-RS : 基于java.ws.rs.*包(restful风格)

在这里插入图片描述
我们常用JAX-WS 规范、JAX-RS规范获取数据。

使用JAX-WS 规范涉及的名词:

SOAP协议 = HTTP + XML 数据。
wsdl :是一种 XML 文档,描述某个 Web service。
UDDI : 就是一个目录,这个目录中存放一些关于web服务的信息。

2、CXF 框架(xml调用)

2.1、创建服务端项目,发布xml

先创建一个空项目,再新建一个maven子模块
在这里插入图片描述
填写一下子模块的基本信息,完事下一步就可以
在这里插入图片描述
接下添加依赖

  1. <dependency>
  2. <groupId>org.apache.cxf</groupId>
  3. <artifactId>cxf-rt-frontend-jaxws</artifactId>
  4. <version>3.0.1</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.apache.cxf</groupId>
  8. <artifactId>cxf-rt-transports-http-jetty</artifactId>
  9. <version>3.0.1</version>
  10. </dependency>

在这里插入图片描述

创建一个service:HelloService.java

  1. import javax.jws.WebService;
  2. /**
  3. * 对外发布服务的接口
  4. * **/
  5. @WebService
  6. public interface HelloService {
  7. // 对外发布服务的接口的方法
  8. public String sayHello(String name);
  9. }

HelloServiceImpl.java

  1. public class HelloServiceImpl implements HelloService {
  2. @Override
  3. public String sayHello(String name) {
  4. return name+",hello haha";
  5. }
  6. }

创建Server.java发布项目

  1. import com.haha.service.HelloServiceImpl;
  2. import org.apache.cxf.jaxws.JaxWsServerFactoryBean;
  3. /**
  4. * 发布项目
  5. * **/
  6. public class Server {
  7. public static void main(String[] args) {
  8. // 发布服务的工厂
  9. JaxWsServerFactoryBean f = new JaxWsServerFactoryBean();
  10. // 设置服务地址
  11. f.setAddress("http://localhost:8000/ws/hello");
  12. // 设置服务类
  13. f.setServiceBean(new HelloServiceImpl());
  14. //发布服务
  15. f.create();
  16. System.out.println("发布成功,端口8000。。。");
  17. }
  18. }

在这里插入图片描述
浏览器访问:http://localhost:8000/ws/hello
在这里插入图片描述
访问连接后面加个?wsdl
在这里插入图片描述

2.2、创建客户端项目,解析xml

新建一个模块
在这里插入图片描述
加入依赖

  1. <dependency>
  2. <groupId>org.apache.cxf</groupId>
  3. <artifactId>cxf-rt-frontend-jaxws</artifactId>
  4. <version>3.0.1</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.apache.cxf</groupId>
  8. <artifactId>cxf-rt-transports-http-jetty</artifactId>
  9. <version>3.0.1</version>
  10. </dependency>

然后创建一个与服务端同名、同包路径的接口
HelloService.java

  1. import javax.jws.WebService;
  2. /**
  3. * 对外发布服务的接口
  4. * **/
  5. @WebService
  6. public interface HelloService {
  7. // 对外发布服务的接口的方法
  8. public String sayHello(String name);
  9. }

在这里插入图片描述
然后获取数据Client.java

  1. import com.haha.service.HelloService;
  2. import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
  3. public class Client {
  4. public static void main(String[] args) {
  5. JaxWsProxyFactoryBean f = new JaxWsProxyFactoryBean();
  6. f.setAddress("http://localhost:8000/ws/hello");
  7. f.setServiceClass(HelloService.class);
  8. HelloService helloService = f.create(HelloService.class);
  9. System.out.println(helloService.getClass());
  10. String content = helloService.sayHello("Jet");
  11. System.out.println(content);
  12. }
  13. }

运行
在这里插入图片描述

3、调取别人发布的webservice 思路

使用之前必看:
调用别人的wsdl文件要注意他采用的什么版本,不同的版本采用的jdk版本不同
区别版本请看标题 “4、区别版本”

第一步:使用wsimport生成java接口

wsimport是jdk自带的工具
在这里插入图片描述
wsimport参数:
-keep:是否生成java源文件
-d:指定.class文件的输出目录
-s:指定.java文件的输出目录
-p:定义生成类的包名,不定义的话有默认包名
-verbose:在控制台显示输出信息
-b:指定jaxws/jaxb绑定文件或额外的schemas
-extension:使用扩展来支持SOAP1.2

在cmd输入指令:wsimport -keep -s D:\Workspaces -p com.cn.phone -verbose 接口url
在这里插入图片描述

注意D:\Workspaces需要提前创建好
示例接口地址:http://www.webxml.com.cn/WebServices/IpAddressSearchWebService.asmx?wsdl

下面是生成好的内容
在这里插入图片描述

第二步:新建一个maven项目,导入cxf框架的依赖

  1. <dependency>
  2. <groupId>org.apache.cxf</groupId>
  3. <artifactId>cxf-rt-frontend-jaxws</artifactId>
  4. <version>3.0.1</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.apache.cxf</groupId>
  8. <artifactId>cxf-rt-transports-http-jetty</artifactId>
  9. <version>3.0.1</version>
  10. </dependency>

第三步:创建接口对应的包名(一定要和接口文件里一样),然后将生成的接口放进去
在这里插入图片描述
第四步:创建客户端类

  1. import com.cn.phone.ArrayOfString;
  2. import com.cn.phone.IpAddressSearchWebServiceSoap;
  3. import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
  4. import java.rmi.RemoteException;
  5. public class Client {
  6. public static void main(String[] args) throws RemoteException {
  7. JaxWsProxyFactoryBean f = new JaxWsProxyFactoryBean();
  8. f.setAddress("http://www.webxml.com.cn/WebServices/IpAddressSearchWebService.asmx");
  9. f.setServiceClass(IpAddressSearchWebServiceSoap.class);
  10. IpAddressSearchWebServiceSoap h =f.create(IpAddressSearchWebServiceSoap.class);
  11. // System.out.println(helloService.getClass());
  12. //传参数
  13. // String content = helloService.sayHello("Jet");
  14. ArrayOfString content = h.getCountryCityByIp("183.69.220.193");
  15. System.out.println(content.getString());
  16. }
  17. }

在这里插入图片描述
在执行wsimport中,如果出现undefined simple or complex type ‘soapenc:Array’这样的错误,可能是由于wsdl文档版本过低造成的,可以按照如下例修改

这个问题是版本不同造成的,如下操作不一定能解决问题,建议更换jdk版本

修改前的文档

  1. <s:schema targetNamespace="http://tempuri.org/AbstractTypes">
  2. <s:import namespace="http://schemas.xmlsoap.org/soap/encoding/" />
  3. <s:complexType name="ArrayOfString">
  4. <s:sequence>
  5. <s:element minOccurs="0" maxOccurs="unbounded" name="string" nillable="true" type="s:string" />
  6. </s:sequence>
  7. </s:complexType>
  8. <s:complexType name="StringArray">
  9. <s:complexContent mixed="false">
  10. <s:restriction base="soapenc:Array">
  11. <s:sequence>
  12. <s:element minOccurs="0" maxOccurs="unbounded" name="String" type="s:string" />
  13. </s:sequence>
  14. </s:restriction>
  15. </s:complexContent>
  16. </s:complexType>

修改后的文档

  1. <s:schema targetNamespace="http://tempuri.org/AbstractTypes">
  2. <s:import namespace="http://schemas.xmlsoap.org/soap/encoding/" />
  3. <s:complexType name="ArrayOfString">
  4. <s:sequence>
  5. <s:element minOccurs="0" maxOccurs="unbounded" name="string" nillable="true" type="s:string" />
  6. </s:sequence>
  7. </s:complexType>
  8. </s:schema>

4、区别版本

SOAP协议到目前有两个版本:SOAP1.1和SOAP1.2
区别:

  • 他们的WSDL文件的命名空间是不一样的。
  • SOAP1.1存在SOAPAction的请求头、.SOAP1.2没有SOAPAction的请求头。
  • 在CXF中两种协议请求的方式也不一样。SOAP1.1为content-Type:text/xm;charset=UTF-8、SOAP1.2为content-Type:application/soap+xml;charset=UTF-8。
  • SOAP1.1 对应jdk1.6、SOAP1.2 对应jdk1.8
  • cxf 两个版本都支持

SOAP1.1 的WSDL文件命名空间:

xmlns:soap=“http://schemas.xmlsoap.org/soap/envelope/ “

SOAP1.2 的WSDL文件命名空间:

xmlns:soap=”http://www.w3.org/2003/05/soap-envelope“

在定义Service部分差别如下:
Soap1.1是以:soap:address定义。
Soap1.2是以: soap12:address定义。

jdk1.6不支持Soap1.2形式的访问。

发表评论

表情:
评论列表 (有 0 条评论,137人围观)

还没有评论,来说两句吧...

相关阅读