使用 WebSphere DataPower SOA Appliances 实现支持 JSON 的 Web 2.0 RESTful facade

本文将展示如何在 WebSphere DataPower Appliance 上构建一个支持 JSON 的 RESTful 服务,将其与一个 SOAPful 后端 Web 服务连接起来。文章提供了样例 REST/JSON 代码来演示最佳实践,并解释了代码的实现和配置过程。

Brien H. Muschett, 高级软件工程师, DataPower Development Team, IBM

Brien Muschett 是 DataPower Development Team 的一名高级软件工程师,从事 IBM 软件开发已有 16 年。在此期间,他为嵌入式、桌面和服务器环境开发了软件解决方案。他的专长领域包括操作系统开发、语音识别和语音合成开发,以及 ESB 开发。



2010 年 4 月 12 日

简介

具象状态传输(Representational State Transfer,REST)是一项重要的 Web 2.0 技术,开始成为其他基于 Web 的服务的流行替代选择,比如基于 SOAP 的 Web 服务和 Enterprise JavaBeans (EJB)。许多面向 Internet 的公司提供了基于 REST 的服务;一个常见场景就是对现有的遗留或对等(peer)系统(SOAPful 服务)公开一个 RESTful 接口。本文简要解释了 “RESTful” 的含义,并提供了一个详细的例子演示如何使用 IBM® WebSphere® DataPower® XS40 或 XI50 SOA Appliance 公开一个 RESTful facade(使用 JSON 作为表示格式),从而与现有的 SOAPful Web 服务建立联系。

Web 2.0 催生了许多新技术;其中一些是全新的,而另外一些则早就存在,但是在被应用到 Web 2.0 后焕发了新生命。人们越来越多地需要使用这些新的协议和技术与现有的企业系统交互。DataPower 在连接 Web 2.0 和 SOA 方面具有独特的优势。DataPower 可以服务 Web 2.0 请求,比如 ATOM feed 消息或一个 REST 调用,并连接到企业协议,比如 Web 服务、JMS,甚至大型机连接(例如,使用 IMS Connect)。本文侧重于将 REST 客户机请求(使用 JSON 作为表示格式)连接到传统的 SOAPful Web 服务后端系统。

REST 概述

REST 一词由 Roy Fielding 在其博士论文中提出,它表示一种面向处理多媒体内容的 Web 服务和应用程序的架构样式。它可以被看作是一组使用 HTTP 规范(RFC 2616)作为应用程序层协议的最佳实践。不存在任何标准或 API,并且主要的内容来自于所有基于 HTTP 的 Web 应用程序和服务。可以将 REST 贴切地比喻为 “面向对象的” Web 编程,其中,由 URI 指定的资源相当于对象。由 HTTP 动词指定方法,由 HTTP 头部指定参数,比如 Accept 或 URI 查询。最后,HTTP 响应代码相当于返回代码。例如,下面的 RESTful HTTP 请求将产生 HTTP 201(生成的)响应代码:

