ws是一种基于Http协议和XML技术,并使用WSDL描述和使用SOAP协议传输的异构系统解决方案
RPC–远程过程调用协议
Ws采用XML
权威机构能偶获取一些普通没法获取的数据,然后把它封装成ws服务端,普通使用就作为ws客户端掉用服务端。
大型应用公司为提高影响力,它会针对不同的平台提供不同的客户端。而客户端需要掉用获取数据,使用RPC,WS就是一种实现方式
----异构系统中相互作为ws服务端和客户端?问题-侵入性太强
1.新增一个的时候其他系统都要改代码
2.一个系统改动ip后,其他也要改动
wsdl:描述服务
uddi:发现服务
soap:调用服务协议
ws只是思想,jdk有默认实现。而且第三方框架也有实现。
1.创建项目
2.创建本地服务接口和实现类
public class HelloServiceImpl {
public String sayHello(String name) {
return name+"hello";
}
}
3.把本地服务标记为远程服务
@WebService
@WebService//标记为远程服务
public class HelloServiceImpl {
@WebMethod//标记为远程服务的远程方法
public String sayHello(String name) {
return name+"hello";
}
}
4.发布服务-根据注解做一些事情
public static void main(String[] args){
//Endpoint是终端的意思
String address ="http://127.0.0.1:8010/hello";//发布地址
Object implementor=new HelloServiceImpl();//发布服务
Endpoint.publish(address,implementor);
System.out.println("服务发布成功!");
}
5.测试
http://127.0.0.1:8010/hello?wsdl
注意事项:
1.jdk1.8不能直接访问服务地址,要加上?wsdl
2.没有抱错,不展示内容,浏览器兼容性问题
3.localhost 127.0.0.1 局域网ip 只要有一个成功就ok
web service description language 网络服务描述语言。简单的理解就是用来描述服务
definitions:根
name:服务名称,类型+service
targetNamespace:http://倒置导包
service:服务接口
binding:
transport:以什么样的传输协议来调用
style=“document”:表示我们wsdl文件遵循什么格式 document/rpc
portType:接口类型
描述了有哪些接口方法
message:消息
描述接口方法的参数和返回值消息
types:描述消息的类型和名称-在doucement才有,而rpc没有
接口:portType,message,types
实现:service,binding
where:service—什么地址
how:binding—什么方式
what:portType,message,types—什么方法
wsdl描述服务有哪些方法,以及在什么地址以什么样的方式能够被掉用
1.创建项目
2.通过wsdl地址生成本地接口
jdk的一个工具wsimport-jdk\bin,想在任意路径掉用,需要配置path
wsimport -d . http://127.0.0.1:8010/hello?wsdl
生成的是class文件
wsimport -s . http://127.0.0.1:8010/hello?wsdl
生成Java文件
注意:不要关闭服务端,该空格的地方注意
3.通过生成一些类获取本地接口的代理对象
4.通过该本地代理对象的方就能完成掉用服务
//获取本地接口代理对象
HelloServiceImpl helloService = new HelloServiceImplService().getHelloServiceImplPort();
System.out.println(helloService.getClass());
//通过代理对象掉用远程服务方法
System.out.println(helloService.sayHello("lwtest"));
1.是什么
simple object access protocol:简单对象访问协议
2.验证
<?xml version="1.0" endoding="UTF-8">
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:q0="http://webservice.zengqiang.com/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMlSchema-instance">
<soapenv:Header>
<authInfo>
<userName>userName>
authInfo>
soapenv:Header>
<soapenv:Body>
<q0:sayHello>
<arg0>zengqiangtestarg0>
q0:sayHello>
soapenv:Body>
soapenv:Envelope>
<S:envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<ns2:sayHelloResponse xmlns:ns2="http://webservice.zengqiang.com/">
<return>zengqiangtest:helloreturn>
ns2:sayHelloResponse>
S:Body>
S:Envelope>
Envelope:信封
Header:信封头部,开发人员用,我们需要从客户端往服务端传递一些数据懂得时候用,比如权限信息
Body:主体,一般是系统自己用
对于请求而言,告诉要掉用的方法和参名及值
对于相应而言,告诉是对哪个方法掉用进行相应,以及返回值的名称和值
/**
* @WebService:
* 只要你在某接口上添加了@WebService,name在所有的方法上面都会加上@WebMethod
* operationName = "sayHello"修改暴露的方法名
* exclude = true 排除方法
* @WebParam(name = "name") 修改参数名称
* @WebResult(name = "ret") 修改返回值名称
*
* @author Wangjinghao
* @version v1.0.0
* @date 2019/6/10
*/
@WebService(targetNamespace = "http://lw.org")
@SOAPBinding(style = SOAPBinding.Style.RPC)//默认是document,rpc少了一些类型
public interface IHelloService {
@WebMethod
@WebResult(name = "ret")String sayHi(@WebParam(name = "name") String name);
@WebMethod(operationName = "sayHello",exclude = true)
String sayHi1(String name);
}
/**
* WebService标识是一个远程服务类
* endpointInterface接口,配置了改哦束胸接口上面也要配置webService
* serviceName = "helloservice" 服务名
* portName = "helloServicePort" 端口名
* targetNamespace = "http://lw.org" 限定名,实现类改动接口中也要跟着改
* @author Wangjinghao
* @version v1.0.0
* @date 2019/6/10
*/
@WebService(endpointInterface = "cn.itsource.ws.jdk.server02_tag.IHelloService"
,serviceName = "helloservice",portName = "helloServicePort",targetNamespace = "http://lw.org")
public class HelloServiceImpl implements IHelloService {
@Override
public String sayHi(String name) {
return name+"say hello!";
}
@Override
public String sayHi1(String name) {
return null;
}
}
/**
* This class was generated by the JAX-WS RI.
* JAX-WS RI 2.2.9-b130926.1035
* Generated source version: 2.2
*
*/
@WebService(name = "IHelloService", targetNamespace = "http://lw.org")
@SOAPBinding(style = SOAPBinding.Style.RPC)
public interface IHelloService {
/**
*
* @param name
* @return
* returns java.lang.String
*/
@WebMethod
@WebResult(name = "ret", partName = "ret")
@Action(input = "http://lw.org/IHelloService/sayHiRequest", output = "http://lw.org/IHelloService/sayHiResponse")
public String sayHi(
@WebParam(name = "name", partName = "name")
String name);
}
/**
* This class was generated by the JAX-WS RI.
* JAX-WS RI 2.2.9-b130926.1035
* Generated source version: 2.2
*
*/
@WebServiceClient(name = "helloservice", targetNamespace = "http://lw.org", wsdlLocation = "http://127.0.0.1:9999/hi?wsdl")
public class Helloservice
extends Service
{
private final static URL HELLOSERVICE_WSDL_LOCATION;
private final static WebServiceException HELLOSERVICE_EXCEPTION;
private final static QName HELLOSERVICE_QNAME = new QName("http://lw.org", "helloservice");
static {
URL url = null;
WebServiceException e = null;
try {
url = new URL("http://127.0.0.1:9999/hi?wsdl");
} catch (MalformedURLException ex) {
e = new WebServiceException(ex);
}
HELLOSERVICE_WSDL_LOCATION = url;
HELLOSERVICE_EXCEPTION = e;
}
public Helloservice() {
super(__getWsdlLocation(), HELLOSERVICE_QNAME);
}
public Helloservice(WebServiceFeature... features) {
super(__getWsdlLocation(), HELLOSERVICE_QNAME, features);
}
public Helloservice(URL wsdlLocation) {
super(wsdlLocation, HELLOSERVICE_QNAME);
}
public Helloservice(URL wsdlLocation, WebServiceFeature... features) {
super(wsdlLocation, HELLOSERVICE_QNAME, features);
}
public Helloservice(URL wsdlLocation, QName serviceName) {
super(wsdlLocation, serviceName);
}
public Helloservice(URL wsdlLocation, QName serviceName, WebServiceFeature... features) {
super(wsdlLocation, serviceName, features);
}
/**
*
* @return
* returns IHelloService
*/
@WebEndpoint(name = "helloServicePort")
public IHelloService getHelloServicePort() {
return super.getPort(new QName("http://lw.org", "helloServicePort"), IHelloService.class);
}
/**
*
* @param features
* A list of {@link javax.xml.ws.WebServiceFeature} to configure on the proxy. Supported features not in the features
parameter will have their default values.
* @return
* returns IHelloService
*/
@WebEndpoint(name = "helloServicePort")
public IHelloService getHelloServicePort(WebServiceFeature... features) {
return super.getPort(new QName("http://lw.org", "helloServicePort"), IHelloService.class, features);
}
private static URL __getWsdlLocation() {
if (HELLOSERVICE_EXCEPTION!= null) {
throw HELLOSERVICE_EXCEPTION;
}
return HELLOSERVICE_WSDL_LOCATION;
}
}
三 CXf
优点:
SOA框架,ws只会用到XFire
CXF内置JEtty Web服务器
使用CXF开发Web Server端组件都需要“接口”和“实现类”两部分
支持多种数据格式:XML和JSON(Restful)
并可以余spring进行快速无缝的整合
灵感或的部署:ant maven
可以运行有Tomcat,Jboss,Jetty(内置web服务器),IBMWebsphere,BeaWebLogic上面
--作者:额滴神