首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

REST Service 的最佳实践,第 3 部分 把 SOAP 服务转化为 REST 服务-4

REST Service 的最佳实践,第 3 部分 把 SOAP 服务转化为 REST 服务-4

Step5: 创建 eclipse 开发环境,详细步骤请参考 。
Step6: 创建一个 WebSphere sMash 新项目,取名 SOAP2REST。如图 4 所示。
图 4. 创建 zero 项目 SOAP2REST开始转换
sMash 提供了一个组件叫 zero.connection.soap.REST2SOAPHandler,它封装了 SOAP 协议,负责构建 SOAP header,发送 SOAP 请求,调用成功后,它返回 SOAP body。所以程序员只需要做其中很小的一部分工作就可以完成 SOAP 到 REST 的转换。按照下面的步骤完成转化的过程。
Step 1: 在 zero.config 文件里面添加如清单 7 所示的代码片段,配置转换 hanlder 以及转换的对应关系。
清单 7. 在 zero.config 中申明 REST2SOAPHandler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/config/connection/destinations += {
"http://localhost:9980/cms/*": {
"handlers" : [
{ "class" : "zero.core.connection.handlers.logger.SimpleJavaLoggerHandler.class" },
{ "class" : "zero.connection.soap.REST2SOAPHandler",
"config" : {
   "endpointAddress" : "http://www.webservicex.net/stockquote.asmx",
   "SOAPVersion" : "1.1",
   "r2sMapping" : [
     {
      "RESTOperation" : "POST",
      "SOAPBodyTemplate" : "stockquoterequest.gt",
       "URLMatch" : "/cms/stockquote/{symbol}",
"SOAPAction": "http://www.webserviceX.NET/GetQuote"
        }
            
        ]
          }
        },
{ "class" : "zero.core.connection.handlers.logger.SimpleJavaLoggerHandler.class",
    "config" : {
"request" : { "keys" : ["/connection/request/body", "/connection/request/soapHeaders"] },
"response" : { "keys" : ["/connection/response/body",
"/connection/response/soapHeaders"] }
        }
      }
    ]
  }
}




在清单 7 中,配置 REST2SOAPHandler 的各种参数,比如 endpointAddress,SOAPVersion,r2sMapping,实现类等。在 r2sMapping 中,配置 SOAP 和 REST 的对应关系,SOAP 操作由 SOAPAction 属性指定,相对应的 REST 的操作属性由 RESTOperation 指定;另外需要指定的是 SOAPBodyTemplate,用 gt 格式的文件指定;URLMatch 表明了 SOAP 服务端点和 REST 服务端点的对应。在清单 8 给出了 stockquoterequest.gt 的内容。
清单 8. 指明 SOAP 请求 Header 中的内容
1
2
3
4
5
6
<%
// the SOAP request body
%>
<GetQuote xmlns="http://www.webserviceX.NET/">
     <symbol><%=r2s_getParam("symbol")%></symbol>
</GetQuote>




其中 r2s_getParam("symbol") 指的是从 REST 请求的 request 里面取出来参数的值。比如 REST 请求是 ,那么 r2s_getParam("symbol") 的值就是 IBM.
指明了 handler 和 SOAP 请求后,我们需要创建一个 public 的 zero resource,在 public 目录下面,我们把这个 resource 叫做 stockquote.gt 吧,清单 9 给出了具体的内容。
清单 9. 声明一个 zero 的 public 的资源 stockquote.gt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<%
import zero.core.connection.*;
def symbol = java.net.URLEncoder.encode(request.params.symbol[])
logger.INFO{symbol}
%>
<%
try {
// 这里的 URL 应该和 zero.config 中的 URL 对应,并指明 REST 的操作为 POST
conn = new Connection("http://localhost:9980/cms/stockquote/${symbol}",
  Connection.Operation.POST);

// 指明 content-type
conn.addRequestHeader("Content-Type", "application/xml");

// 发送请求
resp = conn.getResponse();
body = resp.getResponseBodyAsString();

if (body == null) {
throw new Exception("Response body incorrect: " + body.toString());
}
// 取出服务返回的相应
def respObj = zero.json.Json.decode(body);
request.json.output = respObj;
// 指明一个 gt 用来处理返回的相应,如清单 10
request.view = "stockquote.gt";
render()
} catch (Exception e) {
e.printStackTrace();

print("<p><strong>Test failed!</strong></p><p>
"+zero.util.XMLEncoder.escapeXML(e.toString())+"</p>");
}
%>




声明了 public 的资源后,用户就可以用 的方式访问资源了。
清单 10. 处理返回的相应的 groovy 模板
1
2
3
4
5
6
<%
headers.out."Content-Type" = "application/xml"
def respObj = request.json.output[]
def stockquote = respObj.GetQuoteResponse.GetQuoteResult
print(stockquote);
%>

返回列表