WebService客户端调用


Webservice调用接口:

Web Service是一个平台独立的,低耦合的,自包含的、基于可编程的web的应用程序,可使用开放的XML(标准通用标记语言下的一个子集)标准来描述、发布、发现、协调和配置这些应用程序,用于开发分布式的交互操作的应用程序。WebService就是一种跨编程语言和跨操作系统平台的远程调用技术

Webservice:Web Service = SOAP + HTTP + WSDL

其中,SOAP Simple Object Access Protocol)协议是web service的主体,它通过HTTP或者SMTP等应用层协议进行通讯,自身使用XML文件来描述程序的函数方法和参数信息,从而完成不同主机的异构系统间的计算服务处理。这里的WSDL(Web Services Description Language)web 服务描述语言也是一个XML文档,它通过HTTP向公众发布,公告客户端程序关于某个具体的 Web service服务的URL信息、方法的命名,参数,返回值等。

WebService学习需要的技术支持:

XML和XSD

可扩展的标记语言(标准通用标记语言下的一个子集)是Web Service平台中表示数据的基本格式。除了易于建立和易于分析外,XML主要的优点在于它既与平台无关,又与厂商无关。XML是由万维网协会(W3C)创建,W3C制定的XML SchemaXSD 定义了一套标准的数据类型,并给出了一种语言来扩展这套数据类型。

SOAP

SOAP即简单对象访问协议(Simple Object Access Protocol),它是用于交换XML(标准通用标记语言下的一个子集)编码信息的轻量级协议。

WSDL

Web Service描述语言WSDL 就是用机器能阅读的方式提供的一个正式描述文档而基于XML(标准通用标记语言下的一个子集)的语言,用于描述Web Service及其函数、参数和返回值。

UDDI

UDDI是一套基于Web的、分布式的、为Web Service提供的、信息注册中心的实现标准规范,同时也包含一组使企业能将自身提供的Web Service注册,以使别的企业能够发现的访问协议的实现标准。

调用RPC与消息传递

通过IPC和RPC,程序能利用其它程序或计算机处理的进程。客户机/服务器模式计算把远程过程调用与其它技术(如消息传递)一道,作为系统间通信的一种机制。客户机执行自己的任务,但靠服务器提供后端文件服务。

Java WebService规范:参考博客

1.JAX-WS

JAX-WS(Java API For XML-WebService)。早期的基于SOAP 的JAVA 的Web 服务规范JAX-RPC(java API For XML-Remote Procedure Call)目前已经被JAX-WS 规范取代,JAX-WS 是JAX-RPC 的演进版本,但JAX-WS 并不完全向后兼容JAX-RPC,二者最大的区别就是RPC/encoded 样式的WSDL,JAX-WS 已经不提供这种支持。JAX-RPC 的API 从JAVA EE5 开始已经移除,如果你使用J2EE1.4,其API 位于javax.xml.rpc.包。JAX-WS(JSR 224)规范的API 位于javax.xml.ws.包,其中大部分都是注解,提供API 操作Web 服务(通常在客户端使用的较多,由于客户端可以借助SDK 生成,因此这个包中的API 我们较少会直接使用)。

2.JAXM&ASSJ

JAXM(JAVA API For XML Message)主要定义了包含了发送和接收消息所需的API,相当于Web 服务的服务器端,其API 位于javax.messaging.*包,它是Java EE 的可选包,因此你需要单独下载。

SAAJ(SOAP With Attachment API For Java,JSR 67)是与JAXM 搭配使用的API,为构建SOAP 包和解析SOAP 包提供了重要的支持,支持附件传输,它在服务器端、客户端都需要使用。这里还要提到的是SAAJ 规范,其API 位于javax.xml.soap.*包
JAXM&SAAJ 与JAX-WS 都是基于SOAP 的Web 服务,相比之下JAXM&SAAJ 暴漏了SOAP更多的底层细节,编码比较麻烦

3.JAX-RS

JAX-RS 是JAVA 针对REST(Representation State Transfer)风格制定的一套Web 服务规范

wsdl文档:

手机号码查询的wsdl

Service:相关端口的集合,包括其关联的接口、操作、消息等。

Binding:特定端口类型的具体协议和数据格式规范

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

message: 定义一个操作(方法)的数据参数

types: 定义 web service 使用的全部数据类型

SOAP:http+xml

必需的 Envelope 元素,可把此 XML 文档标识为一条 SOAP 消息
可选的 Header 元素,包含头部信息
必需的 Body 元素,包含所有的调用和响应信息
可选的 Fault 元素,提供有关在处理此消息所发生错误的信息

