zoukankan      html  css  js  c++  java
  • WebService 学习记录

    -------------------------------------------PS:这个WebService 服务必须一直开着,关闭就没法访问了
    Web Service 教程

    一、webservice介绍

    1.使用场景

    - 不同的移动客户端访问
    - 需要访问第三方的项目

    2.访问第三方应用的方式
    ISO的七层模型 : 物理层、数据链路层、网络层、传输层、表示层、会话层、应用层
    - Socket访问 : Socket属于传输层,它是对Tcp/ip协议的实现,包含TCP/UDP,它是所有通信协议
    的基础,Http协议需要Socket支持,以Socket作为基础
    Socket通信特点:
    1. 开启端口,该通信是 长连接的通信 ,很容易被防火墙拦截,可以通过心跳机制
    来实现 ,开发难度片段
    2. 传输的数据一般是字符串 ,可读性不强
    lj|16|1|60|up
    3. socket端口不便于推广
    http:17.23.23.2:2345 www.jd.com www.360buy.com
    4. 性能相对于其他的通信协议是最优的
    - Http协议访问 :属于应用层的协议,对Socket进行了封装
    1. 跨平台
    2. 传数据不够友好 :
    get请求: http://127.0.0.1:8888?username=lj&pwd=1234
    3. 对第三方应用提供的服务,希望对外暴露服务接口

    问题:
    1. 数据封装不够友好 :可以用xml封装数据
    2. 希望给第三方应用提供web方式的服务 (http + xml) = web Service

    - Webservice
    1.webService介绍

    2.webservice的规则
    - xml
    - soap :(simple object access 协议) :简单对象访问协议
    - wsdl : webservice描述语言 ,它也是xml实现的
    3.webservice的优点

    4.webservice专业名称
    1. xml
    2. wsdl
    3. soap

    二、调用第三方的WS服务

    1.体验webservice www.webxml.com.cn

    2.准备客户端,调用第三方的webservice服务,让本项目有手机查号的功能
    - 一般访问方式 HttpClient
    1. Http-GET //Soap 1.2不带支持低版本 所以一本用soap 1.1
    2. Http-Post
    3. Soap (http+xml)
    问题:1. 如何解析结果


    2. 如何传递对象参数

    - 推荐的访问方式
    在jdk 1.6 版本以后 ,通过jax-ws 包提供对webservice的支持
    - 该方式通过注解的方式来声明webservice
    - 通过 jdk EndPoint.publish()发布webserive服务

    早期的版本 : jax-rpc (remote produce call)

    webservice 纳入 w3c规范,其他的平台都支持该规范 :JEEPhp.NET
    都支持wsimport 方式 : 对远程的webservice生成本地代理,再通过本地代理
    来访问webservice!!!!!!!
    - wsimport 命令的位置:
    C:Program FilesJavajdk1.7.0_04in
    - 要求:
    1. jdk的 版本要在 jdk 1.6.21及以上
    2. 操作系统安装的jdk版本 与 MyEclispe 及 默认指定的版本要一致

    - wsimport使用:
    记得设置jdkin 环境变量 指定path
    语法 wsimport [opations] <wsdl_uri>
    - wsdl_uri:wsdl 的统一资源标识符
    - d :指定要输出的文件的位置
    - s :表示要解析java的源码 ,默认解析出的是class字节码
    - p : 指定输出的包名
    ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    1.调用webService:不论是php,.net 、java  都会使用本地代理

    2. Java 使用的是  

    wsimport -s ./ -p cn.it.ws.c http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?WSDL    获取服务然后调用

     

    -----------------------------------------------------------发布WebService----------------------------------------------------------------------------------------

    PS:WebService 是的发布是Java JDK中的一种,SE中的一种

    PS:如果多次指定报错,就要这样添加注释

    package bee.test;

    import javax.jws.WebMethod;
    import javax.jws.WebParam;
    import javax.jws.WebResult;
    import javax.jws.WebService;
    import javax.xml.ws.Endpoint;

    import bee.model.Phone;
    @WebService (serviceName="PhoneManager",//修改服务名
    targetNamespace="http://bee.test") //修改命名空间 ,默认包名,取反
    public class PhoneService {
    @WebMethod(operationName="getMObileInfo")
    public @WebResult(name="phone") Phone getPhoneInfo(@WebParam(name="osName")String osName){
    Phone phone=new Phone();
    if(osName.endsWith("android")){
    phone.setName("android");phone.setOwner("google");phone.setTotal(80);
    }else if(osName.endsWith("ios")){
    phone.setName("ios");phone.setOwner("apple");phone.setTotal(15);
    }else{
    phone.setName("windows phone");phone.setOwner("microsoft");phone.setTotal(5);
    }
    return phone;
    }

    public static void main(String[] args) {
    String address1="http://127.0.0.1:8888/ws/phoneService";
    Endpoint.publish(address1, new PhoneService());
    System.out.println("wsdl地址 :"+address1+"?WSDL");
    }
    }



    三、自定义及发布一个webservice服务
    - 声明 某个业务服务为webservice服务
    通过@webservice 注解来声明
    - 发布webservice服务
    Endpoint.publish()发布
    - 通过wsimport生成本地代理来访问自己发布的webservice
    wsimport


    四、webservice传输实体对象

    五、练习:


    1. 调用教师机的ws服务
    步骤:
    1. 系统jdk环境与myeclipse jdk 环境一致 ,1.6.021以上
    2. 知道服务端的WDSL路径
    http://192.168.114.10:8888/ws/phoneService?WSDL
    3. 命令行 wsimport -s ./ -p cn.itcast.ws.d http://192.168.114.10:8888/ws/phoneService?WSDL
    4. 导入通过wsimport 解析的java类,再编写一个main测试
    MoblieOsInfoService ws=new MoblieOsInfoService();
    MoblieOsInfo phoneServicePort = ws.getMoblieOsInfoPort()
    PhoneOs phone=phoneServicePort.getMobileOsInfo("android");

    2. 创建自己的ws服务并发布、调用
    步骤: 1.声明webservice服务 (@webService)2. 发布webservice(EndPoint.publish) 3. 客户端访问(wsimport)
    1. 创建一个要通过webservice对外发布的java bean : PhoneService
    2. 在java 的入口main方法 通过EndPoint 发布一个服务端点
    String address1="http://192.168.19.10:8888/ws/phoneService";
    Endpoint.publish(address1, new PhoneService());
    System.out.println("adrress1的WSDL地址"+address1+"?WSDL");


    六、WSDL文件介绍 :webservice服务说明


    七、通过注解配置修改wsdl文件, 让它具有更好的可读性
    需求:
    1. 想改方法的输入参数名、返回参数名
    2. 想改服务名,方法名
    3. 对该业务类的某些方法不想对外发布
    - 默认只有public 修饰的方法会以webservice的形式对外发布
    而 private 受保护的,缺省的,都不会发布
    - 某些public 方法也不想对外发布

    实现:注解配置修改wsdl文件

    重点:
    1. webservice 的作用、规则、优点
    2. 专业名词
    wsdl 、 soap 、 xml
    3. wsimport 生成本地代理
    4. 通过JEE方式声明与发布webservice
    - 声明 :@webservice
    - 发布 :EndPoint
    5. WSDL文件描述
    6. 通过修改注解,配置wsdl文件,增强可读性

    -------------------------------------------------------------------------------------------------------------------------------------------

    通过Jdk
    声明 :@Webservice
    发布 :EndPoint
    不足: 希望tomcat启动时,webservice服务能够开启 ,最好与Spring集成
    希望有一个webservice的服务列表
    通过Webservice框架来实现 :axis2 、xfire


    四、使用CXF框架,发布webservice服务,并使用客户端远程访问webservice
    1. CXF介绍 :soa的框架
    * cxf 是 Celtrix (ESB框架)和 XFire(webserivice) 合并而成,并且捐给了apache
    * CxF的核心是org.apache.cxf.Bus(总线),类似于Spring的 ApplicationContext
    * CXF默认是依赖于Spring的
    * Apache CXF 发行包中的jar,如果全部放到lib中,需要 JDK1.6 及以上,否则会报JAX-WS版本不一致的问题
    * CXF 内置了Jetty服务器 ,它是servlet容器,好比tomcat
    2.CXF特点
    1. 与Spring、Servlet做了无缝对接,cxf框架里面集成了Servlet容器Jetty
    2. 支持注解的方式来发布webservice
    3. 能够显示一个webservice的服务列表
    4. 能够添加拦截器:输入拦截器、输出拦截器 :
    输入日志信息拦截器、输出日志拦截器、用户权限认证的拦截器

    ---------------------------------------------WebService传输时xml,    RestFul是传输json---------------------------------------------------------------

    PS:打Jar 包


    五、Spring+CXF整合来管理webservice

    /**通过cxf框架发布webservice
    * 1. ServerFactoryBean
    * - 不设置注解也可以发布webservice服务, 不支持注解
    * - 不支持拦截器的添加
    * 2. JaxWsServerFactoryBean   常使用这个
    * - 支持注解
    * - 可以添加拦截器
    * 3. webservice 访问流程:
    * 1. 检测本地代理描述的wsdl是否与服务端的wsdl一致 ,俗称为握手
    * 2. 通过soap协议实现通信 ,采用的是post请求 , 数据封装在满足soap规约的xml中
    * 3. 返回数据 同样采用的是soap通信, 数据封装在满足soap规约的xml中
    * @param args

    Inbound Message
    ----------------------------
    ID: 5
    Address: http://127.0.0.1:9999/ws/cxf/languangeService?WSDL
    Http-Method: GET
    Content-Type:
    Headers: {Accept=[text/html, image/gif, image/jpeg, *; q=.2, *//**; q=.2], connection=[keep-alive], Content-Type=[null], Host=[127.0.0.1:9999], User-Agent=[Java/1.7.0_51]}
    --------------------------------------
    七月 17, 2017 7:34:25 下午 org.apache.cxf.interceptor.AbstractLoggingInterceptor log
    信息: Inbound Message
    ----------------------------
    ID: 6
    Address: http://127.0.0.1:9999/ws/cxf/languangeService
    Encoding: UTF-8
    Http-Method: POST
    Content-Type: text/xml; charset=UTF-8
    Headers: {Accept=[text/xml, multipart/related], connection=[keep-alive], Content-Length=[208], content-type=[text/xml; charset=UTF-8], Host=[127.0.0.1:9999], SOAPAction=[""], User-Agent=[JAX-WS RI 2.2.4-b01]}
    Payload: <?xml version="1.0" ?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Body><ns2:getLanguage xmlns:ns2="http://a.cxf.ws.it.cn/"><position>1</position></ns2:getLanguage></S:Body></S:Envelope>
    --------------------------------------
    七月 17, 2017 7:34:25 下午 org.apache.cxf.interceptor.AbstractLoggingInterceptor log
    信息: Outbound Message
    ---------------------------
    ID: 6
    Encoding: UTF-8
    Content-Type: text/xml
    Headers: {}
    Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns2:getLanguageResponse xmlns:ns2="http://a.cxf.ws.it.cn/"><language>java</language></ns2:getLanguageResponse></soap:Body></soap:Envelope>
    --------------------------------------


    public static void main(String[] args) {
    LanguageService languageService=new LanguageServiceImpl();
    ServerFactoryBean bean=new ServerFactoryBean();
    //Endpoint :地址 , 实现对象
    bean.setAddress("http://192.168.114.10:9999/ws/cxf/languangeService");
    bean.setServiceClass(LanguageService.class);//对外提供webservcie的业务类或者接口
    bean.setServiceBean(languageService);//服务的实现bean
    bean.create();//创建,发布webservice
    System.out.println("wsdl地址:http://192.168.114.10:9999/ws/cxf/languangeService?WSDL");
    }
    */
    public static void main(String[] args) {
    LanguageService languageService=new LanguageServiceImpl();
    JaxWsServerFactoryBean bean=new JaxWsServerFactoryBean();
    //Endpoint :地址 , 实现对象
    bean.setAddress("http://127.0.0.1:9999/ws/cxf/languangeService");
    bean.setServiceClass(LanguageService.class);//对外提供webservcie的业务类或者接口
    bean.setServiceBean(languageService);//服务的实现bean
    //添加输入拦截器 :输入显示日志信息的拦截器
    bean.getInInterceptors().add(new LoggingInInterceptor());
    //添加输出拦截器 :输出显示日志信息的拦截器
    bean.getOutInterceptors().add(new LoggingOutInterceptor());

    bean.create();//创建,发布webservice
    System.out.println("wsdl地址:http://127.0.0.1:9999/ws/cxf/languangeService?WSDL");
    }

     


    实现步骤:
    1. 添加cxf.jar 包(集成了Spring.jar、servlet.jar ),spring.jar包 ,servlet.jar 包
    2. 编写业务类,通过CXF来发布webservice
    员工管理:
    方法 :添加员工、查询员工

    3. 添加一个CXF请求的 Servlet,用来处理webservice的请求
    过滤的地址/ws/*
    4. 配置Spring的配置文件: applicationContext.xml ,把cxf的bean在spring配置

    5. 在web.xml中配置 CXF的 Servlet , 添加spring的监听

    6. 通过wsimport生成本地代理 ,访问webservice

    六、 练习:
    Spring与CXF整合
    - 添加 cxf.jar、添加Spring框架、Servlet.jar包
    - web.xml 配置
    1. 配置CXF的Servlet,用来处理所有 webservice请求
    配置Servlet
    <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
    <url-pattern>/ws/*</url-pattern>
    2. 加载spring监听器
    - 业务类,通过cxf发布的webservice的业务bean
    员工管理webservice服务
    1. 添加员工
    2. 查询所有员工
    3. 通过List<Employee> 来保存员工
    - spring 配置文件配置bean
    配置cxf
    - 客户端访问
    测试

    1.web.xml

    2. 就这两个就可以了,Tomcat启动的时候服务就布上去了

    --------------------------------------------------------------------------------------------------------

    七、webservice测试工具
    web service exprlorer

    八、soap1.1与soap1.2区别

    - Soa :面向服务的架构,它是一种思想
    service 1、service2 、service3 所有服务面向web,即插即用
    IBM大力提倡Soa架构 ,希望以组装电脑的方式来开发软件
    - 提供各种服务的组件(webservice):硬盘、cpu 、内存条
    - 企业服务总线 (Enterprise service bus):主板

  • 相关阅读:
    CentOS7 防火墙firewalld详细操作
    bootstrap-datetimepicker 滚动错位问题
    Contos更换python版本
    centos7.3下使用yum 安装pip
    备注
    jenkins与SVN 问题记录
    kafka配置
    Jenkins 与github配置
    nginx File not found 错误
    nginx 总结
  • 原文地址:https://www.cnblogs.com/bee-home/p/7197372.html
Copyright © 2011-2022 走看看