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文档:
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:指定参数的名称