数码控科技猎奇Iphone动漫星座游戏电竞lolcosplay王者荣耀攻略allcnewsBLOGNEWSBLOGASKBLOGBLOGZSK全部技术问答问答技术问答it问答代码软件新闻开发博客电脑/网络手机/数码笔记本电脑互联网操作系统软件硬件编程开发360产品资源分享电脑知识文档中心IT全部全部分类 全部分类技术牛文全部分类教程最新 网页制作cms教程平面设计媒体动画操作系统网站运营网络安全服务器教程数据库工具网络安全软件教学vbscript正则表达式javascript批处理更多»编程更新教程更新游戏更新allitnewsJava 新闻网络医疗信息化安全创业站长电商科技访谈域名会议专栏创业动态融资创投创业学院 / 产品经理创业公司人物访谈营销 开发数据库服务器系统虚拟化云计算 嵌入式移动开发作业作业1常见软件all电脑网络手机数码生活游戏体育运动明星影音休闲爱好文化艺术社会民生教育科学医疗健康金融管理情感社交地区其他电脑互联网软件硬件编程开发360相关产品手机平板其他电子产品摄影器材360硬件通讯智能设备购物时尚生活常识美容塑身服装服饰出行旅游交通汽车购房置业家居装修美食烹饪单机电脑游戏网页游戏电视游戏桌游棋牌游戏手机游戏小游戏掌机游戏客户端游戏集体游戏其他游戏体育赛事篮球足球其他运动球类运动赛车健身运动运动用品影视娱乐人物音乐动漫摄影摄像收藏宠物幽默搞笑起名花鸟鱼虫茶艺彩票星座占卜书画美术舞蹈小说图书器乐声乐小品相声戏剧戏曲手工艺品历史话题时事政治就业职场军事国防节日风俗法律法规宗教礼仪礼节自然灾害360维权社会人物升学入学人文社科外语资格考试公务员留学出国家庭教育学习方法语文物理生物工程学农业数学化学健康知识心理健康孕育早教内科外科妇产科儿科皮肤科五官科男科整形中医药品传染科其他疾病医院两性肿瘤科创业投资企业管理财务税务银行股票金融理财基金债券保险贸易商务文书国民经济爱情婚姻家庭烦恼北京上海重庆天津黑龙江吉林辽宁河北内蒙古山西陕西宁夏甘肃青海新疆西藏四川贵州云南河南湖北湖南山东江苏浙江安徽江西福建广东广西海南香港澳门台湾海外地区

使用Optim Service Interface开发自定义OPtim用户体验的指南

来源:本网整理
它允许您通过对明确定义的 XML 有效负载进行编组,创建您自己的与公共 RESTful 资源进行通信的前端。本文附带了一个演示此能力和灵活性的示例 Web 应用程序。OSI 是一个公共 RESTful Web 服务 API 集合,用于与 Optim SOA 后端 Web 服务进行通信。这些公共 RESTful API 为您提供了向私有 Optim 后端 Web 服务编组用户友好的、容易使用的 XML 有效负载(及其反向操作)的能力。通过这些 RESTful API,Optim Service Interface 提供了对您在使用 Optim Manager 过程中通常遇到的许多相同功能的访问能力,而没有 Optim Manager 用户界面的限制。

如果您希望在没有 Optim Manager 用户界面限制的情况下使用 Optim Manager 功能,那么您可以利用 OSI 开发自己的自定义用户体验,创建与 OSI 提供的一组公共 RESTful API 交互的 RESTful Web 客户端应用程序。OSI 在用于开发这些与 OSI RESTful Web 服务通信的客户端应用程序的语言上没有限制(Java、C、Ruby、Python、Groovy、.Net 均可使用)。OSI 公开的 Web 服务都基于契约,可通过 XML 模式定义 (XSD) 和 Web 应用程序描述语言 (WADL) 发现它们。

目标读者

本文适用于对根据 OSI 所提供的特性和功能来创建自定义用户体验感兴趣的 Optim 客户。

预备知识

本文尽可能使用标准的语言和图表,所以拥有软件架构术语的一般知识会对您有所帮助。您还需要掌握 Optim 产品套件(尤其是 Optim Service Interface)方面的一般知识。本文假设您拥有 JEE、常见 Web 技术、Java(或类似编程语言)、XML 和 HTML 的基础知识。

术语

表 1. 词汇表

术语 / 概念 定义 / 描述
OSI Optim Service Interface
REST 具象状态传输是一种软件架构风格。RESTful Web 服务和 RESTful API 实质上是相同的。本文会交替使用这两个术语。
SOA 面向服务的架构
GUI 图形用户界面
XML 可扩展标记语言
WADL Web 应用程序描述语言
XSD XML 模式定义
DOM 文档对象模型

用途

本文的目的是为您提供一个可重复的过程,演示与 Optim Service Interface 所提供的公共 Web 服务的成功交互。您可使用这个可重复的流程开发您自己的与 OSI 进行通信的用户体验。

本文提供了一个使用 Java 编写的示例 Web 客户端 servlet,整篇文章会引用它的代码来尝试进一步演示自定义用户前端与 OSI 之间的交互。尽管示例 Web 客户端 servlet 代码是使用 Java 编写的,但您也可以将它演示的整个可重复过程应用到使用任何编程语言编写的任何 Web 客户端应用程序(比如 Java、C、Ruby、Python、Groovy、.Net 等)。

最后,尽管所提供的示例代码生成的应用程序的外观可能很普通,但代码本身很好地演示了一个可重复的简单过程,这个过程演示了与 OSI 的通信,并置可以将此操作复制到各种不同的语言中。

RESTful Web 服务

为了充分理解 OSI 和如何开发与 OSI 通信的 Web 客户端应用程序,您至少需要对 RESTful Web 服务的概念有一般的了解。以下是 RESTful Web 服务的简要描述。

RESTful Web 服务使用 HTTP 和具象状态传输原则实现。RESTful Web 服务或 RESTful API 是一个具有以下既定特征的资源集合:

  • RESTful Web 服务必须有一个基础 URL。
  • RESTful Web 服务必须为它支持的请求和响应有效负载使用一种 Internet 媒体类型,比如 XML 或 JSON。
  • RESTful Web 服务必须使用 HTTP 请求方法提供一组操作。
  • RESTful Web 服务必须由超文本驱动。
  • RESTful Web 服务必须是无状态的。这意味着客户端 Web 应用程序的状态与 RESTful Web 服务无关。RESTful Web 服务仅对基于请求方法和请求有效负载内容来处理请求和返回响应(标头和有效负载)感兴趣。

OSI RESTful API

OSI 是一个公共 RESTful Web 服务集合,公开了 Optim Manager 在正常情况下提供的功能,但没有 Optim Manager 用户界面所施加的限制。基本上讲,这使得 OSI 成为了一个无头或无面的 Optim Manager 版本。要使用 OSI 建立一个自定义用户体验,必须开发一个与 OSI 交互的 Web 客户端应用程序,进而利用 Optim Manager 平常提供的后端功能。

OSI RESTful API 路线图

