Web服务协议的发展已从支持具有简单参数的非常简单的请求发展为完全支持现代的面向对象的语言。 XML-RPC可以说是Web服务的最早形式之一,它仅支持简单类型-字符串,整数,布尔值等。 SOAP通过其对象编码规则进一步迈出了这一步。 最后一步-改进二进制文件- 带有附件的SOAP来了。

带有附件的SOAP最初是作为SOAP 1.1的扩展引入的,并且主要的SOAP套件都支持它。 尽管SOAP 1.2(W3C官方发行版)尚不支持附件,但仍在(不久的将来)将它们包括在内的工作正在进行中。

Web服务和二进制数据

我毫不怀疑XML在应用程序集成方面的成功来自对文本编码的依赖(这与二进制协议(例如CORBA,面向对象的RPC标准或RMI,Java特定的RPC标准)相对)。 文本编码是可取的,这有几个原因,其中最关键的可能是它易于调试,并且在需要时更容易汇总特殊的实现。

尽管如此,对文本编码的依赖仍然是阴暗的一面,XML无法提供包含二进制数据的有效解决方案。 根据W3C XML Schema规范,二进制数据应以64或16进制编码。 不幸的是,64位编码的数据比未编码的数据大50%。 十六进制编码使大小加倍。 对于少量的二进制数据,此开销是可以接受的,但是对于较大的数据集,显然是个问题。

二进制数据在许多应用程序中很有用。 例如:

  • 安全应用程序需要密钥,哈希,证书和加密数据本身。
  • 多媒体应用程序可处理照片,音乐和电影。
  • 在某些应用程序中,数据的XML表示被认为效率太低-想到了CAD / CAM。
  • 成千上万种文件格式早于XML:文字处理,电子表格,字体,矢量图形,家谱等。

尽管可以创建这些文件格式的XML版本(类似于矢量图形的SVG),但是二进制数据已经存在了很长时间,并且可能会继续流行。

最后,还有XML本身的问题! 在另一个XML文档中包含一个XML文档并非易事(语法正确的解决方案依赖于CDATA部分和字符转义)。

MIME和基础64

为了消除经常引起混淆的原因,MIME不强制使用base 64编码。 具体来说,HTTP实现不对附件进行编码。 仅邮件客户端对附件进行编码以解决SMTP中的限制(因此与XML相比没有任何好处)。

为了满足所有这些应用程序的需求,Web服务必须有效地支持二进制数据。 所提出的解决方案是带有附件的SOAP,概括地说,该附件从XML有效负载中除去二进制信息,并将其作为multipart/related MIME内容直接存储在HTTP请求中。

在设计适用于二进制数据的Web服务时,您的选择是:

  • 如果数据集很小,则可以考虑在XML有效载荷内使用base 64编码; 对于小型数据集,开销较少。
  • 如果数据集更大,则附件是唯一可行的选择。

清单1是带有基本64编码参数的SOAP请求。 注意address元素。

