soap通讯协议

1.什么是soap
2.为什么使用它
3.SOAP 消息结构
4.SOAP HTTP 协议
5.SOAP 实例:请求与响应
6.java发布服务实例

相关知识

1.Web Service
也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量级的独立的通讯技术。是:通过SOAP在Web上提供的软件(服务),使用WSDL文件进行(说明),并通过(UDDI)进行注册。

2.XML(Extensible Markup Language)
扩展型可标记语言。面向短期的临时数据处理、面向万维网络,是Soap的基础。

3.Soap:(Simple Object Access Protocol)简单对象存取协议。
是XML Web Service 的通信协议。当用户通过UDDI找到你的WSDL描述文档后,他通过可以SOAP调用你建立的Web服务中的一个或多个操作。SOAP是XML文档形式的调用方法的规范,它可以支持不同的底层接口,像HTTP(S)或者SMTP。

4.WSDL:(Web Services Description Language)
WSDL 文件是一个 XML 文档,用于说明一组 SOAP 消息以及如何交换这些消息。大多数情况下由软件自动生成和使用。它描述了怎么样连接到提供者,标准化了操作的输入输出参数的表示,以及服务的协议绑定和消息在线传输的方法,使得不同客户端自动理解如何与web服务交互。
5.UDDI:统一描述、发现和集成
文档UDDI用于与注册表通信的协议,是一个全球性的公共在线目录,为企业通过了统一的方式来描述他们的服务、查找其它公司的服务,以及详细的了解如何与实现服务的软件连接和交互。目的是只要符合UDDI技术标准的网上注册服务,那么任何一个客户程序都能够访问的到。UDDI注册表是web服务的一个实例,它的表项可以用基于soap的接口来发布和查询。

什么是soap

SOAP 是基于 XML 的简易协议,可使应用程序在 HTTP 之上进行信息交换。
或者更简单地说:SOAP 是用于访问网络服务的协议。
SOAP 指简易对象访问协议
SOAP 是一种用于发送消息的格式
SOAP 被设计用来通过因特网进行通信
SOAP 独立于平台和语言
SOAP 很简单并可扩展
SOAP 允许绕过防火墙

为什么使用soap

使程序间进行因特网通信
远程过程调用(RPC)在诸如 DCOM 与 CORBA 等对象之间进行通信,会产生兼容性以及安全问题;防火墙和代理服务器通常会阻止此类流量。
通过 HTTP 在应用程序间通信是更好的方法,因为 HTTP 得到了所有的因特网浏览器及服务器的支持。SOAP 就是被创造出来完成这个任务的。SOAP 提供了一种标准的方法,使得运行在不同的操作系统并使用不同的技术和编程语言的应用程序可以互相进行通信。
一句话总结就是:SOAP 是用于访问网络服务的协议。可以跨平台、跨语言,安全,兼容,把成熟的基于HTTP的WEB技术与xml的灵活性和可扩展性组合在了一起,使存在的应用能被更广泛的用户所使用

SOAP 消息结构

SOAP 请求是一个HTTP POST请求,请求的content-type必须用text/xml
一条 SOAP 消息就是一个普通的 XML 文档,包含下列元素:
1.必需的 Envelope 元素,把此 XML 文档标识为一条 SOAP 消息的顶级元素
2.可选的 Header 元素,包含头部信息<为了在松散环境下和通信双发尚未达成一致情况下为SOAP消息增加特性的通用机制 ,一般为了身份验证>
3.必需的 Body 元素,包含所有的调用和响应信息的一个容器
4.可选的 Fault 元素,提供有关在处理此消息所发生错误的信息

image.png

xmlns是XML NameSpace的缩写,表示xml命名空间
Envelope和body元素是以soap为前缀的
其中,qqCheckOnline 元素也定义了命名空间,但是并没有设置命名空间前缀,这种设置方式,会把当前元素及所有子元素都归属于该命名空间。

fault元素

image.png




SOAP HTTP 协议

HTTP 在 TCP/IP 之上进行通信。在建立连接之后,客户机可向服务器发送 HTTP 请求消息:

POST /item HTTP/1.1
Host: 189.123.255.239
Content-Type: text/plain
Content-Length: 200

随后服务器会处理此请求,然后向客户机发送一个 HTTP 响应。此响应包含了可指示请求状态的状态代码:

200 OK
Content-Type: text/plain
Content-Length: 200

SOAP 方法指的是遵守 SOAP 编码规则的 HTTP 请求/响应。
RPC + HTTP + XML = SOAP
RPC作为一致性的调用途径,XML作为数据传输格式,HTTP作为底层通信协议
HTTP POST 请求规定至少两个 HTTP 头:Content-Type 和 Content-Length。



SOAP 实例:请求与响应

在下面的例子中,一个 GetStockPrice 请求被发送到了服务器。此请求有一个 StockName 参数,而在响应中则会返回一个 Price 参数。此功能的命名空间被定义在此地址中:http://www.example.org/stock
SOAP 请求:

POST /InStock HTTP/1.1
Host: www.example.org
Content-Type: application/soap+xml; charset=utf-8
Content-Length: nnn

<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">

<soap:Body xmlns:m="http://www.example.org/stock">
  <m:GetStockPrice>
    <m:StockName>IBM</m:StockName>
  </m:GetStockPrice>
</soap:Body>

</soap:Envelope> 

SOAP 响应:

HTTP/1.1 200 OK
Content-Type: application/soap+xml; charset=utf-8
Content-Length: nnn

<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">

<soap:Body xmlns:m="http://www.example.org/stock">
  <m:GetStockPriceResponse>
    <m:Price>34.5</m:Price>
  </m:GetStockPriceResponse>
</soap:Body>

</soap:Envelope> 



Java发布服务实例

一.发布服务

package com.skd.service;

import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.xml.ws.Endpoint;

//必须要加注释
@WebService
public class Hello {
    public String sayHello(String name){
        return "hello " + name;
    }
    public static void main(String[] args) {
        //服务的地址
        String address = "http://localhost:8080/hello";
        Hello implementor = new Hello();
        //发布服务,第一个参数是服务的地址,第二个参数是发布出去服务的方法
        Endpoint.publish(address, implementor);
    }
}

二.使用eclipse插件访问soap服务

点击Launch SOAP Web Services Explorer

点击WSDL Page

点击WSDL Main

输入我们发布服务的wsdl路径

输入服务的参数

查看状态,查看源

服务返回的数据

利用JDK注释控制WSDL文件

代码如下:

package com.skd.service;

import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.xml.ws.Endpoint;


@WebService(targetNamespace="http://com.wpx",serviceName="WPXService")
public class Hello {
    //提供一个合法的web方法
    @WebMethod(operationName="myMethod")
    @WebResult(name="myRet")
    public String sayHello(
            @WebParam(name="name")
            String name){
        return "hello " + name;
    }
    //排除当前方法
    @WebMethod(exclude=true)
    public String sayHi(String name){
        return "hi " + name;
    }
    public static void main(String[] args) {
        String address = "http://localhost:8080/hello";//服务的发布地址
        Hello implementor = new Hello();//提供服务的实例
        Endpoint.publish(address, implementor);//发布服务
    }
}

发布成功后,我们查看一下WSDL文件的变化:
image.png
image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342