每个 OSI Web 服务都有一个 resource.xsd 和一个 resource.wadl,要获得它们,可通过对 Web 服务基础 URI 的 HTTP GET 请求(后跟一个 /?xsd或 /?wadl)对每个 Web 服务进行查询。这两个文档为您以及最终的 Web 客户端应用程序提供了如何构造一个想要的 HTTP 请求有效负载和如何通过想要的 HTTP 请求方法将该有效负载发送到 OSI 的路线图。这两个文档还为您以及最终的 Web 客户端应用程序提供了如何处理返回的 HTTP 响应和如何解构从 OSI 返回的响应有效负载的路线图。为了方便起见,您还可以在本文的 下载部分找到每个 API 的 .xsd 和 .wadl 文件。

resource.xsd

resource.xsd 文件包含一个给定的 RESTful API 的请求和响应有效负载模板。在构造 RESTful API 提供的一些功能的请求有效负载时,以及在解构 RESTful API 返回的响应有效负载时,您将使用一个 resource.xsd 作为参考。

resource.wadl

resource.wadl 文件包含有关如何根据给定 RESTful API 的基础 URI 来构造 URL 的详细信息。它还提供了有关某个请求有效负载是否有必要存在以及该有效负载应该采用何种格式的信息。为此,它引用了 resource.xsd,并指出应该对有效负载使用哪个 resource.xsd 顶级元素模板。resource.wadl 也对任何响应有效负载执行相同的操作。最后,resource.wadl 提供了一组可能的响应代码和它们的含义。在构造 HTTP 请求 URL、请求有效负载时,以及在处理 HTTP 响应和解构任何潜在的响应有效负载时,可使用 resource.wadl 提供的信息作为参考。

Optim Connection Request API

Optim Connection Request API 是一个 OSI 公共 RESTful API,提供了查询 Optim 目录连接信息的能力。使用此方法,OSI 允许 Web 客户端应用程序发出 HTTP GET 方法来获取 OPtim 连接管理器知道的所有可用 Optim 目录连接的列表。

  • 获取所有 Optim 目录连接的列表:
    • 请求方法:GET
    • API URL:/connection
    • 响应代码:
      • 200:OK
      • 400:Bad request made
      • 404:Not found
    • 响应有效负载的示例:

       

      <?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
       <ns2:connections xmlns:ns2="http://www.ibm.com/optim/xsd/connection/9.1.0"> 
          <ns2:connection> 
              <id>e1a93332-701b-48d7-bdc6-c20adb09ba51</id> 
              <name>OPTIMDIR1</name> 
              <description>Optim directory on local Oracle XE</description> 
              <status>Complete</status> 
              <vendor>Oracle</vendor> 
              <version>11.2</version> 
              <jdbcUrl>jdbc:oracle:thin:@localhost:1521:xe</jdbcUrl> 
          </ns2:connection> 
       </ns2:connections>

       

Optim Service Request API

Optim Service Request API 是一个 OSI 公共 RESTful API,提供了查询 Optim 服务请求信息的能力。使用此方法,OSI 允许 Web 客户端应用程序发出 HTTP GET 方法,获取所有可用的 Optim 服务的列表以及任何给定 Optim 服务的详细信息。

  • 获取所有 Optim 服务的列表:
    • 请求方法:GET
    • API URL:/service/{connection-name}
    • 响应代码:
      • 200:OK
      • 400:Bad request made
      • 404:Not found
    • 响应有效负载的示例:

       

      <?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
       <ns2:services xmlns="http://www.w3.org/2005/Atom" 
                 xmlns:ns2="http://www.ibm.com/optim/xsd/srm/9.1.0"> 
          <link href="http://localhost:8080/server/service/ 
                             234d7245-aa47-44cb-b647-650734d200fd"/> 
          <link href="http://localhost:8080/server/service/ 
                             79550682-e362-464d-9a0b-eae9a046083f"/> 
          <link href="http://localhost:8080/server/service/ 
                             7c354125-4f2a-4d94-bfab-0711d2270af8"/> 
          <link href="http://localhost:8080/server/service/ 
                             52abadce-abd3-434e-8c51-3a76c7a3d2f0"/> 
          <link href="http://localhost:8080/server/service/ 
                             c73f9a81-d7d6-4998-adb4-37bc27071128"/> 
       </ns2:services>

       

  • 获取服务详细信息:
    • 请求方法:GET
    • API URL:/service/{connection-name}/{service-id}
    • 响应代码:
      • 200:OK
      • 400:Bad request made
      • 404:Not found
    • 响应有效负载的示例:

       

      <?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
       <ns2:service xmlns:ns2="http://www.ibm.com/optim/xsd/srm/9.1.0"> 
          <serviceId>234d7245-aa47-44cb-b647-650734d200fd</serviceId> 
          <serviceName>OSIDEMO.ERCUST10K</serviceName> 
          <servicePath>OPTIMDIR/OSIDEMO</servicePath> 
          <serviceType>com.ibm.nex.model.oim.distributed.ExtractRequest</serviceType> 
          <servicePlatform>com.ibm.nex.ois.runtime.productplatform.distributed 
          </servicePlatform> 
       </ns2:service>

       

Optim Server API

Optim Server API 是一个 OSI 公共 RESTful API,提供了查询 Optim 服务器信息的能力。使用此方法,OSI 允许 Web 客户端应用程序发出 HTTP GET 方法来获取所有可用的 Optim 服务器的列表。

  • 获取所有 Optim 服务器的列表:
    • 请求方法:GET
    • API URL:/runtime
    • 响应代码:
      • 200:OK
      • 400:Bad request made
      • 404:Not found
    • 响应有效负载的示例:

       

      <?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
       <ns2:servers xmlns:ns2="http://www.ibm.com/optim/xsd/rr/9.1.0"> 
          <rsiURL>http://localhost:12000/</rsiURL> 
       </ns2:servers>

       

Optim Service Execution API

Optim Service Execution API 是一个 OSI 公共 RESTful API,提供了执行 Optim 服务的能力。使用此方法,OSI 允许 Web 客户端应用程序发出一个 HTTP POST 方法,并详细描述要执行的服务的 XML 有效负载。作为响应,OSI 运行指定的服务,向 Web 客户端应用程序返回适当的响应和有效负载。

  • 执行一个服务:
    • 请求方法:POST
    • API URL:/execute/{connection-name}/{service-id}
    • 请求有效负载的示例:

       

      <?xml version="1.0" encoding="UTF-8"?> 
       <sem:serviceRequestExecutionInput 
          xmlns:sem="http://www.ibm.com/optim/xsd/sem/9.1.0" 
          
          xsi:schemaLocation="http://www.ibm.com/optim/xsd/sem/9.1.0 resource.xsd "> 
          <serviceId>234d7245-aa47-44cb-b647-650734d200fd</serviceId> 
          <serviceName>OSIDEMO.ERCUST10K</serviceName> 
          <servicePath>OPTIMDIR/OSIDEMO</servicePath> 
          <rsiURL>http://localhost:12000/</rsiURL> 
       </sem:serviceRequestExecutionInput>

       

    • 响应代码:
      • 202:Accepted
      • 400:Bad request made
    • 响应有效负载的示例:

       

      <?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
       <ns2:executionResults xmlns:ns2="http://www.ibm.com/optim/xsd/sem/9.1.0"> 
          <executionId>66dbf3ac-5768-4df4-9dfb-17ead3033b93</executionId> 
          <serviceId>234d7245-aa47-44cb-b647-650734d200fd</serviceId> 
          <serviceName>OSIDEMO.ERCUST10K</serviceName> 
          <servicePath>OPTIMDIR/OSIDEMO</servicePath> 
       </ns2:executionResults>

       