WebService客户端调用方式

方式一:根据wsdl创建客户端程序(需要通过wsdl将代码复现到本地,引入项目中使用)

wsimport -p cn.cad.mobile -s http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl

wsimport 命令参数 包名 参数 wsdl文档地址

方式二:service编程调用方式(需要通过wsdl将代码复现到本地,引入项目中使用)

注: 这个程序使用的包重名的类有点多,一个一个进行试出来的,所以在此将import也列举出来,否则导入时不知道那个包

package com.xing.cxf.test;
import java.io.IOException;
import java.net.URL;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
import cn.cad.mobile.MobileCodeWSSoap;

/**
 * @Class_Name MobileTestMethod2
 * @Class_Desc (wenservice客户端调用方式2)
 * @author it星
 * @date 2020年5月19日上午11:00:21
 * @Version
 */
public class MobileTestMethod2 {

    public static void main(String[] args) throws IOException {
        // 创建WSDL文件URL
        URL url = new URL("http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl");
        // 创建服务名称
        // 参数1:namespaceURI-命名空间地址
        // 参数2:localPart服务视图名
        QName serviceName = new QName("http://WebXml.com.cn/", "MobileCodeWS");
        Service service = Service.create(url, serviceName);

        MobileCodeWSSoap mobile = service.getPort(MobileCodeWSSoap.class);
        // 参数1传递自己测试的电话,参数二免费用户为空
        String message = mobile.getMobileCodeInfo("12345678965", null);
        System.out.println(message);
    }

}

方式三:HttpURLConnection调用方式(自己编写客户端程序,较麻烦)

package com.xing.cxf.test;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;

/**
 * @Class_Name TestEnglishParse
 * @Class_Desc (Webservice客户端程序)
 * @author it星
 * @date 2020年5月19日上午10:57:47
 * @Version
 */
public class TestEnglishParse {

    public static void main(String[] args) {
        getXmlMessage();
    }

    private static String getXmlMessage() {
        try {
            // 创建服务器地址
            URL url = new URL("http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl");
            // 第二步打开一个通向服务地址的连接
            HttpURLConnection openConnection = (HttpURLConnection) url.openConnection();
            // 第三步设置请求参数
            openConnection.setRequestMethod("POST");
            // 设置数据格式
            openConnection.setRequestProperty("content-type", "text/xml;charset=utf-8");
            StringBuilder sb = null;
            // 设置输入输出
            openConnection.setDoInput(true);
            openConnection.setDoOutput(true);
            // 第四步,组织soap数据,发送请求
            String soapXml = getXML("18091324972");
            // 将信息以流的方式发送出去
            OutputStream os = openConnection.getOutputStream();
            os.write(soapXml.getBytes());
            // 接受服务端响应,打印
            int responseCode = openConnection.getResponseCode();
            System.out.println(responseCode);
            if (200 == responseCode) {
                // 服务器响应成功
                BufferedReader bufferedReader = new BufferedReader(
                        new InputStreamReader(openConnection.getInputStream()));
                sb = new StringBuilder();
                String temp = null;
                while (null != (temp = bufferedReader.readLine())) {
                    sb.append(temp);
                }
                System.out.println(sb.toString());
                bufferedReader.close();
            }
            os.close();
            return sb.toString();

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return "soapXml";
    }

    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;
    }
}

开发步骤:

第一步:创建服务地址

第二步:打开一个通向服务地址的连接

第三步:设置参数

第四步:组织SOAP数据,发送请求

第五步:接收服务端响应

调用结果:

<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:Body><getMobileCodeInfoResponse xmlns="http://WebXml.com.cn/"><getMobileCodeInfoResult>XXXXXXXX:陕西 渭南 陕西电信CDMA卡</getMobileCodeInfoResult></getMobileCodeInfoResponse></soap:Body></soap:Envelope>

WebService的相关注解:

WebService的注解都位于javax.jws包下:

@WebService-定义服务,在类上边
targetNamespace:指定命名空间
name:portType的名称
portName:port的名称
serviceName:服务名称
endpointInterface:SEI接口地址,如果一个服务类实现了多个接口,只需要发布一个接口的方法,可通过此注解指定要发布服务的接口。

@WebMethod-定义方法,在公开方法上边
operationName:方法名
exclude:设置为true表示此方法不是webservice方法,反之则表示webservice方法,默认是false

@WebResult-定义返回值,在方法返回值前边
name:返回结果值的名称

@WebParam-定义参数,在方法参数前边
name:指定参数的名称


文章作者: it星
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 it星 !
  目录