• webServices学习三(概念详解)


    WebService通过HTTP协议完成远程调用: (深入分析) 

    WebService只采用HTTP POST方式传输数据,不使用GET方式;  -- 握手,WSDL-get,
    普通http post的contentType为
    application/x-www-form-urlencoded
    WebService的contentType为-即在Http的基础上发SOAP协议
    text/xml 这是基于soap1.1协议。
    application/soap+xml 这是基于soap1.2协议。
    
    WebService从数据传输格式上作了限定。WebService所使用的数据均是基于XML格式的。目前标准的WebService在数据格式上主要采用SOAP协议。SOAP协议实际上就是一种基于XML编码规范的文本协议。
    
    SOAP – Simple Object Access protocol 简单对像访问协议。是运行在HTTP协议基础之上的协议。其实就是在HTTP协议是传输XML文件,就变成了SOAP协议。
    
    SOAP1.1和SOAP1.2的 namespace不一样。可以通过查看类
    javax.xml.ws.soap.SOAPBinding来查看里面的常量
    默认情况下,Jdk1.6只支持soap1.1
    即:@BindingType(value=javax.xml.ws.soap.SOAPBinding.SOAP11HTTP_BINDING)

    WebService和Web服务器的区别:

    WebService和Web服务器有什么区别呢?我们可以把WebService看作是Web服务器上应用;反过来说,Web服务器是WebService运行时所必需的容器。这就是它们的区别和联系。 使用JDK1.6发布的简单Web服务,其内部其实是使用Socket实现。可以查看:SUN公司未对外公布的API类com.sun.xml.internal.ws.transport.http.server. ServerMgr获知,请使用反编译工具。 WebService的特点 WebService通过HTTP POST方式接受客户的请求 WebService与客户端之间一般使用SOAP协议传输XML数据. 它本身就是为了跨平台或跨语言而设计的。

    WebService的方式:

    l通过客户端编程的方式调用
    l通过ajax调用js+XML 

    通过URLConnection调用

    一、Ajax调用获取所有用户:

     1 <html>
     2     <body>
     3         <button id="btn" onclick="getUsers();">获取所有用户</button>
     4     </body>
     5     <script language="javascript">
     6          var xhr = null;   
     7         function getUsers(){
     8             var url = "http://localhost:9999/user";//声明完整的url
     9             //以下声明soap文本
    10             var soap = '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" '+
    11                        'xmlns:q0="http://ws2.itcast.cn/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" '+
    12                        'xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">'+
    13                        '<soapenv:Body><q0:users/></soapenv:Body></soapenv:Envelope>';
    14             xhr.open("POST",url,true);
    15             xhr.onreadystatechange=back;//以下设置请求头
    16             xhr.setRequestHeader("Content-Type","text/xml;charset=UTF-8");
    17             xhr.send(soap);//发送xml请求
    18         }
    19         function back(){
    20             if(xhr.readyState==4){
    21                 if(xhr.status==200){
    22                     var xml = xhr.responseXML;//获取返回的xml文本并解析
    23                     var returns = xml.getElementsByTagName("return");
    24                     for(var i=0;i<returns.length;i++){
    25                         //var nm = returns[i].firstChild.text;//两种方式都可以
    26                         var nm = returns[i].getElementsByTagName("name")[0].text;
    27                         alert(nm);
    28                     }
    29                 }
    30             }
    31         }
    32         //创建xhr对象,在IE上
    33         function init(){
    34             xhr = new ActiveXObject("Microsoft.XMLHTTP");
    35         }
    36         init();
    37     </script>
    38 </html>

    二、客户端通过编程的方式访问服务:

    使用javax.xml.ws.Service类用于访问web服务。
    关键类Service
    方法create – 用户创建Service对像,提供wsdlurl和服务名。
    getPort-用于通过指定namespace,portName和接口的范型。
    在客户端需要一个与服务器接口完全相同的类。(仍然使用工具生成。但只需要一个接口。并需要简单修改。如果返回的是复杂数据类型如POJO,还需要将POJO一并放到项目中)-不要试图通过-p来修改包名,会出错的。
    关键类QName – 被称为完全限定名即:Qualified Name的缩写。
    QName 的值包含名称空间 URI、本地部分和前缀。


    1、以下是调用代码(以下代码仅供参考)
    package com.itcast;
    import java.net.URL;
    import javax.xml.namespace.QName;
    import javax.xml.ws.Service;
    import com.leaf.mynamespace.MyName;
    public class ClientTest {
    public static void main(String[] args) throws Exception {
    //create的第一个参数为一个URL对像,接收wsdl的地址信息
    //QName的参数:1:
    Service service = 
    Service.create(new URL("http://localhost:6666/helloworld?wsdl"),
           new QName("http://leaf.com/mynamespace","myService"));
    System.err.println(service);
    //以下获取接口名
    MyName o = service.getPort(  
       new javax.xml.namespace.QName("http://leaf.com/mynamespace","myPort"),
           MyName.class);
    System.err.println(o.mySayHiOperationName("中国北京"));
    }
    }

    三、客户端编程-用的不是很多:

    package cn;
    import java.net.URL;
    import javax.xml.namespace.QName;
    import javax.xml.ws.Service;
    import cn.wj.One;
    public class Test {
        public static void main(String[] args) throws Exception {
            //声明wsdl地址
            URL u = new URL("http://localhost:9999/one?wsdl");
            //获取命名空间
            String ns = "http://wj.cn";
            //第二个参数是一个完全限定名,WjService是服务名
            Service service = Service.create(u,new QName(ns,"WjService"));
            //通过service的getPort方法返回指定的接口
            One one = service.getPort(new QName(ns,"one"),One.class);
            //调用sayHello方法
            String ss = one.sayHello("DDDD");
            System.err.println(ss);
        }
    }
  • 相关阅读:
    Mac上的常用软件
    Mac上在iterm2中使用ls时,出现Operation not permitted
    Typora常用操作
    Mac上的qemusystemaarch64占用太多内存
    软件质量管理总结
    postgres使用记录
    Linux 包含中文字符的文件名无法使用shell 选中或复制
    常见硬件知识
    iterm2 常用操作
    C# 通过 HTTPModule 防范 DOS
  • 原文地址:https://www.cnblogs.com/mengyuxin/p/5066450.html
Copyright © 2020-2023  润新知