Optim Service Monitoring API

Optim Service Monitoring API 是一个 OSI 公共 RESTful API,提供了查询和清除 Optim 服务执行实例数据的能力。使用此方法,OSI 允许 Web 客户端应用程序获取所有可用的 Optim 服务执行实例的列表,获取任何给定 Optim 服务执行实例的详细信息,获取任何给定 Optim 服务执行实例的工件列表,以及获取任何服务执行实例工件的实际内容。OSI 还为 Web 客户端应用程序提供了发出将清除任何给定服务执行实例的 HTTP DELETE 方法的能力。

  • 获取所有服务实例的列表:
    • 请求方法:GET
    • API URL:/monitor/{connection-name}
    • 响应代码:
      • 200:OK
      • 400:Bad request made
      • 404:Not found
    • 响应有效负载的示例:

       

      <?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
       <ns2:serviceInstances xmlns="http://www.w3.org/2005/Atom" 
                             xmlns:ns2="http://www.ibm.com/optim/xsd/sim/9.1.0"> 
          <link href="http://localhost:8080/server/monitor/ 
                             892ea9ab-af33-40a1-acbb-110dc6cd74f3"/> 
          <link href="http://localhost:8080/server/monitor/ 
                             0f5f5bf3-5f29-4d53-8575-2ff2cbab1c08"/> 
          <link href="http://localhost:8080/server/monitor/ 
                             8630618c-3c08-4b76-b3cf-4dd6fb06fad3"/> 
          <link href="http://localhost:8080/server/monitor/ 
                             66dbf3ac-5768-4df4-9dfb-17ead3033b93"/> 
       </ns2:serviceInstances>

       

  • 获取服务实例详细信息:
    • 请求方法:GET
    • API URL:/monitor/{connection-name}/{execution-id}
    • 响应代码:
      • 200:OK
      • 400:Bad request made
      • 404:Not found
    • 响应有效负载的示例:

       

      <?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
       <ns2:serviceInstance xmlns:ns2="http://www.ibm.com/optim/xsd/sim/9.1.0"> 
          <id>66dbf3ac-5768-4df4-9dfb-17ead3033b93</id> 
          <serviceId>234d7245-aa47-44cb-b647-650734d200fd</serviceId> 
          <startTime>1355504913223</startTime> 
          <endTime>1355504990011</endTime> 
          <returnCode>0</returnCode> 
          <artifactList> 
              <artifactName>run.log</artifactName> 
              <artifactName>svc_request.xml</artifactName> 
              <artifactName>execution.properties</artifactName> 
              <artifactName>svc_response.xml</artifactName> 
          </artifactList> 
       </ns2:serviceInstance>

       

  • 获取一个服务实例的工件列表:
    • 请求方法:GET
    • API URL: /monitor/{connection-name}/artifacts/{execution-id}
    • 响应代码:
      • 200:OK
      • 400:Bad request made
      • 404:Not found
    • 响应有效负载的示例:

       

      <?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
       <ns2:serviceInstanceArtifacts xmlns="http://www.w3.org/2005/Atom" 
                               xmlns:ns2="http://www.ibm.com/optim/xsd/sim/9.1.0"> 
          <link href="http://localhost:8080/server/monitor/ 
                      66dbf3ac-5768-4df4-9dfb-17ead3033b93/run.log"/> 
          <link href="http://localhost:8080/server/monitor/ 
                      66dbf3ac-5768-4df4-9dfb-17ead3033b93/svc_request.xml"/> 
          <link href="http://localhost:8080/server/monitor/ 
                      66dbf3ac-5768-4df4-9dfb-17ead3033b93/execution.properties"/> 
          <link href="http://localhost:8080/server/monitor/ 
                      66dbf3ac-5768-4df4-9dfb-17ead3033b93/svc_response.xml"/> 
       </ns2:serviceInstanceArtifacts>

       

  • 获取一个特定的工件:
    • 请求方法:GET
    • API URL: /monitor/{connection-name}/{execution-id}/{artifact-name}
    • 响应代码:
      • 200:OK
      • 400:Bad request made
      • 404:Not found
    • 响应有效负载将是请求的工件
  • 删除一个服务实例:
    • 请求方法:DELETE
    • API URL:/monitor/{connection-name}/{execution-id}
    • 响应代码:
      • 204:No content
      • 400:Bad request made
      • 404:Not found

Optim Work Order Management API