PUT /library/book/9780596529260 HTTP 1.1
Content-Type: application/json
Accept: text/xml
....
{ "name" : "Treasure Island }

Web 服务提供商(以及消费者)将密切关注以下 RESTful 准则:

命名的资源
计算将针对通过 URI 命名的 Web 资源进行。
  • 资源是指非常重要以至于需要引用其自身的内容,比如 /software/releases/1.0.3.tar.gz、/weblog/jim/2008/12/24/0300 或 /bug/12345。
  • 消费者通过他们的 URI 和统一接口与资源进行交互。
统一接口
Web 资源通过一个模仿 CRUD 持久存储模式的通用接口访问:
  • GET —— 检索资源表示。
  • POST —— 创建一个新资源。
  • PUT —— 修改或创建一个新资源(如果客户机可以生成 URI 的话)。
  • DELETE —— 删除一个现有资源。
  • HEAD —— 检索只包含元数据的表示(可以仅仅为头部)。
相互连接的资源表示
URL 链接将资源彼此连接起来,从而驱动所有状态传输。
  • 表示形式为超媒体(考虑到其 XHTML 和微格式二元性)。
  • 资源网络。
  • 公理:“超媒体相当于应用程序状态的引擎。” —— Roy Fielding。
  • 因此应用程序状态应当是客户机应当按照的路径,而不是服务器上的 HTTP 会话。
  • Cookies 破坏了状态传输的 REST 模型。
无状态
每个请求都是独立的,与服务器的状态没有关系。
  • 服务器的状态通过 URI 可寻址资源表示。
  • 每一个 HTTP 请求完全独立发生,不需要依赖此前的请求。
  • 客户机通过导航表示格式(URI)或访问已知的航点来在状态之间移动。
  • 将 FTP “工作目录” 看作是一个类比。
  • 跨负载平衡服务轻松分发无状态应用程序。
  • 客户机负责管理 “应用程序状态”,而服务器负责管理 “资源状态”。

应用 RESTful 准则的结果不仅仅是实现了简单、一致的开发和 Web 服务调用,而且提升了服务性能。在部署 RESTful 服务时,它们可以自然地参与到 HTTP 缓存机制中。因此,缓存中间件或响应缓存可以利用额外的信息,这些信息不仅由 HTTP 方法提供,还由 RESTful 服务提供者呈现的缓存控制头部(包括最近修改的头部)提供。通过这种方式利用缓存可以极大地改善响应时间。此外,RESTful 服务的无状态特性不仅使得横向扩展变得简单,还减轻了负载平衡负担(无需会话亲缘性),并且允许可以感知应用程序的缓存中间件能够更有效地执行,这是因为通常不需要处理或解析有效负荷。

使用 DataPower 公开 REST

图 1 概览了 WebSphere DataPower 以 SOAPful Web 服务作为后端公开 REST facade 的过程。REST facade 使用 JSON 作为表示格式(媒体类型)。多协议网关接受来自服务消费者的 RESTful 方法请求 (GET, PUT, POST, DELETE),然后将请求转换为相应的 SOAP 请求,后者被发送到 WS-Proxy。WS-Proxy 是可选的;SOAP 请求可以被直接发送到后端,但是强烈建议不要这样做,因为配置在将来可能需要监视或确保安全性。因此,一项最佳实践就是包含 WS-Proxy 作为 REST 转换配置的一部分。

图 1. 将 JSON 传递到 DataPower 的 RESTful 客户机的拓扑,DataPower 充当 SOAPful Web 服务的代理
RESTful facade 拓扑

DemoService 示例

本文其余部分将使用一个常见的例子来展示 DataPower 如何针对 SOAPful Web 服务后端公开 RESTful Web 服务接口(支持 JSON)。样例 DemoService Web 服务是一个简单的项目组织器,通过它可以创建、编辑和查询项目。DemoService 提供了以下操作:

DemoService 的操作
操作描述
createProject在服务器上创建一个项目,其中包含项目名、描述和标识符。标识符在响应中生成并返回。
updateProject对项目做出修改。必须提供项目标识符、名称和描述。
getProject获取项目的名称和描述。必须在请求中提供项目的标识符。
listProject返回所有项目。
deleteProject从服务器中删除一个项目。必须在请求中提供项目的标识符。

下面的小节将展示如何将这些操作映射到一个 REST 接口中,后者提供了所有 HTTP 方法,即 GET、POST、PUT 和 DELETE。

安装 DemoService

在本文末尾 下载样例 DemoService 应用程序,然后按照以下步骤在 WebSphere Application Server V6.1 上安装 DemoService.ear:

  1. 从 Admin 控制台中,选择 Applications => Install New Application。
  2. 选择 Browse 并选择 DemoService EAR,如下面的图 2 所示。
  3. 选择 Next
    图 2. 安装 DemoService 应用程序
    安装 DemoService 应用程序
  4. 单击左侧菜单的 Step 3,然后单击 Finish
  5. 完成安装后,单击 Save

设置 WS-Proxy

按照以下步骤手动创建 WS-Proxy:

  1. 从 DataPower 控制面板中,选择Web Service Proxy => Add
  2. 输入 demo-service-proxy 作为名称,并选择 Create Web service proxy
  3. 上传 demoService.wsdl 文件(包含在下载文件中),选择 off 作为 WS-Policy References,然后单击 Next,如下面的图 3 所示。
    图 3. WS-Proxy 配置
    WS-Proxy 配置
  4. 选择 Local Endpoint Handler 和 HTTP Front Side Handler 下的 + 号。
  5. 输入 http-9080 作为 Name,并输入 9080 作为 Port Number,然后单击 Apply
  6. 回到 WS-Proxy 配置面板,选择 Edit/Remove 下面的 Add,然后单击底部的 Next
  7. 保存配置。这就完成了 WS-Proxy 的配置。

导入样例 DataPower 配置

要将 DataPower 配置导入到 XS40 或 XI50 装置:

  1. 在 DataPower Admin Console 中,选择 Administration => Configuration => Import Configuration
  2. 单击 Browse,选择 web20restjson_dwa_export.zip(包含在下载文件中),然后选择 Next
    图 4. DataPower 域导入
    图 4. DataPower 域导入
  3. 选择 Import

REST Multi-Protocol Gateway

如果通过选择 Advanced 选项卡检查 Multi-Protocol Gateway 服务定义的话,会看到一个选择标签 “Process messages whose body is empty”,如下面的图 5 所示。这个选项可以用于那些包含无内容体(bodiless)的请求和响应的消息模式。这对于 RESTful Web 服务非常普遍,其中的消息可能包含也可能不包含内容体,但是仍然需要运行处理策略来执行代理(mediation)。与始终包含有效负荷(消息体)的 SOAPful Web 服务不同的是,RESTful Web 服务和 HTTP DELETE 类似,在通常情况下会包含消息体,但并不总是如此。

由于我们的 RESTful facade 将支持 HTTP DELETE 和 GET,您必须配置服务来支持无内容体的消息。如果没有选择该选项的话,DataPower 默认选择名为 “One way exchange pattern” 的处理模式,在这种模式下,消息直接流向后端服务器,而绕过了任何处理规则。您还需要配置 HTTP 前端处理器,以接受计划在策略中提供支持的 HTTP 方法。此外,由于采用 JSON 作为表示格式,请求和响应的有效负荷类型将为非 XML。

图 5. 处理包含空消息体的消息
处理包含空消息体的消息

重写 URL

DemoService 指定 /DemoService/services/localDemoServiceSOAP 作为服务 URI,而 RESTful Web 服务使用 URI 作为资源而不是服务终端来应用统一的接口。由于存在这种显著的使用差异,一个 URL 重写策略被关联到多协议网关,如下面的图 6 所示。通过这种方式,所有传入的 RESTful URI 都被重写到单一 SOAP 服务 URI 中。

图 6. 关联到多协议网关的 URL 重写策略
关联到多协议网关的 URL 重写策略

使用 REST 动词

在构建一个 RESTful 服务时,一个最佳实践就是为每个 HTTP 方法确定处理规则。这是因为 REST 统一接口可能被应用到每个 RESTful URI,但是需要不同的处理行为,比如需要对 /library/book/12345679001 执行 HTTP DELETE,而对 /library/book/12345679001 执行 HTTP GET。

通过创建一个 Match Action - Matching Rule 并随后为服务支持的每个 REST 动词指定 “HTTP Method” 的匹配类型,多协议网关就可以匹配 HTTP 方法。如下面的图 7 所示。这种匹配规则可以结合任何其他匹配条件,从而可以根据 URI 和/或 HTTP 头部创建个性化的处理规则。

图 7. 多协议网关使用 HTTP 方法匹配规则
多协议网关使用 HTTP 方法匹配规则

下面的小节将描述图 8 所示的 REST Multi-Protocol Gateway 策略的实现。它们可以作为 DataPower REST 开发的一次练习,可以将它们用作一个有效的配置来了解其他 REST 项目,或仅仅是了解如何使用 DataPower 从 REST/JSON 转换到 SOAP。

图 8. REST/JSON 处理策略
REST/JSON 处理策略

下面的小节将介绍每种 DataPower 处理规则:POST、GET、DELETE 和 PUT。每种处理规则的实现都使用相同的格式描述,其中包括:

  • Request payload:REST 请求有效负荷的示例,使用 JSON 作为表示格式。
  • Response payload:REST 响应有效负荷或头部的示例。
  • Actions:包括一个通过处理操作来表示处理规则的图像。编号表示处理操作的顺序。
  • Code listings:用于规则中定义的样式表。每个清单都根据对应的 Actions 图中的序列号进行编号。
  • Curl command:一个示例 Curl 命令,用于调用具有相应 HTTP 方法的 REST 服务。

POST

POST 处理规则与 SOAP API 的 createProject 操作对应。

  • Request payload:JSON 项目对象
    清单 1. POST 请求有效负荷
    { "description":"Research of ancient cultures", "owner":"Alice" }
  • Response payload:无,但是 Location HTTP 头部应当提供新创建的资源的 URL。
  • Actions:
    图 9. POST 请求处理规则
    POST 请求处理规则

    (1) convert-http action:这个 http-convert 操作将 JSON(如图 10 所示)指定为消息编码方式,它将自动解析并将消息转换为 JSONx,这是一种 IBM 内部标准格式,用于将 JSON 表示为 XML。当将 JSON 转换为 JSONx 后,就可以使用常见的 DataPower 转换功能进一步以 XML 格式处理消息,如果必要的话。对于清单 1 中所示的 JSON 请求,生成的 JSONx 将如清单 2 所示:

    清单 2. JSONx
    <?xml version="1.0" encoding="UTF-8"?>
    <json:object xsi:schemaLocation="http://www.datapower.com/schemas/json jsonx.xsd"
                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xmlns:json="http://www.ibm.com/xmlns/prod/2009/jsonx">
      <json:string name="description">Research of ancient cultures</json:string>
      <json:string name="owner">Alice</json:string>
    </json:object>
    图 10. 指定为默认的输入编码方式的 JSON
    指定为默认的输入编码方式的 JSON

    (2) createProjJSONx2SOAP.xsl transform:由用户提供的定制样式表将 REST 项目有效负荷(现在为 JSONx)转换为等效的 SOAP 有效负荷。项目描述和所有者均复制自 JSONx 消息请求。

    清单 3. createProjJSONx2SOAP.xsl
    <?xml version="1.0" encoding="UTF-8"?<
    <xsl:stylesheet
    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:dp="http://www.datapower.com/extensions"
    xmlns:dpquery="http://www.datapower.com/param/query"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:json="http://www.ibm.com/xmlns/prod/2009/jsonx"
    extension-element-prefixes="dp" exclude-result-prefixes="dp"
    version="1.0"<
      <xsl:template match="/"<
        <soapenv:Envelope
        xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
        xmlns:demo="http://datapower.ibm.com/demoService/"<
          <soapenv:Header /<
    
          <soapenv:Body<
            <demo:createProjectRequest<
              <demo:newProject<
                <demo:name<
                  <xsl:value-of
                  select="/json:object/json:string[@name='description']" /<
                </demo:name<
    
                <demo:owner<
                  <xsl:value-of
                  select="/json:object/json:string[@name='owner']" /<
                </demo:owner<
              </demo:newProject<
            </demo:createProjectRequest<
          </soapenv:Body<
        </soapenv:Envelope<
      </xsl:template<
    </xsl:stylesheet<

    (3) Setvar action:在消息被发送到 demoService Web 服务代理之前,此操作将 SOAPAction 头部设置为 http://datapower.ibm.com/demoService/createProject。

    POST response rule: set-location-header.xsl transform:这个样式表从 SOAP 响应选择 ID,并用新创建的资源的 URL 设置 Location HTTP 头部。

    清单 4. set-location-header.xsl
    <?xml version="1.0" encoding="UTF-8"?<
    <xsl:stylesheet
      xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
      xmlns:dp="http://www.datapower.com/extensions"
      xmlns:dpquery="http://www.datapower.com/param/query"    
      xmlns:prot="http://www.ibm.com/schema/twss/prototype"
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
      extension-element-prefixes="dp"
      exclude-result-prefixes="dp"
      version="1.0"<
        
      <xsl:template match="/"<
       <xsl:variable name="quote"<'</xsl:variable< 
       <xsl:variable name="message" select="//*[local-name()='successMessage']/text()" /<
       <xsl:variable name="id_begin" select="substring-after($message, $quote)" /<
       <xsl:variable name="id" select="substring-before($id_begin,$quote)" /<  
       <dp:set-http-response-header name="'Location'" value="concat('/projects/',$id)" /<
      </xsl:template<
        
    </xsl:stylesheet<

    样例 JSON 请求用来测试清单 1 中提供的 POST REST 方法。有效负荷被保存为 RESTPostRequest.json。要将请求发送到 DataPower,使用下面的 Curl 命令:

    curl --data-binary @RESTPostRequest.json http://DPHOST:4801/projects/2 -v

    -v 标记使您能够查看由 DataPower 返回的头部。其中不包含响应有效负荷,但是请特别注意 Location 头部,它返回新创建的项目的 URL。例如,在创建第 3 个项目时将返回 /projects/3。

GET

GET 处理规则与 SOAP API 的 getProject 和 listProject 操作对应。它可以接收一个单个项目或是一个项目列表(集合)。

  • Request payload:无。
  • Response payload:JSON Project,JSON Project List
    清单 5. GET JSON 项目响应有效负荷
    { "id":2, "name":"Astronomy Project", "owner":"Jennifer" }
    清单 6. GET JSON 项目列表响应有效负荷
    [ { "id":2, "name":"Astronomy Project", "owner":"Jennifer" } ]
  • Actions:
    图 11. GET 处理规则
    GET 处理规则

    (1) rest-get-to-soap.xsl transform:样式表构造 SOAP 请求以获得一个项目或列出所有项目。它与 getProject 和 listProject SOAP 操作对应。将从 URL 获得 ID,然后获得 listProjectRequest 或 getProjectRequest SOAP 有效负荷。

    清单 7. rest-get-to-soap.xsl
    <xsl:stylesheet
        xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
        xmlns:dp="http://www.datapower.com/extensions"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        extension-element-prefixes="dp"
        exclude-result-prefixes="dp"
        version="1.1"<
    
        <xsl:template match="/"<
            
            <xsl:variable name="url" select="dp:variable('var://service/URI')"/<
            
            <xsl:choose<
                <xsl:when test="$url = '/projects'"<
                    <soapenv:Envelope 
            xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
            xmlns:dem="http://soap.example.com/demoService/"<
                        <soapenv:Header/<
                        <soapenv:Body<
                          <dem:listProjectsRequest<</dem:listProjectsRequest<
                        </soapenv:Body<
                    </soapenv:Envelope<
                    
                    <dp:set-variable name="'var://context/rest/soap-action'" 
                            value="'http://soap.example.com/demoService/listProjects'"/<
                    
                </xsl:when<
                <xsl:otherwise<
                    <xsl:variable name="id" select="substring-after($url,'/projects/')"/<
                    <soapenv:Envelope 
            xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
            xmlns:dem="http://soap.example.com/demoService/"<
                        <soapenv:Header/<
                        <soapenv:Body<
                            <dem:getProjectRequest<
                              <dem:id<<xsl:value-of select="$id"/<</dem:id<
                            </dem:getProjectRequest<
                        </soapenv:Body<
                    </soapenv:Envelope<
                    
                    <dp:set-variable name="'var://context/rest/soap-action'" 
            value="'http://soap.example.com/demoService/getProject'"/<
                    
                </xsl:otherwise<
            </xsl:choose< 
        </xsl:template<
    </xsl:stylesheet<

    (2) Setvar action:在消息被发送给 demoService Web 服务代理之前,此操作将 SOAPAction 头部设置为 http://datapower.ibm.com/demoService/listProject。

    (3) Method Rewrite advanced processing action:在将 SOAP 消息发送给后端之前,需要将 HTTP 方法从初始的 GET 方法重写为 HTTP POST,后者是 SOAP 服务期望使用的方法。可以通过使用 Method Rewrite 高级处理操作完成此过程。甚至可以通过将 var://service/protocol-method 设置为 POST 来完成。

    GET response rule(1) listProjResp2JSONx.xsl:一旦从后端检索到 SOAP 响应的话,它需要被转换为 JSONx RESTful 有效负荷。将从输入 SOAP 消息检索项目 ID、描述和所有者,并用于构建 JSONx REST 响应。如果返回的是项目列表,则重复此过程。

    清单 8. listProjRest2JSONx.xsl
    <?xml version="1.0" encoding="UTF-8"?<
    <xsl:stylesheet xmlns:dp="http://www.datapower.com/extensions"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    extension-element-prefixes="dp" exclude-result-prefixes="dp"
    version="1.0"<
      <xsl:template match="/"<
        <json:array
        xsi:schemaLocation="http://www.datapower.com/schemas/json jsonx.xsd"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:json="http://www.ibm.com/xmlns/prod/2009/jsonx"<
          <xsl:for-each select="//*[local-name()='project']"<
            <json:object<
              <json:number name="id"<
                <xsl:value-of select="*[local-name()='id']" /<
              </json:number<			
              <json:string name="name"<
                <xsl:value-of select="*[local-name()='name']" /<
              </json:string<
    
              <json:string name="owner"<
                <xsl:value-of select="*[local-name()='owner']" /<
              </json:string<
            </json:object<
          </xsl:for-each<
        </json:array<
      </xsl:template<
    </xsl:stylesheet<

    GET response rule(2) jsonx2json.xsl:现在您已经将有效负荷转换为 JSONx,应用由 DataPower 提供的 jsonx2json.xsl 样式表来将结果转换为 JSON,后者是客户机所要求的格式。要将一个 GET 请求发送到 DataPower,使用下面的 Curl 命令(项目 ID 为 2):

    curl -G http://DPHOST:4081/projects/2

    要发送 GET 请求以获得所有项目的列表,使用以下 Curl 命令。项目 ID 被省略:

    curl -G http://DPHOST:4081/projects

DELETE

DELETE 处理规则与 SOAP API 的 removeProject 操作对应。

  • Request payload:无。
  • Response payload:HTTP 204(无内容)响应代码。
  • Actions:
    图 12. DELETE 处理规则
    DELETE 处理规则

    (1) rest-delete-to-soap.xsl transform:这个样式表构造 SOAP 有效负荷以删除项目。它与 deleteProject SOAP 操作对应。从 URL 中检索项目 ID 并用其构造 SOAP 有效负荷。

    清单 9. rest-delete-to-soap.xsl
    <?xml version="1.0" encoding="UTF-8"?<
    <xsl:stylesheet
        xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
        xmlns:dp="http://www.datapower.com/extensions"
        xmlns:dpquery="http://www.datapower.com/param/query"    
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        extension-element-prefixes="dp"
        exclude-result-prefixes="dp"
        version="1.0"<
        
        <xsl:template match="/"<
            
            <xsl:variable name="url" select="dp:variable('var://service/URL-in')"/<
            <xsl:variable name="id" select="substring-after($url,'/projects/')"/<
            
            <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
    				xmlns:demo="http://datapower.ibm.com/demoService/"<
                <soapenv:Header/<
                <soapenv:Body<
                    <demo:deleteProjectRequest<
                        <demo:id<<xsl:value-of select="$id"/<</demo:id<
                    </demo:deleteProjectRequest<
                </soapenv:Body<
            </soapenv:Envelope<
        </xsl:template<
    </xsl:stylesheet<

    (2) Setvar action:在消息被发送到 demoService Web 服务代理之前,此操作将 SOAPAction 头部设置为 http://datapower.ibm.com/demoService/deleteProject。

    (3) Method Rewrite advanced processing action:在将 SOAP 消息发送到后端之前,需要将 HTTP 方法从初始的 DELETE 重写为 HTTP POST,后者是 SOAP 服务所要求的操作。通过使用 Method Rewrite 高级处理操作可以实现此目的。甚至可以通过将 var://service/protocol-method 设置为 POST 完成此操作。

    DELETE response rule(1) set-response-code.xsl:从后端检索到 SOAP 后,需要将其转换为 RESTful 响应码,在执行 DELETE 时,响应码通常为 204(无内容)。要将 DELETE 请求发送到 DataPower,使用下面的 Curl 命令:

    curl -X DELETE http://DPHOST:4801/projects/2

PUT

PUT 处理规则与 SOAP API 的 updateProject 操作对应。

  • Request payload:JSON 项目对象
    清单 10. PUT 请求有效负荷
    { "id":2, "name":"Astronomy Project", "owner":"Jennifer" }
  • Response payload:无。
  • Actions:
    图 13. Put 处理规则
    Put 处理规则

    (1) convert-http action:这个 http-convert 操作将 JSON 指定为消息编码方式,这种方式将自动解析消息并将其转换为 JSONx,这是一种用于将 JSON 表示为 XML 的 IBM 内部标准格式。当 JSON 被转换为 JSONx 后,如有需要,可以使用常见的 DataPower 转换功能进一步处理消息。

    (2) updateProjJSONx2SOAP.xsl transform:这个样式表将 REST JSONx 项目有效负荷转换为等效的 SOAP 有效负荷。将从 JSONx REST 请求复制项目 ID、项目描述和所有者。

    清单 11. updateProjJSONx2SOAP.xsl
    <?xml version="1.0" encoding="UTF-8"?<
    <xsl:stylesheet
    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:dp="http://www.datapower.com/extensions"
    xmlns:dpquery="http://www.datapower.com/param/query"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:json="http://www.ibm.com/xmlns/prod/2009/jsonx"
    extension-element-prefixes="dp" exclude-result-prefixes="dp"
    version="1.0"<
      <xsl:template match="/"<
        <soapenv:Envelope
        xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
        xmlns:demo="http://datapower.ibm.com/demoService/"<
          <soapenv:Header /<
          <soapenv:Body<
            <demo:updateProjectRequest<
              <demo:project<
                <demo:id<
                  <xsl:value-of
                  select="/json:object/json:string[@name='id']" /<
                </demo:id<
                <demo:name<
                  <xsl:value-of
                  select="/json:object/json:string[@name='description']" /<
                </demo:name<
                <demo:owner<
                  <xsl:value-of
                  select="/json:object/json:string[@name='owner']" /<
                </demo:owner<
              </demo:project<
            </demo:updateProjectRequest<
          </soapenv:Body<
        </soapenv:Envelope<
      </xsl:template<
    </xsl:stylesheet<

    (3) Setvar action:在将消息发送到 demoService Web 服务代理后,此操作将 SOAPAction 头部设置为 http://datapower.ibm.com/demoService/updateProject。

    (4) Method Rewrite advanced processing action:在将 SOAP 消息发送到后端之前,需要将 HTTP 方法从初始的 PUT 重写为 HTTP POST,后者是 SOAP 服务所期望的方法。通过使用 Method Rewrite 高级处理操作可以实现此过程,或者通过将 var://service/protocol-method 设置为值 PUT 完成。

    PUT response rule(1) set-response-code.xsl:当从后端检索到 SOAP 响应后,需要将其转换为 RESTful 响应码,在执行 PUT 时,该响应码通常为 204(无内容)。需要用一个样例请求测试 PUT REST 方法 —— 参见清单 10。有效负荷被保存为 RESTPutRequest.json。要将请求发送给 DataPower,使用以下 Curl 命令。通常会返回一个空的响应:

    curl -X PUT RESTPutRequest.json http://DPHOST:4801/projects/2

结束语

本文解释了 WebSphere DataPower 如何在 Web 2.0 领域中发挥作用,提供了有关 REST 的概述,描述了用于通过 WebSphere DataPower 公开 REST 和 JSON 的推荐模式,并提供了一个包含 DataPower 域导出和 DemoService Web 服务后端应用程序的详细示例。您现在应该已经对 REST 有了较好的理解,并且知道如何在 WebSphere DataPower 上开发 REST 服务,从而对您自己的 Web 2.0 设备进行配置。

致谢

本文作者感谢来自 IBM 的 Robert Peterson 为其文章 Implementing REST services with WebSphere DataPower SOA Appliances 所做的大量基础工作,在编写本文和开发这些 DataPower 发行版 3.8.0 特性时借鉴了这些内容。


下载

描述名字大小
DataPower demo 服务配置web20restjson_dwa_export.zip480 KB
DataPower demo 服务配置web20restjson_soap.zip1580 KB

参考资料

学习

获得产品和技术

讨论

  • WebSphere DataPower SOA Appliances 论坛
    获取关于技术问题的解答,并与其他 WebSphere DataPower 用户共享您的专业知识。
  • WebSphere 论坛
    产品相关论坛,您可以获取关于技术问题的解答并与其他 WebSphere 用户共享专业知识。
  • developerWorks 博客
    加入与 developerWorks 用户和作者以及 IBM 编辑和开发人员的会话。
  • developerWorks 中国技术讲座
    IBM 专家组织的免费技术会议,可以加速您的学习进度,并帮助您克服软件项目中的大多数难题。会议包括时长 1 小时的网络广播,以及在世界各个城市举办的半天和全天的现场会议。

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=WebSphere
ArticleID=481735
ArticleTitle=使用 WebSphere DataPower SOA Appliances 实现支持 JSON 的 Web 2.0 RESTful facade
publish-date=04122010