soap协议规范
- 格式:doc
- 大小:83.00 KB
- 文档页数:20
SOAP消息解析及调试技巧SOAP(Simple Object Access Protocol)是一种基于XML的协议,用于在网络上进行分布式计算和交互。
它通过定义消息的格式和传输规范,实现了不同应用和平台之间的通信。
在开发和调试过程中,理解SOAP消息的结构和解析技巧是非常重要的。
本文将介绍SOAP消息的解析原理,并提供一些调试技巧,帮助开发者更好地处理SOAP 消息。
一、SOAP消息的结构SOAP消息通常由以下几个部分组成:1. Envelope(信封):SOAP消息的根元素,包含了所有SOAP消息的内容。
它定义了命名空间和编码方式。
2. Header(头):可选的部分,用于传递与消息相关的元数据和处理指令。
例如,可以通过头部添加认证信息、事务处理或其他自定义功能。
3. Body(身体):包含具体的消息内容,用于传递请求或响应的数据。
应用程序通常关注的是这个部分。
4. Fault(故障):可选的部分,用于表示消息处理过程中的错误或异常情况。
当请求或响应发生错误时,Fault部分可以提供详细的错误信息。
二、解析SOAP消息解析SOAP消息有多种方式,包括使用第三方库、手动解析XML 等。
下面以使用Java的SAAJ(SOAP with Attachments API for Java)库为例,介绍一种常用的解析SOAP消息的方法。
1. 导入SAAJ库:在Java项目中,需要导入SAAJ库才能使用其提供的API。
可以在项目的构建工具(如Maven或Gradle)中添加SAAJ 的依赖项,或手动导入相关的JAR包。
2. 创建SOAP消息对象:使用SAAJ提供的API,我们可以轻松地创建表示SOAP消息的对象。
```javaMessageFactory factory = MessageFactory.newInstance();SOAPMessage message = factory.createMessage();```3. 解析SOAP消息:通过解析得到的SOAP消息对象,我们可以提取出消息的各个部分。
DOI:10.13954/ ki.hd u.2002.03.005杭州电子工业学院学报 第22卷第3期JOURNAL OF H ANGZH OU I NST ITUT E OF Vol.22,No.3 2002年6月EL ECT RONIC ENGINEERING June.2002 SOAP的原理及实现邓 昱,曾文华(杭州电子工业学院计算机分院,浙江杭州310037)摘要:简单对象访问协议(Simple Object Access Protocol-SOAP)是一个基于扩展标记语言的在分散或分布式环境中实现信息交换的简单协议。
其主要目的是促进不同技术之间的可互用性,真正克服平台和防火墙的限制,使通信各方在互联网上实现畅通无阻的信息交流。
介绍了S OAP产生的技术背景及扩展标记语言、网络服务和网络服务描述语言等相关技术,并通过具体实例说明SOAP消息和SOAP封装等协议规范。
最后描述了SOAP协议在Windows环境下实现的体系结构及客户端和服务器端的实现过程。
关键词:简单对象访问协议;扩展标记语言;网络服务;协议规范中图分类号:TP311 文献标识码:A 文章编号:1001-9146(2002)03-0019-051 背景和相关技术简单对象访问协议(SOAP)定义了用XML和HTTP访问服务、对象和服务器的方法,是一个将不同类型的软件组件连接起来的协议。
其主要目的是促进不同技术之间的可互用性,真正克服平台和防火墙的限制,使通信各方在互联网上实现畅通无阻的信息交流。
随着计算机硬件的发展,尤其是互联网的出现,软件需要完成的工作越来越复杂,其规模也日益扩大,开发人员之间协同合作的必要性已不言而喻。
组件概念的提出与应用,虽然可使完成专门任务的软件块被无限重用,但缺乏统一的组件技术标准则不能保证其兼容性和互换性。
目前已存在的生成软件组件的标准及相应技术有组件对象模型、公共对象请求代理体系结构和远程数据服务等,它们以分布式网络结构为基础,不同组件可通过网络相互调用来构建各自的软件。
SOAP协议规范1. 简介SOAP以XML形式提供了一个简单、轻量的用于在分散或分布环境中交换结构化和类型信息的机制。
SOAP本身并没有定义任何应用程序语义,如编程模型或特定语义的实现;实际上它通过提供一个有标准组件的包模型和在模块中编码数据的机制,定义了一个简单的表示应用程序语义的机制。
这使SOAP能够被用于从消息传递到RPC的各种系统。
SOAP包括三个部分∙SOAP封装(见第4节)结构定义了一个整体框架用来表示消息中包含什么内容,谁来处理这些内容以及这些内容是可选的或是必需的。
∙SOAP编码规则(见第5节)定义了用以交换应用程序定义的数据类型的实例的一系列机制。
∙SOAP RPC表示(见第7节)定义了一个用来表示远程过程调用和应答的协定。
虽然这三个部分都作为SOAP的一部分一起描述,但它们在功能上是相交的。
特别的,封装和编码规则是在不同的名域中定义的,这种模块性的定义方法增加了简单性在SOAP封装,SOAP编码规则和SOAPRPC协定之外,这个规范还定义了两个协议的绑定,描述了在有或没有HTTP扩展框架[6]的情况下,SOAP消息如何包含在HTTP消息[5]中被传送。
1.1 设计目标SOAP的主要设计目标是简单性和可扩展性,这意味着传统的消息系统和分布对象系统的某些性质不是SOAP规范的一部分。
这些性质包括:∙分布式碎片收集∙成批传送消息∙对象引用(要求分布式碎片收集)∙激活机制(要求对象引用)1.2 符号约定这篇文章中的关键字 "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT","SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", 和"OPTIONAL"的解释在RFC-2119 [2]中。
soap 格式
SOAP(Simple Object Access Protocol)是一种通信协议,基于XML (eXtensible Markup Language)格式,被广泛应用于Web服务的开发中。
它允许应用程序通过HTTP协议在互联网上交换结构化信息。
SOAP协议定义了一种规范,使得应用程序可以通过XML格式的消息进行通信,这些消息可以在不同的传输协议和不同的消息传递机制上传输。
SOAP消息通常由三部分组成:信封(Envelope)、头部(Header)和负载(Body)。
信封是SOAP消息的根元素,包含了消息的所有信息,头部包含了与消息传递相关的信息,如安全性、路由等,负载则包含了实际的应用程序数据。
SOAP协议具有简单性、可扩展性、安全性和可靠性等特点,使得它成为Web服务开发中的重要协议之一。
规范化书写SOAP一.主诉:1.以症状为主,不要出现疾病的名称(如无法用症状描述的可写疾病名称):如糖尿病、高血压字眼,可写成“发现血压高2年,血糖高4年,冠脉支架术后3年等”,或写症状,如“间断头晕3年,间断胸闷3年,多尿2年”等。
2.主诉多于一项,患有多种慢性病,需进行管理则按发生的先后次序列出,并记录每个症状的持续时间,主诉应简明精炼,每一项不多于20字。
3.格式为:按照时间顺序写成问题一,问题二等,如问题一:间断头晕3年,加重2天问题二:冠脉支架术后2年;说明:目前可将需管理的高血压、糖尿病、冠心病、脑梗塞四种慢性病均写在主诉中,如患有其他慢性病如骨关节病、高脂血症、COPD等虽也需管理,可在既往史中详细描述。
二.现病史:1.就以上的问题详细记录患者①发病时的症状、伴随情况及与鉴别诊断相关的阳性或阴性症状、②诊疗过程(包括诊断疾病的医院,治疗用药、效果、副作用)、③目前疾病控制情况的问题,并发症情况,格式为一个问题一段写,每一段开头错两个字,如:患者3年前出现头痛、头晕,在当地测量血压发现………….患者2年前突然出现剧烈心前区痛疼,在XXX医院就诊,心电图………….2.药品名称要加“”,如“倍他乐克 25mg Bid”,不能用缩写,如ASP。
3.单位及服药次数统一,即写英文全为英文,中文全为中文,如mg 或毫克,Bid 或2次/日.4.患者的检查最好标明日期,如1年前查XXX或2008年查XXXX,若不知日期可写为曾经查过XXXX,近半年或1年未再复查三.生活习惯:与健康问题相关的生活习惯。
如饮食、运动、生活习惯、烟酒嗜好、心理平衡、遵医嘱性等。
如:1. 饮食情况:主食多少,食油多少,但不要写总热量达标,这应该是大夫评估的结果。
2. 运动情况:运动强度包括运动持续时间、运动方式、运动量评估(心率或自我感觉)3. 工作环境、社会环境、家庭环境等四.查体:1. 不能单写正常,无特殊等,要具体写内容,如咽无充血等。
SOAP的四个部分:1协议结构SOAP 消息格式:SOAP 标头:<SOAP-ENV: Envelope Attributes><SOAP-ENV:Body Attributes></SOAP-ENV:Body></SOAP-ENV:Envelope>这种结构目前主要在web服务中运用。
2、语法规则SOAP 消息必须用 XML 来编码SOAP 消息必须使用 SOAP Envelope 命名空间SOAP 消息不能包含 DTD 引用SOAP 消息不能包含 XML 处理指令3、SOAP的核心技术解释SOAP采用了已经广泛使用的两个协议:HTTP 和XML。
HTTP用于实现 SOAP 的RPC 风格的传输, 而XML 是它的编码模式。
采用几行代码和一个XML 解析器, HTTP 服务器( MS 的 IIS 或 Apache) 立刻成为SOAP 的 ORBS。
SOAP 通讯协议使用 HTTP 来发送XML 格式的信息。
HTTP与RPC 的协议很相似,它简单、配置广泛,并且对防火墙比其它协议更容易发挥作用。
HTTP 请求一般由 Web 服务器软件(如 IIS 和Apache)来处理, 但越来越多的应用服务器产品正在支持HTTP。
XML 作为一个更好的网络数据表达方式( NDR)。
SOAP 把 XML 的使用代码化为请求和响应参数编码模式, 并用HTTP 作传输。
具体地讲, 一个SOAP 方法可以简单地看作遵循SOAP编码规则的HTTP请求和响应, 一个 SOAP 终端则可以看作一个基于HTTP 的URL, 它用来识别方法调用的目标。
像CORBA/ IIOP一样, SOAP 不需要具体的对象绑定到一个给定的终端, 而是由具体实现程序来决定怎样把对象终端标识符映像到服务器端的对象。
4、消息格式SOAP在标准化消息格式环境中,可以做所有它能完成的工作。
消息的主体部分是“text/xml”形式的MIME类型,并且包含一个SOAP封套。
SOAP康复治疗记录介绍及书写规范SOAP(Subjective,Objective,Assessment,Plan)评估记录法是目前国际上最常用以问题为导向的医学记录方法,主要用于培养康复治疗专业学生的临床思维能力、提高学生分析、判断和解决临床康复问题的能力,同时SOAP评估记录法的理念在康复组织工程中也能发挥重要的作用。
作为一种治疗记录格式,在美国等西方国家的临床治疗中,是每一位执业治疗师或助理治疗师必备的基本技能。
也就是说这不但是应用于康复治疗学生的教育,也应用于临床评估。
SOAP包含4个方面:主观资料(Subjective,S),客观资料(Objective,O),评估(Assessment,A)和计划(Plan,P) (一)主观资料:“S”主要是患者提供的资料,包括患者主诉,一般情况(例如年龄、职业等)、疾病发生发展情况、当前症状、个人病史、家族病史等。
主观资料的获得主要通过临床问诊,临床问诊实质是资料的搜集、思考、质疑并整合患者提供的相关信息以得出康复评估和治疗方案的临床推理过程。
临床推理不仅仅是康复治疗学科需要理解的概念,更是需要康复医师和治疗师学习的临床技能。
康复医务人员在评估时,需明确以下问题:患者的年龄、性别、从事的职业、什么部位出现症状、如何损伤的、症状程度及持续时间、哪些姿势或动作会加重或减轻症状、是否影响生活自理能力、是否影响到睡眠等。
举例一:患者的年龄。
许多疾病是与年龄呈相关性的。
例如,不同年龄导致腰痛疾病的种类不同:①小儿和青少年导致腰痛常见疾病为先天性畸形、脊柱侧弯等。
②中青年导致腰痛常见疾病为腰肌劳损、腰扭伤、腰椎间盘突出症等。
③老年导致腰痛常见疾病为腰椎骨性关节炎、腰椎管狭窄、骨质疏松等。
举例二:患者的职业。
不同职业导致疾病的种类不同。
例如,不同职业与膝关节疼痛:①跑步运动员导致膝关节疼痛常见疾病为“跑步膝”(即髌骨软骨损伤)。
②篮球运动员导致膝关节疼痛常见疾病为“篮球膝”(即髌腱末端病)。
规范化书写SOAP一.主诉:1.以症状为主,不要出现疾病的名称(如无法用症状描述的可写疾病名称):如糖尿病、高血压字眼,可写成“发现血压高2年,血糖高4年,冠脉支架术后3年等”,或写症状,如“间断头晕3年,间断胸闷3年,多尿2年”等。
2.主诉多于一项,患有多种慢性病,需进行管理则按发生的先后次序列出,并记录每个症状的持续时间,主诉应简明精炼,每一项不多于20字。
3.格式为:按照时间顺序写成问题一,问题二等,如问题一:间断头晕3年,加重2天问题二:冠脉支架术后2年;说明:目前可将需管理的高血压、糖尿病、冠心病、脑梗塞四种慢性病均写在主诉中,如患有其他慢性病如骨关节病、高脂血症、COPD等虽也需管理,可在既往史中详细描述。
二.现病史:1.就以上的问题详细记录患者①发病时的症状、伴随情况及与鉴别诊断相关的阳性或阴性症状、②诊疗过程(包括诊断疾病的医院,治疗用药、效果、副作用)、③目前疾病控制情况的问题,并发症情况,格式为一个问题一段写,每一段开头错两个字,如:患者3年前出现头痛、头晕,在当地测量血压发现………….患者2年前突然出现剧烈心前区痛疼,在XXX医院就诊,心电图………….2.药品名称要加“”,如“倍他乐克 25mg Bid”,不能用缩写,如ASP。
3.单位及服药次数统一,即写英文全为英文,中文全为中文,如mg 或毫克,Bid 或2次/日.4.患者的检查最好标明日期,如1年前查XXX或2008年查XXXX,若不知日期可写为曾经查过XXXX,近半年或1年未再复查三.生活习惯:与健康问题相关的生活习惯。
如饮食、运动、生活习惯、烟酒嗜好、心理平衡、遵医嘱性等。
如:1. 饮食情况:主食多少,食油多少,但不要写总热量达标,这应该是大夫评估的结果。
2. 运动情况:运动强度包括运动持续时间、运动方式、运动量评估(心率或自我感觉)3. 工作环境、社会环境、家庭环境等四.查体:1. 不能单写正常,无特殊等,要具体写内容,如咽无充血等。
SOAP康复治疗记录介绍及书写规范随着康复发展⾏业逐渐规范化,⼤家对康复的书写病历要求也越来越⾼,今天⼩编为⼤家分享⼀篇国外康复治疗师病历模板,供⼤家参考。
【SOAP的由来】早在上个世纪,美国⼈Lawrence Weed提出了⼀种组织康复治疗记录的系统,称为问题导向的康复治疗记录(problem-oriented medical record, POMR),SOAP是这个系统中的⼀部分。
SOAP作为⼀种治疗记录格式,在美国等西⽅国家的临床治疗中,是每⼀位执业治疗师或助理治疗师必备的基本技能。
随着我国康复治疗专业执业⼈员⽔平的不断提⾼,掌握SOAP的基本书写⽅式⽆疑⼗分重要。
⼀、什么是SOAP?SOAP是英⽂⾸字母的缩写,这四个字母分别代表患者信息的四个部分。
S即subjective data,指主观资料;O即objective data,指客观资料;A即assessment and analysis,指对患者的评估与分析;P即plan,指治疗计划。
⼆、SOAP包含了哪些内容?(⼀)主观资料:“S”是通过治疗师的询问,患者、患者家属或照顾者告诉治疗师的关于患者⽬前情况及治疗的相关信息。
书写内容应该包括主诉、现病史、既往史、社会史、情绪与态度、⽬标或功能性治疗结果、对治疗的反应、特殊情况的描述。
特别需要提醒的是,疼痛也属于主观资料部分的内容。
(⼆)客观资料:“O” 是指治疗师通过各种⽅法和技术评定后获得的信息,⽐如关节活动度的测量,肌⼒测试,感觉测试,围度测量,以及功能性测试等。
书写内容应包括:⽣命体征、⼈体测量学特征、关节活动度范围、肌张⼒、肌⼒、任何标准测量或问卷的结果、设备的检测结果及患者的功能状态。
如果有对患者进⾏⼲预,需要记录详细的⼲预措施。
(三)评估与分析:“A”部分包含功能诊断、长期⽬标与短期⽬标。
功能诊断是对患者损伤及功能限制的描述,也是治疗师将要解决的问题。
常见的损伤有:肌张⼒异常、肌⼒下降、韧带炎症、因结缔组织太紧⽽造成的关节活动度受限、肌⾁痉挛、⽔肿等;功能上的限制是指功能性活动能⼒的不⾜或丧失,即执⾏活动或⼯作能⼒的下降。
W3C Working Draft 9 July 2001英文版:/TR/2001/WD-soap12-20010709/英文版的最后版:/TR/soap12/英文版编辑:Martin Gudgin (DevelopMentor)Marc Hadley (Sun Microsystems)Jean-Jacques Moreau (Canon)Henrik Frystyk Nielsen (Microsoft Corp.)中文版:/pubs/misc/soap12.htm(已经不可访问)中文版编辑:柴晓路, Fennivel Chai (DealEasy)中文版贡献者:许佑骏, Arthor Xu (DealEasy)Copyright ©2001 W3C® (MIT, INRIA, Keio), All Rights Reserved. W3C liability, trademark, document use and software licensing rules apply.AbstractSOAP 1.2为在一个松散的、分布的环境中使用XML对等地交换结构化的和类型化的信息提供了一个简单且轻量级的机制。
这是一个基于XML的协议,同时它由四部分组成: 一个作为描述在消息中的内容以及如何处理消息的信息框架的信封(envelope),一组用于表示应用定义的数据类型的编码规则(encoding rules),一个用于表示远程过程调用和返回的约定以及一个使用底层协议进行消息交换的绑定(binding)约定。
潜在地,SOAP可以与很多其他的协议绑定使用;不过,在本文档中,只定义了SOAP与HTTP已经SOAP与HTTP Extension Framework的绑定。
Status of this DocumentThis section describes the status of this document at the time of its publication. Other documents may supersede this document. The latest status of this document series is maintained at the W3C.This is the first W3C Working Draft of the SOAP version 1.2 specification for review by W3C members and other interested parties. It has been produced by the XML Protocol Working Group (WG), which is part of the XML Protocol Activity.The XML Protocol Protocol Working Group has, in keeping with its charter, produced a set of requirements and usage scenarios that have been published as a Working Draft. To better evaluate SOAP/1.1 against these requirements and usage scenarios, the Working Group has produced an abstract model and a glossary of terms and concepts used by the Working Group. In addition, the Working Group has produced an issues list that describes issues and concerns raised by mapping its requirements and the XMLP abstract model against the SOAP/1.1 specification as well as issues raised on the <xml-dist-app@> mailing list against SOAP/1.1.The current name for this specification is SOAP version 1.2, this first Working Draft being based on SOAP/1.1 as per the Working Group's charter (see change log in appendix D)Comments on this document should be sent to xmlp-comments@ (public archives). It is inappropriate to send discussion emails to this address.Discussion of this document takes place on the public <xml-dist-app@> mailing list (Archives) per the email communication rules in the XML Protocol Working Group Charter.This is a public W3C Working Draft. It is a draft document and may be updated, replaced, or obsoleted by other documents at any time. It is inappropriate to use W3C Working Drafts as reference material or to cite them as other than "work in progress". A list of all W3C technical reports can be found at/TR/.1. 引言SOAP v1.2为在一个松散的、分布的环境中使用XML对等地交换结构化的和类型化的信息提供了一个简单且轻量级的机制。
soap类型的xml报⽂如何使⽤Java⽣成?1、什么是soap?英⽂全称:Simple Object Access Protocol,简单对象访问协议是交换数据的⼀种协议规范,是⼀种轻量的、简单的、基于(下的⼀个⼦集)的协议,它被设计成在WEB上交换结构化的和固化的信息。
2、SOAP格式:1 2 3 4 5 6 7 8<SOAP-ENV:Envelope 各种属性><!--百度百科⽰例--> <SOAP:HEADER> </SOAP:HEADER> <SOAP:Body> </SOAP:Body></SOAP-ENV:Envelope>主要在web服务中运⽤。
3、语法规则构建模块⼀条 SOAP 消息就是⼀个普通的 XML ⽂档,包含下列元素:必需的 Envelope 元素,可把此 XML ⽂档标识为⼀条 SOAP 消息可选的 Header 元素,包含头部信息必需的 Body 元素,包含所有的调⽤和响应信息可选的 Fault 元素,提供有关在处理此消息所发⽣错误的信息这⾥是⼀些重要的语法规则:SOAP 消息必须⽤ XML 来编码SOAP 消息必须使⽤ SOAP Envelope 命名空间SOAP 消息必须使⽤ SOAP Encoding 命名空间SOAP 消息不能包含 DTD 引⽤SOAP 消息不能包含 XML 处理指令消息基本结构12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17<?xml version="1.0"?><soap:Envelope xmlns:soap="" soap:encodingStyle=""> <soap:Header><!--百度百科⽰例--></soap:Header><soap:Body><!--百度百科⽰例--><soap:Fault><!--百度百科⽰例--></soap:Fault></soap:Body></soap:Envelope>4、案例分享代码package com.xc.soap;import java.util.ArrayList;import java.util.List;import javax.swing.text.Document;import space.QName;import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.soap.MessageFactory;import javax.xml.soap.SOAPBody;import javax.xml.soap.SOAPElement;import javax.xml.soap.SOAPEnvelope;import javax.xml.soap.SOAPException;import javax.xml.soap.SOAPFactory;import javax.xml.soap.SOAPHeader;import javax.xml.soap.SOAPMessage;import javax.xml.soap.SOAPPart;import javax.xml.transform.OutputKeys;import javax.xml.transform.Source;import javax.xml.transform.Transformer;import javax.xml.transform.TransformerFactory;import javax.xml.transform.dom.DOMSource;import javax.xml.transform.sax.SAXSource;import javax.xml.transform.stream.StreamResult;import org.w3c.dom.Node;import org.xml.sax.InputSource;public class SOAPUtil {public static void main(String[] args) throws Exception {//创建本类的对象SOAPUtil util = new SOAPUtil();//调⽤本类的⽅法SOAPPart part = util.initsoappart();//获取返回的soap报⽂Source inform = util.getparametervalues(part, util.getTestNames());//输出这些soap报⽂到控制台,如果是我,我只需要封装就⾏了util.soap2string(inform);}/** 总结:* 1、既然有set元素,那么就可以进⾏get元素中的内容*//*** 封装命名空间、请求头* @return* @throws SOAPException*/public SOAPPart initsoappart() throws SOAPException {//创建SoapMessageSOAPMessage soapmessage = MessageFactory.newInstance().createMessage();//创建SoapPartSOAPPart soappart = soapmessage.getSOAPPart();//创建SoapEnvelopeSOAPEnvelope soapenvelope = soappart.getEnvelope();//创建HeaderSOAPHeader soapheader = soapenvelope.getHeader();//创建命名空间声明//实际的报⽂输出:SOAP-ENV、cwmp、soap-enc、xsd、xsi//维度没有第⼀个?说明第⼀个是默认的SOAPElement cwmp = soapenvelope.addNamespaceDeclaration("cwmp","urn:dslforum-org:cwmp-1-0");SOAPElement xsi = soapenvelope.addNamespaceDeclaration("xsi","/2001/xmlschema-instance");SOAPElement xsd = soapenvelope.addNamespaceDeclaration("xsd","/2001/xmlschema");SOAPElement enc = soapenvelope.addNamespaceDeclaration("soap-enc","/soap/encoding/");//向soap头中添加数据SOAPElement id = soapheader.addChildElement("id", "cwmp");//也就是说在header中新增⼦标签//向标签中添加数据id.setTextContent("1");//返回SOAPPart对象return soappart;}/*** 封装请求体内容* @param part* @param list* @return* @throws Exception*/public Source getparametervalues(SOAPPart part, @SuppressWarnings("rawtypes") List list) throws Exception { //再次通过soappart对象创建envelope对象SOAPEnvelope soapenvelope = part.getEnvelope();//通过envelope对象获取body对象SOAPBody soapbody = soapenvelope.getBody();//通过body对象创建⼦节点 <cwmp:getparametervalues>SOAPElement informres = soapbody.addChildElement("getparametervalues","cwmp");@SuppressWarnings("static-access")//实例化SOAP⼯⼚SOAPFactory soapfactory = SOAPFactory.newInstance();//通过soap⼯⼚创建标签 <parameternames soap-enc:arraytype="xsd:string[27]">SOAPElement names = soapfactory.createElement("parameternames", "", "");//并且为这个标签新增属性 name 以及 valuenames.addAttribute(new QName("soap-enc:arraytype"), "xsd:string["+ list.size() + "]");//⽅法传⼊的参数list,来⾃于另外⼀个⽅法,其实就是⼀个保存有value的集合,也就是⼦标签中需要存⼊的数据 //SOAPElement nameelement = null;for (int i = 0; i < list.size(); i++) {//使⽤soap⼯⼚创建标签nameelement = soapfactory.createElement("string", "", "");//将集合中的内容保存到创建的string标签中nameelement.setTextContent((String) list.get(i));//再把存有⼦标签的数据存到外层标签中names.addChildElement(nameelement);}//在把这个多重⼦标签,存⼊到外⾯的标签中informres.addChildElement(names);//最后返回这个最外层的part对象,其中就包含了header和bodyreturn part.getContent();}/*** 封装请求体中的数据* @return*/public List<String> getTestNames() {//创建⼀个List集合,然后调⽤add⽅法,存⼊数据List<String> list = new ArrayList<String>();list.add("internetgatewaydevice.deviceinfo.x_ct-com_cpu");list.add("internetgatewaydevice.deviceinfo.x_ct-com_worktime");list.add("internetgatewaydevice.deviceinfo.softwareversion");list.add("ndevice.1.wlanconfiguration.1.ssid");list.add("ndevice.1.wlanconfiguration.1.x_ct-com_receivenoise");list.add("ndevice.1.wlanconfiguration.1.x_ct-com_lan-totalbytesreceived");list.add("ndevice.1.wlanconfiguration.1.x_ct-com_lan-totalbytessent");list.add("ndevice.1.wlanconfiguration.1.x_ct-com_wan-totalbytesreceived");list.add("ndevice.1.wlanconfiguration.1.x_ct-com_wan-totalbytessent");list.add("ndevice.1.wlanconfiguration.1.x_ct-com_lan-totalpacketsreceived");list.add("ndevice.1.wlanconfiguration.1.x_ct-com_lan-totalpacketssent");list.add("ndevice.1.wlanconfiguration.1.x_ct-com_wan-totalpacketsreceived");list.add("ndevice.1.wlanconfiguration.1.x_ct-com_wan-totalpacketssent");list.add("ndevice.1.wlanconfiguration.1.x_ct-com_stat.responsepass");list.add("ndevice.1.wlanconfiguration.1.x_ct-com_stat.askpass");list.add("ndevice.1.wlanconfiguration.1.x_ct-com_stat.successpass");list.add("internetgatewaydevice.deviceinfo.x_ct-com_temp");list.add("ndevice.1.wlanconfiguration.1.x_ct-com_n-packetserror");list.add("ndevice.1.wlanconfiguration.1.x_ct-com_n-totalbytesreceived");list.add("ndevice.1.wlanconfiguration.1.x_ct-com_n-totalbytessent");list.add("ndevice.1.wlanconfiguration.1.x_ct-com_stat.wan-totalbytesreceived");list.add("ndevice.1.wlanconfiguration.1.x_ct-com_stat.wan-packetserror");list.add("ndevice.1.wlanconfiguration.1.x_ct-com_stat.wan-totalbytessent");list.add("ndevice.1.wlanconfiguration.1.associateddevice.1.x_ct-com_receiverate");list.add("ndevice.1.wlanconfiguration.1.associateddevice.1.x_ct-com_sendrate");list.add("internetgatewaydevice.deviceinfo.serialnumber");list.add("internetgatewaydevice.deviceinfo.manufactureroui");return list;}/*** 将soap报⽂转换成string,在控制台输出* @param source* @throws Exception*/public void soap2string(Source source) throws Exception {//此处的source就是封装的soap请求报⽂if (source != null) {//定义⼀个w3c包中的node对象Node root = null;//如果请求报⽂属于DOM类型if (source instanceof DOMSource) {//就获取noderoot = ((DOMSource) source).getNode();//如果请求报⽂是sax类型} else if (source instanceof SAXSource) {//最终还是获取其中的元素InputSource insource = ((SAXSource) source).getInputSource();DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();dbf.setNamespaceAware(true);Document doc = (Document) dbf.newDocumentBuilder().parse(insource);root = (Node) doc.getDefaultRootElement();}//创建transfermerfactory⽰例,创建transformer对象Transformer transformer = TransformerFactory.newInstance().newTransformer();//设置属性为yestransformer.setOutputProperty(OutputKeys.INDENT, "yes");//调⽤⽅法,将node类型的请求报⽂在控制台进⾏输出transformer.transform(new DOMSource(root), new StreamResult(System.out));}}/*** 封装响应体内容* @param part* @return* @throws Exception*/public Source informresponse(SOAPPart part) throws Exception {SOAPEnvelope soapenvelope = part.getEnvelope();SOAPBody soapbody = soapenvelope.getBody();SOAPElement informres = soapbody.addChildElement("informresponse","cwmp");SOAPElement max = SOAPFactory.newInstance().createElement("maxenvelopes", "", "");max.setTextContent("1");informres.addChildElement(max);return part.getContent();}}执⾏结果<?xml version="1.0" encoding="UTF-8" standalone="no"?><SOAP-ENV:Envelope xmlns:SOAP-ENV="/soap/envelope/" xmlns:cwmp="urn:dslforum-org:cwmp-1-0" xmlns:soap-enc="/soap/encoding/" xmlns:xsd="/2001/xmlschema <SOAP-ENV:Header><cwmp:id>1</cwmp:id></SOAP-ENV:Header><SOAP-ENV:Body><cwmp:getparametervalues><parameternames soap-enc:arraytype="xsd:string[27]"><string>internetgatewaydevice.deviceinfo.x_ct-com_cpu</string><string>internetgatewaydevice.deviceinfo.x_ct-com_worktime</string><string>internetgatewaydevice.deviceinfo.softwareversion</string><string>ndevice.1.wlanconfiguration.1.ssid</string><string>ndevice.1.wlanconfiguration.1.x_ct-com_receivenoise</string><string>ndevice.1.wlanconfiguration.1.x_ct-com_lan-totalbytesreceived</string><string>ndevice.1.wlanconfiguration.1.x_ct-com_lan-totalbytessent</string><string>ndevice.1.wlanconfiguration.1.x_ct-com_wan-totalbytesreceived</string><string>ndevice.1.wlanconfiguration.1.x_ct-com_wan-totalbytessent</string><string>ndevice.1.wlanconfiguration.1.x_ct-com_lan-totalpacketsreceived</string><string>ndevice.1.wlanconfiguration.1.x_ct-com_lan-totalpacketssent</string><string>ndevice.1.wlanconfiguration.1.x_ct-com_wan-totalpacketsreceived</string><string>ndevice.1.wlanconfiguration.1.x_ct-com_wan-totalpacketssent</string><string>ndevice.1.wlanconfiguration.1.x_ct-com_stat.responsepass</string><string>ndevice.1.wlanconfiguration.1.x_ct-com_stat.askpass</string><string>ndevice.1.wlanconfiguration.1.x_ct-com_stat.successpass</string><string>internetgatewaydevice.deviceinfo.x_ct-com_temp</string><string>ndevice.1.wlanconfiguration.1.x_ct-com_n-packetserror</string><string>ndevice.1.wlanconfiguration.1.x_ct-com_n-totalbytesreceived</string><string>ndevice.1.wlanconfiguration.1.x_ct-com_n-totalbytessent</string><string>ndevice.1.wlanconfiguration.1.x_ct-com_stat.wan-totalbytesreceived</string><string>ndevice.1.wlanconfiguration.1.x_ct-com_stat.wan-packetserror</string><string>ndevice.1.wlanconfiguration.1.x_ct-com_stat.wan-totalbytessent</string><string>ndevice.1.wlanconfiguration.1.associateddevice.1.x_ct-com_receiverate</string><string>ndevice.1.wlanconfiguration.1.associateddevice.1.x_ct-com_sendrate</string><string>internetgatewaydevice.deviceinfo.serialnumber</string><string>internetgatewaydevice.deviceinfo.manufactureroui</string></parameternames></cwmp:getparametervalues></SOAP-ENV:Body></SOAP-ENV:Envelope>。
soap request与rest requestSOAP (Simple Object Access Protocol) 和 REST (Representational State Transfer) 是两种常见的 Web 服务请求协议,用于在不同的应用程序之间进行通信和数据交换。
SOAP 请求是基于 XML 的协议,它使用 SOAP 信封来封装请求和响应消息。
SOAP 请求通常使用 HTTP 或其他传输协议作为底层通信机制。
SOAP 请求的特点包括:- 严格的架构和规范:SOAP 定义了严格的消息结构和处理方式,包括请求头、请求体和响应体等部分。
- 复杂的消息格式:SOAP 消息使用 XML 来定义和表示数据,因此消息格式相对复杂,需要解析和处理 XML 数据。
- 高度可互操作性:SOAP 旨在提供跨平台和跨语言的互操作性,使得不同的应用程序可以通过 SOAP 进行通信。
REST 请求则是一种基于 HTTP 协议的轻量级架构风格。
它使用 HTTP 的方法(如 GET、POST、PUT、DELETE)来表示对资源的操作。
REST 请求的特点包括:- 简洁和轻量级:REST 利用 HTTP 协议的原生方法和头部来传递请求和响应信息,消息格式相对简洁。
- 资源导向:REST 以资源为中心,通过 URL 来标识和操作资源。
- 可读性和易用性:REST 请求使用人类可读的 URL 和 HTTP 方法,使得请求更加直观和易于理解。
选择 SOAP 请求还是 REST 请求取决于具体的应用场景和需求。
SOAP 更适合复杂的企业级应用,需要高度的可互操作性和严格的规范。
而 REST 则更适合轻量级的 Web 应用和移动应用,强调简洁性和易用性。
在实际应用中,也可以结合使用 SOAP 和 REST,根据不同的需求选择合适的协议。
SOAP协议规范1. 简介SOAP以XML形式提供了一个简单、轻量的用于在分散或分布环境中交换结构化和类型信息的机制。
SO AP本身并没有定义任何应用程序语义,如编程模型或特定语义的实现;实际上它通过提供一个有标准组件的包模型和在模块中编码数据的机制,定义了一个简单的表示应用程序语义的机制。
这使SOAP能够被用于从消息传递到RPC的各种系统。
soap包括三个部分soap封装(见第4节)结构定义了一个整体框架用来表示消息中包含什么内容,谁来处理这些内容以及这些内容是可选的或是必需的。
SOAP编码规则(见第5节)定义了用以交换应用程序定义的数据类型的实例的一系列机制。
SOAP RPC表示(见第7节)定义了一个用来表示远程过程调用和应答的协定。
虽然这三个部分都作为SOAP的一部分一起描述,但它们在功能上是相交的。
特别的,封装和编码规则是在不同的名域中定义的,这种模块性的定义方法增加了简单性在SOAP封装,SOAP编码规则和SOAPRP C协定之外,这个规范还定义了两个协议的绑定,描述了在有或没有HTTP扩展框架[6]的情况下,SOAP 消息如何包含在HTTP消息[5]中被传送。
1.1 设计目标SOAP的主要设计目标是简单性和可扩展性,这意味着传统的消息系统和分布对象系统的某些性质不是SO AP规范的一部分。
这些性质包括:分布式碎片收集成批传送消息对象引用(要求分布式碎片收集)激活机制(要求对象引用)1.2 符号约定这篇文章中的关键字 "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT","SHOULD", "S HOULD NOT", "RECOMMENDED", "MAY", 和"OPTIONAL"的解释在RFC-2119 [2]中。
这篇文章中用到的名域前缀 "SOAP-ENV" 和"SOAP-ENC"分别与"/soap/envelope/"; 和"http://sc /soap/encoding/";关联。
整篇文档中,名域前缀“xsi”被假定为与URI"/1999/XMLSchema-instance“(在XMLSchema规范[11]定义)相连。
类似的,名域前缀”xsd“被假定为与URI" /1999/XMLSchema";(在[10]中定义)相连。
名域前缀”tns“用来表示任意名域。
所有其它的名域前缀都只是例子。
名域URI的基本形式”some-URI“表示某些依赖于应用程序或上下文的URI[4]。
这个规范用扩展BNF(在RFC-2616[5] 描述)描述某些结构。
1.3 soap消息举例在这个例子中,GetLastTradePrice SOAP 请求被发往StockQuote服务。
这个请求携带一个字符串参数和ti cker符号,在SOAP应答中返回一个浮点数。
XML名域用来区分SOAP标志符和应用程序特定的标志符。
这个例子说明了在第6节中定义的HTTP绑定。
如果SOAP中管理XML负载的规则完全独立于HTTP是没有意义的,因为事实上该负载是由HTTP携带的。
在Appendix A中有更多的例子。
例1 在http请求中嵌入soap消息post /stockquote http/1.1Host:Content-Type: text/xml;charset="utf-8"Content-Length: nnnnSOAPAction:"Some-URI"<SOAP-ENV:Envelopexmlns:SOAP-ENV="/soap/envelope/";SOAP-ENV:encodingstyle="/soap/encoding/";><SOAP-ENV:Body><m:GetLastTradePrice xmlns:m="Some-URI"><symbol>DIS</symbol></m:GetLastTradePrice></SOAP-ENV:Body></SOAP-ENV:Envelope>下面是一条应答消息,包括http消息,soap消息是其具体内容: 例2 在http应答中嵌入soap消息http/1.1 200 okContent-Type: text/xml;charset="utf-8"Content-Length:nnnn<SOAP-ENV:Envelopexmlns:SOAP-ENV="/soap/envelope/";SOAP-ENV:encodingstyle="/soap/encoding/";/><SOAP-ENV:Body><m:GetLastTradePriceResponse xmlns:m="Some-URI"><Price>34.5</Price></m:GetLastTradePriceResponse></SOAP-ENV:Body></SOAP-ENV:Envelope>2. soap消息交换模型SOAP消息从发送方到接收方是单向传送,但正如上面显示的,SOAP消息经常以请求/应答的方式实现。
S OAP实现可以通过开发特定网络系统的特性来优化。
例如,HTTP绑定(见第6节)使SOAP应答消息以HTTP应答的方式传输,并使用同一个连接返回请求。
不管SOAP被绑定到哪个协议,SOAP消息采用所谓的”消息路径“发送,这使在终节点之外的中间节点可以处理消息。
一个接收SOAP消息的SOAP应用程序必须按顺序执行以下的动作来处理消息:识别应用程序想要的SOAP消息的所有部分(见4.2.2节)检验应用程序是否支持第一步中识别的消息中所有必需部分并处理它。
如果不支持,则丢弃消息(见4.4节)。
在不影响处理结果的情况下,处理器可能忽略第一步中识别出的可选部分。
如果这个SOAP应用程序不是这个消息的最终目的地,则在转发消息之前删除第一步中识别出来的所有部分。
为了正确处理一条消息或者消息的一部分,SOAP处理器需要理解:所用的交换方式(单向,请求/应答,多路发送等等),这种方式下接收者的任务,RPC机制(如果有的话)的使用(如第7节中所述),数据的表现方法或编码,还有其它必需的语义。
尽管属性(比如SOAP encodingstyle,见4.1.1节)可以用于描述一个消息的某些方面,但这个规范并不强制所有的接收方也必须有同样的属性并取同样的属性值。
举个例子,某一特定的应用可能知道一个元素表示一条遵循第7节约定的RPC请求,但是另外一些应用可能认为指向该元素的所有消息都用单向传输,而不是类似第7节的请求应答模式。
(译者注:交互双方的SOAP消息并不一定要遵循同样的格式设定,而只需要以一种双方可理解的格式交换信息就可以了)3. 与xml的关系所有的SOAP消息都使用XML形式编码(更多有关XML的信息请见[7])一个SOAP应用程序产生的消息中,所有由SOAP定义的元素和属性中必须包括正确的名域。
SOAP应用程序必须能够处理它接收到的消息中的SOAP名域(见4.4节),并且它可以处理没有SOAP名域的SOAP消息,就象它们有正确的名域一样。
SOAP定义了两个名域(更多有关XML名域的信息请见[8])soap封装的名域标志符是"/soap/envelope/";SOAP的编码规则的名域标志符是"/soap/encoding/";SOAP消息中不能包含文档类型声明,也不能包括消息处理指令。
[7] SOAP使用"ID"类型"id"属性来指定一个元素的唯一的标志符,同时该属性是局部的和无需校验的。
SOAP使用"uri-reference"类型的"href"属性指定对这个值的引用,同时该属性是局部的和无需校验的。
这样就遵从了XML规范[7],XMLSchema规范[11]和XML连接语言规范[9]的风格。
除了SOAP mustUnderstand 属性(见4.2.3节)和SOAPactor属性(见4.2.2节)之外,一般允许属性和它们的值出现在XML文档实例或Schema中(两者效果相同)。
也就是说,在DTD或Schema中声明一个缺省值或固定值和在XML文档实例中设置它的值在语义上相同。
4. soap封装SOAP消息是一个XML文档,包括一个必需的SOAP封装,一个可选的SOAP头和一个必需的SOAP体。
在这篇规范剩余部分中,提到SOAP消息时就是指这个XML文档。
这一节中定义的元素和属性的名域标志符为:"/soap/envelope/"; 。
一个SOAP消息包括以下部分:1.在表示这个消息的XML文档中,封装是顶层元素。
2.应用SOAP交换信息的各方是分散的且没有预先协定,SOAP头提供了向SOAP 消息中添加关于这条SOAP消息的某些要素(feature)的机制。
SOAP定义了少量的属性用来表明这项要素(feature)是否可选以及由谁来处理。
(见4.2节)3.SOAP体是包含消息的最终接收者想要的信息的容器(见4.3节)。
SOAP为SOAP体定义了一个Fault元素用来报告错误信息。
语法规则如下所示:封装元素名是 "envelope"在SOAP消息中必须出现。
可以包含名域声明和附加属性。
如果包含附加属性,这些属性必须限定名域。
类似的,"Envelope"可以包含附加子元素,这些也必须限定名域且跟在SOAP体元素之后。
SOAP头(见4.2节)元素名是"header"在SOAP消息中可能出现。
如果出现的话,必须是SOAP封装元素的第一个直接子元素。
SOAP头可以包含多个条目,每个都是SOAP头元素的直接子元素。
所有SOAP头的直接子元素都必须限定名域。
SOAP体(见4.3节)元素名是"body"在SOAP消息中必须出现且必须是SOAP封装元素的直接子元素。