Optim Work Order Management API 是一个 OSI 公共 RESTful API,提供了与 Optim Services on Demand 工作订单数据进行交互的能力。使用此方法,OSI 允许 Web 客户端应用程序发出 HTTP GET 方法,获取所有可用的工作订单、活动状态和可实现的过渡的列表,以及所有给定工作订单的详细信息。这还使得 Web 客户端应用程序能够通过 OSI 与请求有效负载一起发出 HTTP POST 和 PUT 方法,从而创建工作订单,更新和过渡这些工作订单,最终执行这些工作订单。OSI 在所有情况下都根据请求的操作来返回响应。最后,Web 客户端应用程序可发出一个 HTTP DELETE 方法,使用此 API 清除任何给定的工作订单。

  • 获取所有活动状态:
    • 请求方法:GET
    • API URL:/workorder/{connection-name}/states/{workflow-id}
    • 响应代码:
      • 200:OK
      • 400:Bad request made
      • 404:Not found
    • 响应有效负载的示例:

       

      <?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
       <ns2:states xmlns:ns2="http://www.ibm.com/optim/xsd/workorder/9.1.0"> 
          <ns2:state> 
              <stateId>100</stateId> 
              <wfId>1</wfId> 
              <stateName>NEW</stateName> 
          </ns2:state> 
          <ns2:state> 
              <stateId>200</stateId> 
              <wfId>1</wfId> 
              <stateName>REQUESTED</stateName> 
          </ns2:state> 
          ... 
          <ns2:state> 
              <stateId>999</stateId> 
              <wfId>1</wfId> 
              <stateName>TERMINATED</stateName> 
          </ns2:state> 
       </ns2:states>

       

  • 获取可实现的过渡:
    • 请求方法:GET
    • API URL:/workorder/{connection-name}/transitions/{workflow-id}/{state-id}
    • 响应代码:
      • 200:OK
      • 400:Bad request made
      • 404:Not found
    • 响应有效负载的示例:

       

      <?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
       <ns2:transitions xmlns:ns2="http://www.ibm.com/optim/xsd/workorder/9.1.0"> 
          <ns2:transition> 
              <id>2</id> 
              <wfId>1</wfId> 
              <oldStateId>200</oldStateId> 
              <transitionName>DENY</transitionName> 
              <newStateId>250</newStateId> 
              <owner>2</owner> 
          </ns2:transition> 
          ... 
          <ns2:transition> 
              <id>5</id> 
              <wfId>1</wfId> 
              <oldStateId>200</oldStateId> 
              <transitionName>APPROVE</transitionName> 
              <newStateId>300</newStateId> 
              <owner>2</owner> 
          </ns2:transition> 
       </ns2:transitions>

       

  • 创建一个工作订单:
    • 请求方法:POST
    • API URL:/workorder/{connection-name}/{transition-id}
    • 请求有效负载的示例:

       

      <?xml version="1.0" encoding="UTF-8"?> 
       <workorder:workorder 
           xmlns:atom="http://www.w3.org/2005/Atom" 
           xmlns:workorder="http://www.ibm.com/optim/xsd/workorder/9.1.0" 
           
           xsi:schemaLocation="http://www.ibm.com/optim/xsd/workorder/9.1.0 
           resource.xsd "> 
        <wfId>1</wfId> 
        <stateId>100</stateId> 
        <description>The work order description</description> 
        <priority>Within 8 Hours</priority> 
        <comments>The work order comments</comments> 
        <createdBy>CREATORID</createdBy> 
       </workorder:workorder>

       

    • 响应代码:
      • 201:Created
      • 400:Bad request made
  • 更新一个工作订单:
    • 请求方法:PUT
    • API URL:/workorder/{connection-name}/{work-order-id}
    • 请求有效负载的示例:

       

      <?xml version="1.0" encoding="UTF-8"?> 
       <workorder:workorder 
           xmlns:atom="http://www.w3.org/2005/Atom" 
           xmlns:workorder="http://www.ibm.com/optim/xsd/workorder/9.1.0" 
           
           xsi:schemaLocation="http://www.ibm.com/optim/xsd/workorder/9.1.0 
           resource.xsd "> 
        <wfId>1</wfId> 
        <stateId>100</stateId> 
        <description>The work order description</description> 
        <priority>Within 8 Hours</priority> 
        <comments>The work order comments - UPDATED</comments> 
        <createdBy>CREATORID</createdBy> 
       </workorder:workorder>

       

    • 响应代码:
      • 200:OK
      • 400:Bad request made
      • 404:Not found
  • 过渡和更新一个工作订单:
    • 请求方法:PUT
    • API URL: /workorder/{connection-name}/{work-order-id}/{transition-id}
    • 请求有效负载的示例:

       

      <?xml version="1.0" encoding="UTF-8"?> 
       <workorder:workorder 
           xmlns:atom="http://www.w3.org/2005/Atom" 
           xmlns:workorder="http://www.ibm.com/optim/xsd/workorder/9.1.0" 
           
           xsi:schemaLocation="http://www.ibm.com/optim/xsd/workorder/9.1.0 
           resource.xsd "> 
        <wfId>1</wfId> 
        <stateId>100</stateId> 
        <description>The work order description</description> 
        <priority>Within 8 Hours</priority> 
        <comments>The work order comments (TRANSITION AND UPDATE)</comments> 
        <createdBy>CREATORID</createdBy> 
       </workorder:workorder>

       

    • 响应代码:
      • 200:OK
      • 400:Bad request made
      • 404:Not found
  • 删除一个工作订单:
    • 请求方法:DELETE
    • API URL: /workorder/{connection-name}/{work-order-id}/{transition-id}
    • 响应代码:
      • 204:No content
      • 400:Bad request made
      • 404:Not found
  • 获取所有工作订单:
    • 请求方法:GET
    • API URL:/workorder/{connection-name}
    • 响应代码:
      • 200:OK
      • 400:Bad request made
      • 404:Not found
    • 响应有效负载的示例:

       

      <?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
       <ns2:workorders xmlns="http://www.w3.org/2005/Atom" 
               xmlns:ns2="http://www.ibm.com/optim/xsd/workorder/9.1.0"> 
          <link href="http://localhost:8080/server/workorder/10008"/> 
          <link href="http://localhost:8080/server/workorder/10011"/> 
          <link href="http://localhost:8080/server/workorder/10015"/> 
       </ns2:workorders>

       

  • 获取工作订单详细信息:
    • 请求方法:GET
    • API URL:/workorder/{connection-name}/{work-order-id}
    • 响应代码:
      • 200:OK
      • 400:Bad request made
      • 404:Not found
    • 响应有效负载的示例:

       

      <?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
       <ns2:workorder xmlns:ns2="http://www.ibm.com/optim/xsd/workorder/9.1.0"> 
          <id>10008</id> 
          <wfId>1</wfId> 
          <stateId>350</stateId> 
          <description>Work order 10008 description</description> 
          <priority>Within 48 hours</priority> 
          <comments>Work order 10008 comments 
      
                    admin , Fri Nov 09 08:53:55 CST 2012 
          </comments> 
          <createdBy>admin</createdBy> 
          <createdDate>1351710653900</createdDate> 
       </ns2:workorder>

       

  • 执行一个工作订单:
    • 请求方法:POST
    • API URL: /workorder/{connection-name}/execute/{work-order-id}
    • 请求有效负载的示例:

       

      <?xml version="1.0" encoding="UTF-8"?> 
       <workorder:workOrderExecution 
           xmlns:atom="http://www.w3.org/2005/Atom" 
           xmlns:workorder="http://www.ibm.com/optim/xsd/workorder/9.1.0" 
           
           xsi:schemaLocation="http://www.ibm.com/optim/xsd/workorder/9.1.0 
           resource.xsd "> 
        <workOrderId>10015</workOrderId> 
        <proxyURL>http://localhost:12000/</proxyURL> 
        <executedBy>THEEXECUTOR</executedBy> 
       </workorder:workOrderExecution>

       

    • 响应代码:
      • 202:Accepted
      • 400:Bad request made
    • 响应有效负载的示例:

       

      <?xml version="1.0" encoding="UTF-8"?> 
       <workorder:executionResults xmlns:atom="http://www.w3.org/2005/Atom" 
           xmlns:workorder="http://www.ibm.com/optim/xsd/workorder/9.1.0" 
           
           xsi:schemaLocation="http://www.ibm.com/optim/xsd/workorder/9.1.0 
           resource.xsd "> 
        <executionId>66dbf3ac-5768-4df4-9dfb-17ead3033b93</executionId> 
        <serviceId>234d7245-aa47-44cb-b647-650734d200fd</serviceId> 
       </workorder:executionResults>

       

Optim Scheduler API