清单1.基本的64编码参数
POST /ws/retrieve HTTP/1.0
Content-Type: text/xml; charset=utf-8
Accept: application/soap+xml multipart/related, text/*
Host: localhost:8080
SOAPAction: ""
Content-Length: 540<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"xmlns:xsd="http://www.w3.org/2001/XMLSchema"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><soapenv:Body><ps:retrieve soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"xmlns:ps="http://psol.com/2004/ws/retrieve"><address xsi:type="xsd:base64Binary">d3d3Lm1hcmNoYWwuY29t</address></ps:retrieve></soapenv:Body>
</soapenv:Envelope>

实施附件

Java开发人员可以通过JAX-RPC(基于XML的RPC的Java API)和SAAJ(带有Java的带有附件API的SOAP)获得附件。 不要让SAAJ的首字母缩写欺骗您:JAX-RPC支持附件( 有关示例,请参阅参考资料 )。 JAX-RPC和SAAJ之间的区别在于抽象级别,而不是功能。

JAX-RPC是比SAAJ更抽象的高级API。 它在RMI层后面隐藏了SOAP的大多数面向协议的方面。 开发人员使用Java对象,预处理器将它们转换为SOAP节点。 JAX-RPC使用java.awt.Imagejavax.activation.DataHandler类来表示附件。

SAAJ更接近该协议。 使用SAAJ创建SOAP消息比使用JAX-RPC花费更多的工作(此外,它不提供到WSDL的自动链接),因此在大多数情况下,您将需要使用JAX-RPC。 SAAJ的低级方面仍然使其更适合说明附件的实际工作方式。 清单2是带有附件的SOAP请求。 该请求要求服务器调整照片大小; 因为照片文件很大,所以附件的效率更高。

清单2.附件参数
POST /ws/resize HTTP/1.0
Content-Type: multipart/related; type="text/xml"; start="<EB6FC7EDE9EF4E510F641C481A9FF1F3>"; boundary="----=_Part_0_7145370.1075485514903"
Accept: application/soap+xml, multipart/related, text/*
Host: localhost:8080
SOAPAction: ""
Content-Length: 1506005------=_Part_0_7145370.1075485514903
Content-Type: text/xml; charset=UTF-8
Content-Transfer-Encoding: binary
Content-Id: <EB6FC7EDE9EF4E510F641C481A9FF1F3><?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><soapenv:Body><ps:resize soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ps="http://psol.com/2004/ws/resize" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"><source href="cid:E1A97E9D40359F85CA19D1B8A7C52AA3"/><percent>20</percent></ps:resize></soapenv:Body>
</soapenv:Envelope>------=_Part_0_7145370.1075485514903
Content-Type: image/jpeg
Content-Transfer-Encoding: binary
Content-Id: <E1A97E9D40359F85CA19D1B8A7C52AA3>note: binary data deleted...------=_Part_0_7145370.1075485514903--

清单3展示了SOAP请求的创建。 该请求要求服务器调整图像大小。 步骤如下:

  • 通过工厂创建SOAP连接和SOAP消息对象。
  • 从消息对象检索消息主体(中间步骤:检索SOAP部分和信封)。
  • 创建一个新的XML元素来表示请求并设置编码样式。
  • 创建附件并使用DataHandler对象对其进行初始化。
  • 创建更多的元素来表示两个参数( sourcepercent )。
  • 通过添加href属性,将附件与第一个参数相关联。 附件通过cid (内容ID)URL引用。
  • 将第二个参数的值直接设置为文本,然后调用服务。

该服务再次将调整后的图像作为附件进行回复。 要检索它,您可以测试SOAP错误(指示错误)。 如果没有故障,请以文件形式检索附件并进行处理。

清单3.使用SAAJ
public File resize(String endPoint,File file)
{SOAPConnection connection =SOAPConnectionFactory.newInstance().createConnection();SOAPMessage message = MessageFactory.newInstance().createMessage();SOAPPart part = message.getSOAPPart();SOAPEnvelope envelope = part.getEnvelope();SOAPBody body = envelope.getBody();SOAPBodyElement operation =body.addBodyElement(envelope.createName("resize","ps","http://psol.com/2004/ws/resize"));operation.setEncodingStyle("http://schemas.xmlsoap.org/soap/encoding/");DataHandler dh = new DataHandler(new FileDataSource(file));AttachmentPart attachment = message.createAttachmentPart(dh);SOAPElement source = operation.addChildElement("source",""),percent = operation.addChildElement("percent","");message.addAttachmentPart(attachment);source.addAttribute(envelope.createName("href"),"cid:" + attachment.getContentId());width.addTextNode("20");SOAPMessage result = connection.call(message,endPoint);part = result.getSOAPPart();envelope = part.getEnvelope();body = envelope.getBody();if(!body.hasFault()){Iterator iterator = result.getAttachments();if(iterator.hasNext()){dh = ((AttachmentPart)iterator.next()).getDataHandler();String fname = dh.getName();if(null != fname)return new File(fname);}}return null;
}

请注意, 清单3清楚地表明附件是XML消息之外 ! 这对于提高效率是必要的。

谈到效率,看一看清单4,其示出比较常见(且显着更短)的JAX-RPC版本清单3 。 JAX-RPC预编译器生成一个存根,大大简化了编码。 您将DataHandler对象作为方法参数传递,并且JAX-RPC自动生成附件。

清单4.更有效的JAX-RPC
public File resize(File file)throws ServiceException, RemoteException
{AttachmentService service = new AttachmentServiceLocator();AttachmentTip port = service.getAttachmentTip();   // get stubDataHandler dh = new DataHandler(new FileDataSource(file));DataHandler result = port.resize(dh,20);return new File(result.getName());
}

结论

选择是好的,而SOAP在处理二进制数据时为您提供了选择:您可以将其编码为XML有效载荷内的base 64,这对于小型数据集而言是好的,或者可以将较大的二进制文件(未编码)附加到请求中。


翻译自: https://www.ibm.com/developerworks/xml/library/x-tippass/index.html

将文件传递到Web服务相关推荐

  1. Docker安装Apache与运行简单的web服务——httpd helloworld

    Docker运行简单的web服务--httpd helloworld目录[阅读时间:约5分钟] 一.Docker简介 二.Docker的安装与配置[CentOS环境] 三.Docker运行简单的web ...

  2. nodejs静态web服务

    项目准备 Web 服务器一般指网站服务器,是指驻留于因特网上某种类型计算机的程序,可以向浏览器等 Web 客户端提供文档,也可以放置网站文件,让全世界浏览:可以放置数据文件,让全世界下载.目前最主流的 ...

  3. java url json字符串_使用HttpClient将URL中的JSON查询字符串发送到Web服务(Java)

    我有一个我建立的Web服务...我现在要做的是发送一个简单的请求,其中包含一个从Tapestry Web应用程序到该Web服务的json查询字符串.我四处搜索,大多数人都说使用Apache HttpC ...

  4. JAX-WS Web 服务开发调用和数据传输分析

    一. 开发服务 新建maven的web项目就可以了, 1.新建一个web服务 2.服务名称定义 3.更改配置 4.默认建好的服务文件 5.增加一个add的服务 import javax.jws.Web ...

  5. java axis2 开发_基于Apache axis2开发Java Web服务

    1.安装配置axis2环境 下载好后把axis2-1.4.1-war目录下面的axis2.war发布到tomcat的webapps中. 发布好,访问:http://localhost:8079/axi ...

  6. lvs服务器需要开启web服务么_Nginx+Keepalived实现web服务器高可用

    1.Nginx 业务背景 现公司需求快速搭建web服务器,对外提供给用户web服务. 需求拆分 需要基于http协议的软件,搭建服务实现 介绍 常见用法: 1) web服务器软件 httpd http ...

  7. flask url构建_如何为生产构建构建Flask-RESTPlus Web服务

    flask url构建 by Greg Obinna 由格雷格·奥比纳(Greg Obinna) 如何为生产构建构建Flask-RESTPlus Web服务 (How to structure a F ...

  8. java怎么返回xml_java – 如何从Web服务返回XML

    这可能是疯狂/愚蠢/愚蠢/冗长的问题之一,因为我是网络服务的新手. 我想写一个Web服务,它将以 XML格式返回答案(我正在使用我的服务进行YUI自动完成).我正在使用 Eclipse和Axis2并遵 ...

  9. Zabbix(六):项目实战之--自动发现nginx调度器及后端web服务集群、自定义参数监控...

    项目: 1.自动发现nginx调度器及后端apache构建的web服务集群: 2.使用自定义参数监控调度器上nginx服务的相关统计数据及速率数据: 3.使用自定义参数监控后端apache服务的相关统 ...

最新文章

  1. BestCoder25 1001.Harry and Magical Computer(hdu 5154) 解题报告
  2. 【数据竞赛】“达观杯”文本智能处理挑战赛3
  3. Python-OpenCV 参考文档
  4. scratch desktop的基本使用 - 舞台坐标系
  5. java B2B2C springmvc mybatis电子商务平台源码-------zuul网关实现
  6. python入门——P49乱入:生成器
  7. pclose与fclose的区别
  8. revit API 实现可停靠窗口
  9. 【转】Apache+php+mysql在windows下的安装与配置图解(最新版)
  10. 2020年MySQL数据库面试题(50道题含答案和思维导图总结)
  11. 视频教程-HTML零基础经典入门视频-HTML5/CSS
  12. 图(3)——邻接链表法
  13. c语言qq自动回复,QQ自动回复
  14. 苹果电脑快速重装Windows系统
  15. 【无线电】摩尔斯电码的快速记忆法
  16. 服务器对接qq微信聊天,java仿QQ微信聊天室功能的实现
  17. 知到python课程答案-智慧树知到APPPython数据分析与数据可视化网课答案
  18. Python自然语言处理 | 编写结构化程序
  19. 各类行业资源学习资料大全
  20. HTML5利用canvas画布绘制哆啦A梦

热门文章

  1. 计算机科学导论实验(六)
  2. 有声小说php源码,魅雅有声小说联盟程序 v5.0(PHP免费版)
  3. ddd java repository_初探领域驱动设计(2)Repository在DDD中的应用
  4. 从 C++ 定义 QML 类型
  5. wifidog java_GitHub - FangStarNet/wifidog-java-portal: 由 Java 实现的 WiFiDog 认证服务
  6. Matlab:Matlab软件界面的简介(上边菜单栏、中间工作区、右栏、底部栏、运行图像结果栏)、使用方法之详细攻略
  7. 浪潮ERP GS 6.0安装教程
  8. C# modbus通信协议
  9. 六轴EtherCAT总线伺服涂布收卷机程序,采用六个伺服+变频器+编码器,动态测量频率
  10. UWB定位技术的特点与优势