• 【转】WebService生成客户端和服务端


    转载自:https://blog.csdn.net/qq_41694906/article/details/88029533

    目录

    一:WebService的服务端发布

                 1:发布web程序服务端发布   

                    2:本地发布

     二:Webservice客户端调用:

    1:本地生成代码,直接调用:

    2、利用dos命令生成代码,和第一种基本一致

    3:利用apache的AXIS直接调用远程的web service

    4:service编程实现调用

    5:HttpURLConnection调用方式

    6.Ajax调用方式 

    Web Service是构建互联网分布式系统的基本部件,它是一个应用程序,它向外界暴露出一个能够通过Web进行调用的API。这就是说,别人能够用编程的方法通过Web来调用这个应用程序。

    它通过标准通信协议,在互联网上以服务的方式发布有用的程序模块,目前大部分是用SOAP作为通信协议。

     它提供一份详细的接口说明书,来帮助用户构建应用程序,这个接口说明书叫WSDL(Web服务描述语言,Web Service Description Language)。

    请求报文和返回报文都是XML格式的,XML(Extensible Markup Language)即可扩展标记语言,它与HTML一样,都是SGML(Standard Generalized MarkupLanguage,标准通用标记语言)。

     
    一:WebService的服务端发布
                 1:发布web程序服务端发布   
                        创建 service 接口

                               

                        创建接口实现类,实现业务逻辑

          

                                配置 web.xml 中 中 Xfire
                                 提供对 xfire 的拦截

                配置 webservice  配置
                     在 class 目录下建立 META-INF 目录,如(META-INF>xfire->services.xml),在
                     services.xml 文件中进行 webservice 服务的发布.

    然后启动服务,在浏览器中输入http://ip/项目名称/services就可以看到发布的接口了

                    2:本地发布
    import javax.jws.WebMethod;
    import javax.jws.WebService;
    import javax.xml.ws.Endpoint;

    /**
    * Title: ServiceHello
    * Description: 基于jdk1.6以上的javax.jws 发布webservice接口
    @WebService - 它是一个注解,用在类上指定将此类发布成一个ws。
    Endpoint – 此类为端点服务类,它的方法publish用于将一个已经添加了@WebService注解
    对象绑定到一个地址的端口上。
    * Version:1.0.0
    * @author panchengming
    */
    @WebService
    public class JwsServiceHello {

    /** 供客户端调用方法 该方法是非静态的,会被发布
    * @param name 传入参数
    * @return String 返回结果
    * */
    public String getValue(String name){
    return "欢迎你! "+name;
    }

    /**
    * 方法上加@WebMentod(exclude=true)后,此方法不被发布;
    * @param name
    * @return
    */
    @WebMethod(exclude=true)
    public String getHello(String name){
    return "你好! "+name;
    }

    /** 静态方法不会被发布
    * @param name
    * @return
    */
    public static String getString(String name){
    return "再见!"+name;
    }


    //通过EndPoint(端点服务)发布一个WebService
    public static void main(String[] args) {
    /*参数:1,本地的服务地址;
    2,提供服务的类;
    */
    Endpoint.publish("http://192.168.1.105:8080/Service/ServiceHello", new JwsServiceHello());
    System.out.println("发布成功!");
    //发布成功后 在浏览器输入 http://192.168.1.105:8080/Service/ServiceHello?wsdl
    }
    }
     二:Webservice客户端调用:
    1:本地生成代码,直接调用:
    1:新建一个class类,用于调用webservice。右键src,找到Web Service Client,并输入wsdl地址,选择下载代码的路径;

    (url: http://192.168.1.105:8080/Service/ServiceHello?wsdl) 

    2.将地址上的文件下载下来(注意和发布JDK一致); 
    3.写调用方法调用下载下来的WebService中的java类中的方法; 
    示例:

    import com.pcm.ws.jws.JwsServiceHello;
    import com.pcm.ws.jws.JwsServiceHelloService;

    /**
    *
    * Title: JwsClientHello
    * Description: webService 客户端调用
    * Version:1.0.0
    * @author panchengming
    */
    public class JwsClientHello {

    public static void main(String[] args) {
    //调用webservice
    JwsServiceHello hello=new JwsServiceHelloService().getJwsServiceHelloPort();
    String name=hello.getValue("panchengming");
    System.out.println(name);
    }
    }
    2、利用dos命令生成代码,和第一种基本一致
    A、在工作空间创建用于存放使用wsimport命令生成的客户端代码的java工程

    B、使用jdk提供的wsimport命令生成客户端代码

    ●  wsimport命令是jdk提供的,作用是根据使用说明书生成客户端代码,wsimport只支持SOAP1.1客户端的生成

    ●  wsimport常用参数

    -d:默认参数,用于生成.class文件
    -s:生成.java文件
    -p:指定生成java文件的包名,不指定则为WSDL说明书中namespace值得倒写

    C、在doc窗口进入java工程项目的src目录,执行wsimport命令

    D、在Eclipse中刷新java项目,将生成的客户端代码copy到客户端工程中

    E、创建服务视图,类名从<service>标签的name属性获取

    F、获取服务实现类,视图实例调用getProt()方法,实现类的类名从portType的name属性获取

    G、调用查询方法,方法名从portType下的operation标签的name属性获取

    package com.webservice.client;


    import com.webservice.jaxws.WeatherServiceImpl;

    import com.webservice.jaxws.WeatherServiceImplService;


    public class Client {


    public static void main(String[] args) {

    //创建视图

    WeatherServiceImplService wsis = new WeatherServiceImplService();

    //获取服务实现类

    WeatherServiceImpl wsi = wsis.getPort(WeatherServiceImpl.class);

    //调用查询方法

    String weather = wsi.queryWeather("北京");

    System.out.println(weather);

    }

    }
     

    ●   <service>    服务视图,webservice的服务结点,它包括了服务端点

    ●   <binding>     为每个服务端点定义消息格式和协议细节

    ●   <portType>   服务端点,描述 web service可被执行的操作方法,以及相关的消息,通过binding指向portType

    ●   <message>   定义一个操作(方法)的数据参数(可有多个参数)

    ●   <types>        定义 web service 使用的全部数据类型

    3:利用apache的AXIS直接调用远程的web service

    import java.util.Date;
    import java.text.DateFormat;
    import org.apache.axis.client.Call;
    import org.apache.axis.client.Service;
    import javax.xml.namespace.QName;
    import java.lang.Integer;
    import javax.xml.rpc.ParameterMode;

    public class caClient {
    public static void main(String[] args) {

    try {
    String endpoint = "http://localhost:8080/ca3/services/caSynrochnized?wsdl";
    // 直接引用远程的wsdl文件
    // 以下都是套路
    Service service = new Service();
    Call call = (Call) service.createCall();
    call.setTargetEndpointAddress(endpoint);
    call.setOperationName("addUser");// WSDL里面描述的接口名称
    call.addParameter("userName",
    org.apache.axis.encoding.XMLType.XSD_DATE,
    javax.xml.rpc.ParameterMode.IN);// 接口的参数
    call.setReturnType(org.apache.axis.encoding.XMLType.XSD_STRING);// 设置返回类型
    String temp = "测试人员";
    String result = (String) call.invoke(new Object[] { temp });
    // 给方法传递参数,并且调用方法
    System.out.println("result is " + result);
    } catch (Exception e) {
    System.err.println(e.toString());
    }
    }
    }
    4:service编程实现调用
    (1)、开发步骤

    A、wisimport生成客户端代码

    B、使用serivce类创建服务视图

    C、获取服务实现类

    D、调用查询方法

    import java.io.IOException;
    import java.net.MalformedURLException;
    import java.net.URL;

    import javax.xml.namespace.QName;
    import javax.xml.ws.Service;

    import cn.itcast.mobile.MobileCodeWSSoap;

    /**
    *
    * <p>Title: ServiceClient.java</p>
    * <p>Description:Service编程实现客户端</p>
    */
    public class ServiceClient {

    public static void main(String[] args) throws IOException {
    //创建WSDL地址,不是服务地址
    URL url = new URL("http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl");
    //创建服务名称
    //1.namespaceURI - 命名空间地址
    //2.localPart - 服务名称
    QName qname = new QName("http://WebXml.com.cn/", "MobileCodeWS");

    //Service创建视图
    //参数:
    //1.wsdlDocumentLocation - 使用说明书地址
    //2.serviceName - 服务名称
    Service service = Service.create(url, qname);
    //获取实现类
    MobileCodeWSSoap mobileCodeWSSoap = service.getPort(MobileCodeWSSoap.class);
    //调用查询方法
    String result = mobileCodeWSSoap.getMobileCodeInfo("188888888", "");
    System.out.println(result);
    }
    }
    5:HttpURLConnection调用方式
    (1)、开发步骤

    A、创建服务地址

    B、打开服务地址的一个连接

    C、设置连接参数

    ●   注意

    a、POST必须大写,如果小写会出如下异常:

     b、如果不设置输入输出,会报异常

    D、组织SOAP协议数据,发送给服务器

    E、接收服务端的响应

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.net.HttpURLConnection;
    import java.net.MalformedURLException;
    import java.net.URL;

    /**
    *
    * <p>Title: HttpClient.java</p>
    * <p>Description:HttpURLConnection调用方式</p>
    */
    public class HttpClient {

    public static void main(String[] args) throws IOException {
    //1:创建服务地址
    URL url = new URL("http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx");
    //2:打开到服务地址的一个连接
    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
    //3:设置连接参数
    //3.1设置发送方式:POST必须大写
    connection.setRequestMethod("POST");
    //3.2设置数据格式:Content-type
    connection.setRequestProperty("content-type", "text/xml;charset=utf-8");
    //3.3设置输入输出,新创建的connection默认是没有读写权限的,
    connection.setDoInput(true);
    connection.setDoOutput(true);

    //4:组织SOAP协议数据,发送给服务端
    String soapXML = getXML("1866666666");
    OutputStream os = connection.getOutputStream();
    os.write(soapXML.getBytes());

    //5:接收服务端的响应
    int responseCode = connection.getResponseCode();
    if(200 == responseCode){//表示服务端响应成功
    InputStream is = connection.getInputStream();
    InputStreamReader isr = new InputStreamReader(is);
    BufferedReader br = new BufferedReader(isr);

    StringBuilder sb = new StringBuilder();
    String temp = null;

    while(null != (temp = br.readLine())){
    sb.append(temp);
    }

    System.out.println(sb.toString());

    is.close();
    isr.close();
    br.close();
    }

    os.close();
    }

    /**
    * <?xml version="1.0" encoding="utf-8"?>
    <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    <soap:Body>
    <getMobileCodeInfo xmlns="http://WebXml.com.cn/">
    <mobileCode>string</mobileCode>
    <userID>string</userID>
    </getMobileCodeInfo>
    </soap:Body>
    </soap:Envelope>
    * @param phoneNum
    * @return
    */
    public static String getXML(String phoneNum){
    String soapXML = "<?xml version="1.0" encoding="utf-8"?>"
    +"<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">"
    +"<soap:Body>"
    +"<getMobileCodeInfo xmlns="http://WebXml.com.cn/">"
    +"<mobileCode>"+phoneNum+"</mobileCode>"
    +"<userID></userID>"
    +"</getMobileCodeInfo>"
    +" </soap:Body>"
    +"</soap:Envelope>";
    return soapXML;
    }
    }
    6.Ajax调用方式 

    <!doctype html>
    <html lang="en">
    <head>
    <title>Ajax调用方式</title>
    <script type="text/javascript">
    function queryMobile(){
    //创建XMLHttpRequest对象
    var xhr = new XMLHttpRequest();
    //打开链接
    xhr.open("post","http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx",true);
    //设置content-type
    xhr.setRequestHeader("content-type","text/xml;charset=utf-8");

    //设置回调函数
    xhr.onreadystatechange=function(){
    //判断客户端发送成功&&服务端响应成功
    if(4 == xhr.readyState && 200 == xhr.status){
    alert(xhr.responseText);
    }
    }

    //组织SOAP协议数据
    var soapXML = "<?xml version="1.0" encoding="utf-8"?>"
    +"<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">"
    +"<soap:Body>"
    +"<getMobileCodeInfo xmlns="http://WebXml.com.cn/">"
    +"<mobileCode>"+document.getElementById("phoneNum").value+"</mobileCode>"
    +"<userID></userID>"
    +"</getMobileCodeInfo>"
    +" </soap:Body>"
    +"</soap:Envelope>";
    alert(soapXML);

    //发送请求
    xhr.send(soapXML);
    }
    </script>
    </head>
    <body>
    手机号归属地查询:<input type="text" id="phoneNum" /><input type="button" value="查询" οnclick="javascript:queryMobile();"/>
    </body>
    </html>
    参考文章:https://blog.csdn.net/qq_35124535/article/details/62226585#t2 

    整理至此,希望对大家有帮助
    ————————————————
    版权声明:本文为CSDN博主「苍杲」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/qq_41694906/article/details/88029533

  • 相关阅读:
    LeetCode 109 Convert Sorted List to Binary Search Tree
    LeetCode 108 Convert Sorted Array to Binary Search Tree
    LeetCode 107. Binary Tree Level Order Traversal II
    LeetCode 106. Construct Binary Tree from Inorder and Postorder Traversal
    LeetCode 105. Construct Binary Tree from Preorder and Inorder Traversal
    LeetCode 103 Binary Tree Zigzag Level Order Traversal
    LeetCode 102. Binary Tree Level Order Traversal
    LeetCode 104. Maximum Depth of Binary Tree
    接口和多态性
    C# 编码规范
  • 原文地址:https://www.cnblogs.com/UUUz/p/12176202.html
Copyright © 2020-2023  润新知