Optim Scheduler API 是一个 OSI 公共 RESTful API,提供了管理 Optim 作业计划的能力。使用此方法,OSI 允许 Web 客户端应用程序发出 HTTP GET 方法,获取 Optim 作业计划的列表以及任何给定 Optim 作业计划的详细信息。这还使得 Web 客户端应用程序能够通过 OSI 与请求有效负载一起发出 HTTP POST 和 PUT 方法,从而创建 Optim 作业计划和更新这些 Optim 作业计划。OSI 在所有情况下都根据请求的操作来返回响应。最后,Web 客户端应用程序可发出一个 HTTP DELETE 方法,使用此 API 清除任何给定的 Optim 作业计划。

  • 获取所有计划程序条目:
    • 请求方法:GET
    • API URL:/scheduler/{connection-name}
    • 响应代码:
      • 200:OK
      • 400:Bad request made
      • 404:Not found
    • 响应有效负载的示例:

       

      <?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
       <ns2:schedules xmlns="http://www.w3.org/2005/Atom" 
           xmlns:ns2="http://www.ibm.com/optim/xsd/scheduler/9.1.0"> 
          <link href="http://localhost:8080/server/scheduler/ 
                             fbf1cdd5-bdf7-4682-96ad-722672af0001"/> 
          <link href="http://localhost:8080/server/scheduler/ 
                             fbf1cdd5-bdf7-4682-96ad-722672af0002"/> 
       </ns2:schedules>

       

  • 获取计划程序条目详细信息:
    • 请求方法:GET
    • API URL:/scheduler/{connection-name}/{schedule-id}
    • 响应代码:
      • 200:OK
      • 400:Bad request made
      • 404:Not found
    • 响应有效负载的示例:

       

      <?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
       <ns2:schedule xmlns:ns2="http://www.ibm.com/optim/xsd/scheduler/9.1.0"> 
          <id>fbf1cdd5-bdf7-4682-96ad-722672af0001</id> 
          <serviceId>234d7245-aa47-44cb-b647-650734d200fd</serviceId> 
          <startDate>1321033535125</startDate> 
          <endDate>0</endDate> 
          <repeatCount>0</repeatCount> 
          <repeatInterval>10</repeatInterval> 
          <schedulerTaskType>SOA_SERVICE</schedulerTaskType> 
          <proxyURL>http://localhost:12000/</proxyURL> 
       </ns2:schedule>

       

  • 创建一个计划程序条目:
    • 请求方法:POST
    • API URL:/scheduler/{connection-name}/{schedule-id}
    • 请求有效负载的示例:

       

      <?xml version="1.0" encoding="UTF-8"?> 
       <scheduler:schedule xmlns:atom="http://www.w3.org/2005/Atom" 
           xmlns:scheduler="http://www.ibm.com/optim/xsd/scheduler/9.1.0" 
           
           xsi:schemaLocation="http://www.ibm.com/optim/xsd/scheduler/9.1.0 
           resource.xsd "> 
        <id>fbf1cdd5-bdf7-4682-96ad-722672af0001</id> 
          <serviceId>234d7245-aa47-44cb-b647-650734d200fd</serviceId> 
          <startDate>1321033535125</startDate> 
          <endDate>0</endDate> 
          <repeatCount>0</repeatCount> 
          <repeatInterval>10</repeatInterval> 
          <schedulerTaskType>SOA_SERVICE</schedulerTaskType> 
          <proxyURL>http://localhost:12000/</proxyURL> 
          <creatorId>THECREATOR</creatorId> 
       </scheduler:schedule>

       

    • 响应代码:
      • 201:Created
      • 400:Bad request made
  • 更新一个计划程序条目:
    • 请求方法:PUT
    • API URL:/scheduler/{connection-name}/{schedule-id}
    • 请求有效负载的示例:

       

      <?xml version="1.0" encoding="UTF-8"?> 
       <scheduler:schedule xmlns:atom="http://www.w3.org/2005/Atom" 
           xmlns:scheduler="http://www.ibm.com/optim/xsd/scheduler/9.1.0" 
           
           xsi:schemaLocation="http://www.ibm.com/optim/xsd/scheduler/9.1.0 
           resource.xsd "> 
        <id>fbf1cdd5-bdf7-4682-96ad-722672af0001</id> 
          <serviceId>234d7245-aa47-44cb-b647-650734d200fd</serviceId> 
          <startDate>1321033535125</startDate> 
          <endDate>0</endDate> 
          <repeatCount>0</repeatCount> 
          <repeatInterval>10</repeatInterval> 
          <schedulerTaskType>SOA_SERVICE</schedulerTaskType> 
          <proxyURL>http://localhost:12000/</proxyURL> 
          <creatorId>THECREATOR</creatorId> 
       </scheduler:schedule>

       

    • 响应代码:
      • 200:OK
      • 400:Bad request made
      • 404:Not found
  • 删除一个计划程序条目:
    • 请求方法:DELETE
    • API URL:/scheduler/{connection-name}/{schedule-id}
    • 响应代码:
      • 204:No content
      • 400:Bad request made
      • 404:Not found

Web 客户端参考实现

本文附带了一个展示与 Optim Service Interface 的交互的参考实现。这个 Web 客户端应用程序被开发为一个名为 OsiClientSampleServlet的 Java servlet,以 Web 应用程序的形式部署到 WebSphere®Application Server Community Edition 上的路径 /osiClientSample,并在端口 8080 本地运行。出于本文的目的,参考实现的 URL 为 http://localhost:8080/osiClientSample/OsiClientSampleServlet。OsiClientSampleServlet 的代码可在本文的 下载部分中找到。

该参考实现提供了显示所有可用 Optim 服务(包括详细信息)的列表,执行这些 Optim 服务,然后监视这些 Optim 服务执行实例的功能。它还提供了清除各个 Optim 服务执行实例的能力。它通过重复地采用这里详细介绍的简单范式来完成这项任务:

  • 构造一个指向 OSI 公共 RESTful API 的 URL。
  • 如有必要,构造一个基于特定 RESTful API 的 XSD 的 XML 请求有效负载。
  • 使用构造的 URL 和请求有效负载,以及合适的 HTTP 方法(GET、POST、PUT 或 DELETE)发出一个 HTTP 请求。
  • 处理从 OSI 公共 RESTful API 返回的 HTTP 响应,方法是验证 HTTP 响应代码,然后在必要的时候,基于特定 RESTful API 的 XSD 来操作响应有效负载,以便满足您的需求。

图 1. 参考实现用户界面


使用Optim Service Interface开发自定义OPtim用户体验的指南

显示 Optim 服务

如 图 1中所示,Java servlet 代码 OsiClientSampleServlet.java定义的参考实现执行所有可用 Optim 服务的显示。为此,它首先向 OSI Optim 服务请求 API 的基础 URI 发出一个 HTTP GET 请求。处理 HTTP 响应有效负载后,会提供一个 Optim 服务详细 URL 链接列表。然后这组链接每次被处理其中的一个链接,每次向指定的链接发出另一个 HTTP GET 请求。进一步处理每个 HTTP GET 请求的响应有效负载,最后呈现网页的 Optim Services 部分,其中包含按服务路径和服务名称分类的所有可用 Optim 服务的列表。

显示 Optim 服务监视信息

参考实现对 Optim 服务监视信息的显示的处理方式,与之前详细介绍的 Optim 服务信息的显示的处理方式相同。最后,向 OSI Optim 服务监视 API 的基础 URI 发出一个 HTTP GET 请求。在处理 HTTP 响应有效负载后,会提供一个 Optim 服务执行实例详细 URL 链接列表。然后这组链接每次被处理其中的一个链接,每次向特定的链接发出另一个 HTTP GET 请求。进一步处理每个 HTTP GET 请求的响应有效负载。对于每组服务执行实例详细信息,会提取出一个服务 ID,然后向 OSI 发出另一个 HTTP GET 请求,但这一次向 Optim 服务请求 API 发出,请求所提供的服务 ID 的 Optim 服务详细信息。获得所有这些信息后,就会呈现网页的 Optim Service Monitoring 部分。它包含按执行 ID 和服务名称分类的所有可用 Optim 服务执行实例的列表,显示了执行的开始和结束时间,以及执行的返回代码。

