zoukankan      html  css  js  c++  java
  • webservice基本功能介绍

    WebService, 能使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件, 就可相互交换数据或集成。依据WebService规范实施的应用之间, 无论它们所使用的语言、 平台或内部协议是什么, 都可以相互交换数据,通俗的讲,WebService就是一个向外界暴露出一个能够通过Web进行调用的API。这就是说,你能够用编程的方法通过Web来调用这个应用程序。我们把调用这个WebService 的应用程序叫做客户端,发布这个web服务的机应用程序器称为WebService服务器

     

    webservice有着许多优势:

        1)异构平台的互通性

              理论上, WebService 最大的优势是提供了异构平台的无缝街接技术手段。由于不同的用户使用不同的硬件平台,不同的操作平台,不同的操作系统,不同的软件,不同的协议通信,这就产生了互相通信的需求。 Web Service 使任何两个应用程序,只要能读写XML,那么就能互相通信。

        2)更广泛的软件复用

             软件的复用技术通过组合已有模块来搭建应用程序,能大幅度提高软件的生产效率和质量。用户只要获得了描述 WebService 的 WSDL 文件,就可以方便地生成客户端代理,并通过代理访问 WebService 。

        3)成本低、可读性强、应用范围广

             WebService 可用基于 XML 的 SOAP 来表示数据和调用请求。并且通过 HTTP 协议传输 XML 格式的数据

        4)迅捷的软件发行方式

             WebService 将彻底地改变软件的发行方式。软件供应商可以把软件分解成若WebService 模块构成的系统,直接在 Web 上发布

     

    webservice常用的专业术语:

        1)XML: Extensible Markup Language -扩展性标记语言XML,用于传输格式化的数据,是Web服务的基础。

              • namespace-命名空间。

              • xmlns=“http://asen.cn” 使用默认命名空间。

              • xmlns:itcast=“http://asen.cn”使用指定名称的命名空间。

        2)WSDL:  WebService Description Language – Web服务描述语言。调用该webservice api 的接口描述

              •通过XML形式说明服务在什么地方-地址。

              •通过XML形式说明服务提供什么样的方法 – 如何调用。

        3)SOAP: Simple Object Access Protocol(简单对象访问协议)  

              •SOAP作为一个基于XML语言的协议用于有网上传输数据。

              •SOAP = 在HTTP的基础上+XML数据。

              •SOAP是基于HTTP的。

              •SOAP的组成如下:

                       1. Envelope – 必须的部分。以XML的根元素出现。

                       2. Headers – 可选的。

                       3. Body – 必须的。在body部分,包含要执行的服务器的方法。和发送到服务器的数据。

     

    webservice服务调用方式一:

    通过get调用

     

    public static void get(String mobileCode, String userID){
            
            URL url = null;
            
            try {
                url = new URL("http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx/getMobileCodeInfo?"
                        + "mobileCode=" + mobileCode + "&userID=" + userID);
                
                HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                connection.setRequestMethod("GET");
                
                if(connection.getResponseCode() == HttpURLConnection.HTTP_OK){
                    InputStream is = connection.getInputStream();
                    
                    ByteArrayOutputStream boas=new ByteArrayOutputStream();
                    byte[] buffer=new byte[1024];
                    int len=-1;
                    while((len=is.read(buffer))!=-1){
                        boas.write(buffer, 0, len);
                    }
                    
                    System.out.println("GET请求获取的数据:"+boas.toString());    
                    boas.close();
                    is.close();
                }
                
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
     通过post调用
    public static void post(String mobileCode, String userID){
            HttpClient client = new HttpClient();
            
            PostMethod method = new PostMethod("http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx/getMobileCodeInfo");
            
            method.setParameter("mobileCode", mobileCode);
            method.setParameter("userID", userID);
            
            try {
                int code = client.executeMethod(method);
                
                String result=method.getResponseBodyAsString();
                System.out.println("Post请求的结果:"+result);
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
     通过SOAP1.1方式

     

     webservice服务调用方式二:
    public static void postSoap1() throws Exception {
            // 创建一个post请求,类似Post请求
            PostMethod postMethod = new PostMethod("http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx");
            // 设置传送信息的格式
            postMethod.setRequestHeader("Content-Type","text/xml; charset=utf-8");
            postMethod.setRequestBody(new FileInputStream("C:/a.txt"));
            int code = http.executeMethod(postMethod);
            System.out.println("消息码为:" + code);
            System.out.println("返回的消息为:" + postMethod.getResponseBodyAsString());
            postMethod.releaseConnection();
        }

    通过java方式访问

    这种方式首先要获取wsdl文件.使用JDK1.6以上的版本的wsimport命令,相关命令有

    wsimport -encoding utf-8 -s ./ C:UsersAsenDesktopWeatherWS.asmx.xml
    wsimport -encoding utf-8 -s ./ http://ws.webxml.com.cn/WebServices/WeatherWS.asmx?WSDL

    可以把class文件打成jar包 jar cvf  test.jar 打包目录,拷贝到项目中调参考WSDL用即可调用源码如下:

     

    public static void main(String[] args) {
            MobileCodeWS mobileCodeWs=new MobileCodeWS();
            MobileCodeWSSoap mobileCodeWSSoap=mobileCodeWs.getMobileCodeWSSoap();
            String tel=mobileCodeWSSoap.getMobileCodeInfo("18373551982",null);
            System.out.println(tel);
        }

     

    我们也可以自己创建一个webservice服务

    步骤一:创建一个web服务

    /**
     * 声明:@webservice
     * 发布:EndPoint
     * @author Asen
     *
     */
    @WebService(serviceName="PhoneManager"//修改服务名
                , targetNamespace="http://aa.ws.com.asen")//修改命名空间
    public class PhoneService {
    
        /*
         * @WebParam注解修改参数名
         * @WebResult修改返回参数名字
         */
        @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(15);
            }
            
            return phone;
        }
        
        @WebMethod(exclude=true)//将该方法排除在外
        public void sayHello(String city){
            System.out.println(city);
        }
    }
     步骤二:
    /*
         * 发布webservice
         */
        public static void main(String[] args) {
            String address1="http://localhost:8888/ws/phoneService";
            String address2="http://localhost:8888/ws/phoneManager";
            Endpoint.publish(address1, new PhoneService());
            Endpoint.publish(address2, new PhoneService());
            
            System.out.println("wsld地址:" + address1 + "?WSDL");
        }

     接下来调用即可,对于webservice,Apache开发了一个开源的框架CXF,CXF 帮助您来构建和开发 Services 这些 Services 可以支持多种协议,比如:SOAP、POST/HTTP、RESTful HTTP CXF 大大简化了 Service可以天然地和 Spring 进行无缝集成。CXF有两种发布方式,方式一利用ServerFactoryBean来发布web服务,方式二利用JaxWsServerFactoryBean来发布web服务
    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://192.168.114.10: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://192.168.114.10:9999/ws/cxf/languangeService?WSDL");
        }
     我们需要注意的是利用ServerFactoryBean来发布web服务没有添加webService注解,也就是说没有注解也可以发布webService服务,但是这种方式不是很规范,比如我们不可以通过注解的方式来修改WSDL的标签信息,JaxWsServerFactoryBeanServerFactoryBean的子类,也是功能扩展类。此类,必须要在被发布为服务的类上添加@WebService注解,如果不加注解,虽然不出错,但也不会对外暴露任何方法。使用此类生成的wsdl文件更加规范,更重要的是可以通过添加拦截器拦截请求。
    在项目中我们可以利用spring与CXF集成来发布webservice,前面的服务发布包括创建服务类都是硬编码的方式,由于cxf的项目已经集成了Spring(自带了Spring lib)所以CXF的服务都是在Spring的配置文件中完成的首先我们需要web.xml中配置cxf的核心servletCXFServlet,此配置文件的作用类拦截/ws/*的所有请求类似Struts2的过滤器
    <servlet>
        <servlet-name>cxf</servlet-name>
        <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>cxf</servlet-name>
        <url-pattern>/ws/*</url-pattern>
    </servlet-mapping>
     然后通过Spring配置文件发布服务
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:jaxws="http://cxf.apache.org/jaxws" 
        xmlns:p="http://www.springframework.org/schema/p"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
            http://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd
            http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">    
        <!-- 这样配置自身的服务也可以使用 -->
        <bean id="userImpl" class="com.asen.i.cxf.spring.ws.UserImpl" />
        <!-- id:逻辑名  serviceClass=服务接口类  address:调用的路径  http://localhost:8888/项目名/ws/hello?wsdl> -->
        <jaxws:server id="userService" serviceClass="com.asen.cxf.spring.ws.IUser" address="/hello">
            <jaxws:serviceBean>
                <ref bean="userImpl" />
            </jaxws:serviceBean>
            <jaxws:inInterceptors>
                <bean class="org.apache.cxf.interceptor.LoggingInInterceptor" />
            </jaxws:inInterceptors>
            <jaxws:outInterceptors>
                <bean class="org.apache.cxf.interceptor.LoggingOutInterceptor" />
            </jaxws:outInterceptors>
        </jaxws:server>
    </beans>
     服务接口如下
    @WebService
    public interface IUser {
        public void saveUser(User user);
        public User getUser(int uid);
    }
     服务类如下:
    public class UserImpl implements IUser {
        private List<User> users=new ArrayList<User>();
    
        public User getUser(int uid) {
            for(User temp:users){
                if(temp.getUid()==uid){
                    return temp;
                }
            }
            return null;
        }
        public void saveUser(User user) {
            // TODO Auto-generated method stub
            users.add(user);
        }
    }

     

  • 相关阅读:
    使用ueditor实现多图片上传案例——Servlet层(UploadServlet)
    使用ueditor实现多图片上传案例——截取字符串层Util(SubString_text)
    [转载]oracle删除数据后的恢复
    [转载]oracle删除数据后的恢复
    为什么在定义hashcode时要使用31这个数呢?
    为什么在定义hashcode时要使用31这个数呢?
    [转载]hashCode和equals
    [转载]hashCode和equals
    Oracle HINT的用法
    Oracle HINT的用法
  • 原文地址:https://www.cnblogs.com/asen0713/p/6456050.html
Copyright © 2011-2022 走看看