运行一个服务

在调用网页上列出的任何一个 Optim 服务来通过该网页执行它的时候,参考实现会接受请求并捕获要用于执行的服务 ID。然后它会启动构造一个 XML 请求有效负载的过程。首先,向 OSI Optim Server API 发出一个 HTTP GET 请求,返回一个包含要在其上执行的可用 Optim 服务器列表的响应。为了简便起见,我们使用了返回列表上的第一个 Optim 服务器,并将它添加到 XMl 请求有效负载中。接下来,向 OSI Optim 服务请求 API 发出另一个 HTTP GET 请求,寻找以前获取的服务 ID 的 Optim 服务详细信息。然后处理返回的 HTTP 响应,使用来自响应的内容完善 XML 请求有效负载。现在,向 OSI Optim 服务执行 API 发出一个 HTTP POST 请求,以运行指定的服务。此 POST 请求附带了 XML 请求有效负载。最后,处理 POST 请求的 HTTP 响应,如果服务执行成功提交,暗骂网页上将会显示一条消息,其中包含新服务执行实例的执行 ID。

清除一个服务执行实例

通过网页调用一次 Optim 服务执行实例时,参考实现会接受请求,捕获标记为删除的执行 ID。然后它会向 OSI Service monitoring API 发出一个 HTTP DELETE 请求,其中包含之前获取的执行 ID。然后处理 HTTP 响应并验证该处理是否成功。如果成功,则会在网页上显示一条消息,表明服务执行实例清除请求已完成。

OsiClientSampleServlet

我们现在看看参考实现的代码,提供该代码如何执行之前描述的所有功能的更深入和更详细的描述。请参阅本文 下载部分中提供的OsiClientSampleServlet.java代码。

OSI 基础 URL

在将 OSI 部署到应用服务器上时,会建立一个标识该 OSI 的基础 URL。OSI URL 依赖于应用服务器的主机和端口,以及 OSI 上下文根。OSI 的上下文根为 /server。所以如果您的应用服务器主机为 “localhost”,它的端口为 8080,那么 “http://localhost:8080/server” 就是 OSI 基础 URL。在代码示例中,OSI 基础 URL 已硬编码为一个在所有代码中引用的常量(不建议这么做)。

private static String OSI_BASE_URL = "http://localhost:8080/server";

Optim 目录连接

Optim 目录连接是要用于所有需要连接名称的 HTTP 请求的名称。这定义了包含在应用程序中引用的服务和服务实例的 Optim 目录。正常情况下,Optim 目录连接名称将使用 OSI 连接请求 API 来获取,但在我们的代码示例中,Optim 目录连接名称已硬编码为一个在所有代码中引用的常量(不建议这么做)。

private static String OPTIM_DIR_CONNECTION = "OPTIMDIR";

覆盖的 HttpServlet 方法

OsiClientSampleServlet类只是 javax.servlet.http.HttpServlet类的一个扩展。因此,OsiClientSampleServlet的 doGet和 doPost方法使用 OsiClientSampleServlet中管理工作流的代码覆盖了 HttpServlet方法实现。

doGet方法

因为 GET 请求方法通常是在从 Web 浏览器发出请求时的默认请求方法,所以在通过 Web 浏览器访问 Web 客户端应用程序 URL http://localhost:8080/osiClientSample/OsiClientSampleServlet 时,doGet方法是最初调用的方法,它允许 OsiClientSampleServlet 构造之前引用的页面。高级流程逻辑如下所示:

  • 调用 displayServices方法处理 Optim Services 详细信息。
  • 调用 displayMonitoring方法处理 Optim Service Monitoring 详细信息。

doPost方法

只要从 http://localhost:8080/osiClientSample/OsiClientSampleServlet 的初始浏览器呈现和任何后续浏览器呈现中提交了一个表单,其中包含分配给 doPost 的 OPST 请求方法,就会调用 doPost。网页上的所有 Run 和 Purge 按钮都是网页自己的 POST 方法的一部分。高级流程逻辑如下所示:

  • 调用 displayServices方法处理 Optim Services 详细信息。
  • 如果提供了一个 Optim 服务标识符请求参数,则调用 executeService方法来运行由所提供的 Optim 服务标识符所标识的 Optim 服务。基本上讲,这相当于按下了一个 Run 按钮。
  • 如果提供了一个服务来执行实例标识符请求参数,则会调用 removeServiceInstance方法来删除由所提供的服务执行实例标识符标识的服务执行实例。基本上讲,这相当于按下了一个 Purge 按钮。
  • 调用 displayMonitoring方法处理 Optim Service Monitoring 详细信息。

帮助器方法

OsiClientSampleServlet 中包含的 4 个方法会调用多次,以执行与 OSI 进行通信、一般的响应有效负载处理和网页呈现所需的基本任务。这些方法如下所示:

getHttpURLConnection方法

此方法使用了一个 GET、POST、PUT 或 DELETE 类型的请求,通过 HTTP 连接在 OsiClientSampleServlet 和 OSI 之间建立一个通信渠道。高级流程逻辑如下所示:

  • 打开 HTTP URL 连接。
  • 为连接设置合适的请求方法。
  • 设置合适的请求标头。
  • 返回连接。

createDOMFromResponse方法

此方法将响应输入流格式化为一个 DOM 并返回。这为 OsiClientSampleServlet 提供了解析响应有效负载(现在由特定元素的 DOM 基于一个 XSD 规范来表示)的能力。高级流程逻辑如下所示:

  • 将响应解析到一个文档。
  • 返回该文档。

getTagsValue方法

getTagsValue方法基于一个 XSD 中定义的一个标记名称解析特定元素的 DOM。高级流程逻辑如下所示:

  • 获取来自由请求的元素标记名称标识的 DOM 的节点列表。
  • 返回列表中第一个节点的值。

displayPageHeader方法

displayPageHeader方法构造网页的开始 HTML 标记,定义该页面使用的级联样式表。

OSI Interfacing 方法

displayServices、displayMonitoring、executeService和 removeServiceInstance方法执行了 OsiClientSampleServlet 的所有主要工作。它们在必要时构造请求有效负载,将特定的请求发送到 OSI,在必要时处理返回的响应和响应有效负载。然后,它们使用从响应获取的数据来质询 OSI,以获得更多的信息,获得格式化数据,以便向 Web 浏览器显示这些数据。

displayServices方法

displayServices方法从 OSI 获取所有可用的 Optim 服务的列表。然后会处理该服务列表,从 OSI 获取每个服务的详细信息。最后,格式化并显示获取的 OSI 数据。图 2 是来自此方法的输出的一个示例。逻辑如下。

图 2. Optim 服务

使用Optim Service Interface开发自定义OPtim用户体验的指南
  • 执行一个 GET 请求并从 OSI 获取所有可用 Optim 服务的列表。
    ... 
     // Construct URL for retrieving a list of all Optim services from the OSI 
     URL urlGetServiceList = new URL(String.format("%s/service/%s", OSI_BASE_URL, 
                                    OPTIM_DIR_CONNECTION)); 
     HttpURLConnection conn = null; 
     // Issue a GET request to the OSI URL defined above 
     conn = getHttpURLConnection(urlGetServiceList, "GET"); 
     ...
  • 如果响应状态为 OK(响应代码为 200),那么提取节点的 Optim 服务链接列表:
    ... 
     if (conn.getResponseCode() == 200) { 
       // For an OK (200) response status, process the response body into a DOM 
       Document dom = createDOMFromResponse(conn.getInputStream(), 
                                            conn.getContentEncoding()); 
       NodeList nodeList = dom.getElementsByTagName("link"); 
     ...
  • 处理该 Optim 服务链接列表,提取每个 Optim 服务 href 链接。使用该链接向 OSI 执行另一个 GET 请求,这个请求将获取在该 href 链接上引用的 Optim 服务的详细信息。
    ... 
     // Process all the Optim service URL links returned 
     for (int i = 0; i < nodeList.getLength(); i++) { 
       // Construct URL for retrieving Optim service details from the OSI 
       String href; 
       href = nodeList.item(i).getAttributes().getNamedItem("href").getNodeValue(); 
       URL urlGetService = new URL(href); 
       conn = null; 
       // Issue a GET request to the OSI URL defined above 
       conn = getHttpURLConnection(urlGetService, "GET"); 
     ...
  • 对于每个 Optim 服务,检查响应状态是否为 OK(响应代码为 200),然后格式化并显示服务详细信息(服务 ID、服务名称和服务路径)。
    ... 
     if (conn.getResponseCode() == 200) { 
       // For an OK (200) response status, process the response body content into a DOM 
       dom = createDOMFromResponse(conn.getInputStream(), conn.getContentEncoding()); 
       // Extract service data from DOM and display content on web page 
       String serviceId = getTagsValue(dom, "serviceId"); 
       String servicePath = getTagsValue(dom, "servicePath"); 
       String serviceName = getTagsValue(dom, "serviceName"); 
       display.println("<tr>"); 
       display.println("<td>" + servicePath + "</td><td>" + serviceName + "</td>"); 
       display.println("<td align='center'>); 
       display.println("<form action='OsiClientSampleServlet' method='post'>"); 
       display.println("<input type='hidden' name='serviceId' value='" + serviceId); 
       display.println("'/><input type='image' src='execute.png' alt='Run …'/>"); 
       display.println("</form></td></tr>"); 
     } 
     ...

displayMonitoring方法

displayMonitoring方法从 OSI 获取所有 Optim 服务执行实例的列表。然后处理入伍执行实例列表,从 OSI 获取每个服务执行实例的详细信息,以及在服务执行实例中引用的每个服务。最后,格式化并显示获取的 OSI 数据。图 3 是来自此方法的输出的一个例子。逻辑如下。

图 3. Optim 服务监视

使用Optim Service Interface开发自定义OPtim用户体验的指南
  • 执行一个 GET 请求并从 OSI 获取所有 Optim 服务执行实例的列表:
    ... 
     // Construct URL to retrieve all Optim service execution instances 
     URL urlGetExecList = new URL(String.format("%s/monitor/%s", OSI_BASE_URL, 
                                 OPTIM_DIR_CONNECTION)); 
     HttpURLConnection conn = null; 
     // Issue a GET request to the OSI URL defined above 
     conn = getHttpURLConnection(urlGetExecList, "GET"); 
     ...
  • 如果响应状态为 OK(响应代码为 200),则提取节点的 Optim 服务执行实例链接列表:
    ... 
     if (conn.getResponseCode() == 200) { 
       // For an OK (200) response status, process the response body into a DOM 
       Document dom = createDOMFromResponse(conn.getInputStream(), 
                                            conn.getContentEncoding()); 
       NodeList nodeList = dom.getElementsByTagName("link"); 
     ...
  • 处理 Optim 服务执行实例链接列表,提取每个 Optim 服务执行实例 href 链接。使用该链接向 OSI 执行另一个 GET 请求,这个请求将获取在该 href 链接上引用的 Optim 服务执行实例的详细信息。
    ... 
     // Process all the Optim service monitoring URL links returned 
     for (int i = 0; i < nodeList.getLength(); i++) { 
       // Construct URL for retrieving Optim service execution instance details 
       String hrefLink; 
       hrefLink = nodeList.item(i).getAttributes().getNamedItem("href").getNodeValue(); 
       URL urlGetExecInstance = new URL(hrefLink); 
       conn = null; 
       // Issue a GET request to the OSI URL defined above 
       conn = getHttpURLConnection(urlGetExecInstance, "GET"); 
     ...
  • 对于每个 Optim 服务执行实例,检查响应状态是否为 OK(响应代码为 200),然后格式化服务执行实例字段:
    ... 
     if (conn.getResponseCode() == 200) { 
       // For an OK (200) response status, process the response body into a DOM 
       dom = createDOMFromResponse(conn.getInputStream(), conn.getContentEncoding()); 
       // Extract service instance execution data from DOM and format fields 
       String execId = getTagsValue(dom, "id"); 
       String serviceId = getTagsValue(dom, "serviceId"); 
       Format dateFormat = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss"); 
       long startTime = Long.valueOf(getTagsValue(dom, "startTime")).longValue(); 
       String startDate = dateFormat.format(new Date(startTime)).toString(); 
       String endDate = null; 
       String returnCode = null; 
       if (getTagsValue(dom, "endTime") != null && 
           !getTagsValue(dom, "endTime").equals("0")) { 
          long endTime = Long.valueOf(getTagsValue(dom, "endTime")).longValue(); 
          endDate = dateFormat.format(new Date(endTime)).toString(); 
          returnCode = getTagsValue(dom, "returnCode"); 
       } else { 
          endDate = "EXECUTING..."; 
          returnCode = "--"; 
       } 
     ...
  • 对于每个 Optim 服务执行实例,向 OSI 执行另一个 GET 请求,该请求将获取 Optim 服务执行实例中引用的 Optim 服务的详细信息。
    ... 
     // Construct URL for retrieving Optim service details from the OSI 
     URL urlGetService = new URL(String.format("%s/service/%s/%s", OSI_BASE_URL, 
                                OPTIM_DIR_CONNECTION, serviceId)); 
     conn = null; 
     // Issue a GET request to the OSI URL defined above 
     conn = getHttpURLConnection(urlGetService, "GET"); 
     ...
  • 如果响应状态为 OK(响应代码为 200),那么格式化并显示服务执行和 OPtim 服务详细信息:
    ... 
     if (conn.getResponseCode() == 200) { 
       // For an OK (200) response status, process the response body into a DOM 
       dom = createDOMFromResponse(conn.getInputStream(), conn.getContentEncoding()); 
       // Extract service data from DOM and display monitoring content on page 
       serviceName = getTagsValue(dom, "serviceName"); 
       display.println("<tr><td>" + execId + "</td><td>" + serviceName + "</td>"); 
       display.println("<td>" + startDate + "</td><td>" + endDate + "</td>"); 
       display.println("<td align='center'>" + returnCode + "</td>"); 
       display.println("<td align='center'>"); 
       display.println("<form action='OsiClientSampleServlet' method='post'>"); 
       display.println("<input type='hidden' name='executionId' value='" + execId); 
       display.println("'/><input type='image' src='purge.png' alt='Run...'/>"); 
       display.println("</form></td></tr>"); 
     } 
     ...

executeService方法

executeService方法获取 Optim 服务器实例,以及来自 OSI 的 Optim 服务详细信息。此数据用于创建一个请求有效负载,该有效负载然后会被发送到 OSI,以执行服务。然后格式化并显示 OSI 服务执行响应。逻辑如下。

  • 执行一个 GET 请求,并从 OSI 获取所有可用 Optim 服务器的列表:
    ... 
     // Construct URL for retrieving Optim server details from the OSI 
     URL urlGetServer = new URL(String.format("%s/runtime", 
                               OSI_BASE_URL)); 
     HttpURLConnection conn = null; 
     // Issue a GET request to the OSI URL defined above 
     conn = getHttpURLConnection(urlGetServer, "GET"); 
     ...
  • 如果响应状态为 OK(响应代码为 200),则获取 Optim 服务器列表中的第一个 Optim 服务器,然后向 OSI 执行另一个 GET 请求,以获取由所提供的服务标识符标识的 Optim 服务的 Optim 服务详细信息:
    ... 
     if (conn.getResponseCode() == 200) { 
       // For an OK (200) response status, process the response body into a DOM 
       Document dom = createDOMFromResponse(conn.getInputStream(), 
                                            conn.getContentEncoding()); 
       // Extract RSI URL data from DOM for use on the request payload 
       String rsiURL = getTagsValue(dom, "rsiURL"); 
       // Construct URL for retrieving Optim service details from the OSI 
       URL urlGetService = new URL(String.format("%s/service/%s/%s", OSI_BASE_URL, 
                                                 OPTIM_DIR_CONNECTION, serviceId)); 
       conn = null; 
       // Issue a GET request to the OSI URL defined above 
       conn = getHttpURLConnection(urlGetService, "GET"); 
     ...
  • 如果响应状态为 OK(响应代码为 200),则基于 XSD 定义构建请求有效负载,以包含该服务和 Optim 服务器细节。向 OSI 发出一个包含该请求有效负载的 POST 请求,以便使用指定的 Optim 服务器执行指定的服务。
    ... 
     if (conn.getResponseCode() == 200) { 
        // For an OK (200) response status, process the response body into a DOM 
        dom = createDOMFromResponse(conn.getInputStream(), 
                                    conn.getContentEncoding()); 
        // Extract service data from DOM and construct the request payload 
        String servicePath = getTagsValue(dom, "servicePath"); 
        String serviceName = getTagsValue(dom, "serviceName"); 
        StringBuilder payload = new StringBuilder(); 
        payload.append("<?xml version='1.0' encoding='UTF-8'?>"); 
        payload.append("<sem:serviceRequestExecutionInput "); 
        payload.append("xmlns:sem='http://www.ibm.com/optim/xsd/sem/9.1.0' "); 
        payload.append("xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' "); 
        payload.append("xsi:schemaLocation='http://www.ibm.com/optim/xsd/sem/9.1.0 
                       resource.xsd '>"); 
        payload.append(String.format("<serviceId>%s</serviceId>", serviceId)); 
        payload.append(String.format("<serviceName>%s</serviceName>", serviceName)); 
        payload.append(String.format("<servicePath>%s</servicePath>", servicePath)); 
        payload.append(String.format("<rsiURL>%s</rsiURL>", rsiURL)); 
        payload.append("</sem:serviceRequestExecutionInput>"); 
        // Construct URL for executing an Optim service via the OSI 
        URL urlExecuteService = new URL(String.format("%s/execute/%s/%s", OSI_BASE_URL, 
                                        OPTIM_DIR_CONNECTION, serviceId)); 
        conn = null; 
        // Issue a POST request and stream the request payload to the OSI URL above 
        conn = getHttpURLConnection(urlExecuteService, "POST"); 
        OutputStreamWriter outStreamWriter; 
        outStreamWriter = new OutputStreamWriter(conn.getOutputStream()); 
        outStreamWriter.write(payload.toString()); 
        outStreamWriter.flush(); 
     ...
  • 如果响应状态为 ACCEPTED(响应代码为 202),则格式化并显示服务执行标识符和消息:
    ... 
     if (conn.getResponseCode() == 202) { 
        // For an ACCEPTED (202) response status, process the response body into a DOM 
        dom = createDOMFromResponse(conn.getInputStream(), conn.getContentEncoding()); 
        // Extract service execution data from DOM and display content on page 
        String execId = getTagsValue(dom, "executionId"); 
        display.println("<p>The service execution request has been accepted 
                         for the following:"); 
        display.println("<br><br>Service Name:"); 
        display.println("lt;b>" + serviceName + "</b><br>"); 
        display.println("Execution ID:"); 
        display.println("<b>" + execId + "</b></p>"); 
        display.println("<p>Click refresh to monitor the service execution below.</p>"); 
     } 
     ...

removeServiceInstance方法

removeServiceInstance方法使用提供的服务执行标识符,向 OSI 发出针对指定的服务执行实例的删除请求。然后该方法会格式化并显示一个删除状态消息。逻辑如下。

  • 使用一个构造的 URL 向 OSI 发出一个 DELETE 请求,该 URL 包含一个特定的服务执行实例标识符:
    ... 
     // Construct URL for removing an Optim service execution instance 
     URL urlDeleteServiceInstance = new URL(String.format("%s/monitor/%s/%s",  
                                           OSI_BASE_URL, OPTIM_DIR_CONNECTION, execId)); 
     HttpURLConnection conn = null; 
     // Issue a DELETE request to the OSI URL defined above 
     conn = getHttpURLConnection(urlDeleteServiceInstance, "DELETE"); 
     ...
  • 如果响应状态为 NO CONTENT(响应代码为 204),则已成功删除服务执行实例,所以格式化并显示删除成功消息。
    ... 
     if (conn.getResponseCode() == 204) { 
       // For a NO CONTENT (204) response status, display successful deletion 
       display.println("<p>Service instance " + execId + " has been removed.</p>"); 
     } 
     ...

结束语

本文给出了一个流程来描绘 Web 客户端应用程序与 OSI 之间的通信:此流程可轻松地重复复制。示例代码进一步演示了此流程的可重复性质,本文档按照示例代码中的不同部分,循序渐进地介绍了该流程。有了本文和 配套的示例代码,您现在应该已经为实现利用了 Optim Service Interface 的自定义 Optim 用户体验开启了一个良好的开端。

  • 本文相关:
  • CentOS v7.0.1406已正式发布 企业级Linux发行版本
  • init系统:Systemd的简介和特点
  • 在RHEL 6上安装和配置IBM Network Advisor监视SAN
  • Rational Team Concert利用Patch撤销已经交付的变更集
  • init系统中Upstart简介及工作原理说明
  • 横向扩展存储方案的设计原则
  • Liberty Profile是什么?它有何用途?
  • IBM SoftLayer云服务器运行图形用户界面的概念、理由和步骤
  • Java传承的是平台:选择您的下一个JVM语言
  • 什么是Init系统,init系统的历史和现状
  • 免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved