简体版  |  繁体版   推荐信息: 阅读排行 | 滚动 | 微软SOA高峰会 | 中型企业创新社区 | 随心所欲发新闻
企业软件

使用XML实现REST式的SOA

出处:比特网 作者:Adriaan de Jonge 2008-03-17 15:40 评论
字体大小: | |
面向服务体系结构常常意味着大型企业所用的重型技术。SOA 体系结构模式的优点也适用于比较小的环境。在采用 SOA 原理时,不必承担大型环境所需的所有开销。可以使用 REST 这样的轻量型技术实现 SOA。本文讲解实现的方法。

  代码示例:URL 映射

  可以使用多种方式把 URL 映射到实现方法。比较先进的方法可能更灵活,应该用在比较大的应用程序中。这个小示例使用最简单的方法:正则表达式。下面是 BagServlet 上的 post 方法示例,它把 URL 参数传递给底层 servlet。可以在本文的下载文件中找到完整的 servlet 代码。注意,这里没有实现实际的底层服务。 以下是该示例:

  protected void doPost(HttpServletRequest request, HttpServletResponse response)

  throws ServletException, IOException {

  Pattern pattern = Pattern.compile("^/?.*?/bags/(.*)/status/(.*)$");

  Matcher matcher = pattern.matcher(request.getRequestURI());

  if(matcher.matches()) {

  String bagId = matcher.group(1);

  String newStatus = matcher.group(2);

  bagService.changeBagStatus(bagId, newStatus);

  }

  }

  在调用这个 URL 时,如果成功,就会隐式地返回状态码 200。更有意义的是,代码返回 XML 结构。这个示例使用 XStream API 把 Java™ 对象转换成 XML 结构。这个 API 需要的配置非常少,而且主要根据类中的字段名选择元素名。

  这个示例代码使用下面这些简单的类:

  航班:

  package eu.adraandejonge.restfulsoa;

  public class Flight {

  String id;

  public Flight(String id) {

  super();

  this.id = id;

  }

  }

  乘客:

  package eu.adraandejonge.restfulsoa;

  public class Traveller {

  private String id;

  public Traveller(String id) {

  super();

  this.id = id;

  }

  }

  包裹:

  package eu.adraandejonge.restfulsoa;

  public class Bag {

  private String id;

  private Flight flight;

  private Traveller traveller;

  private String status;

  public Bag(String id, Flight flight, Traveller traveller, String status) {

  super();

  this.id = id;

  this.flight = flight;

  this.traveller = traveller;

  this.status = status;

  }

  }

  假设底层的 BagService 返回一个包裹,包裹的航班 ID 是 1,乘客 ID 是 1,状态是 new。请考虑下面的 GET 实现:

  protected void doGet(HttpServletRequest request, HttpServletResponse response)

  throws ServletException, IOException {

  Pattern pattern = Pattern.compile("^/?.*?/bags/(.*)$");

  Matcher matcher = pattern.matcher(request.getRequestURI());

  if (matcher.matches()) {

  String bagId = matcher.group(1);

  Bag bag = bagService.retrieveBag(bagId);

  XStream xstream = new XStream();

  xstream.alias("bag", Bag.class);

  xstream.alias("traveller", Traveller.class);

  xstream.alias("flight", Flight.class);

  xstream.useAttributeFor(Bag.class, "id");

  xstream.useAttributeFor(Traveller.class, "id");

  xstream.useAttributeFor(Flight.class, "id");

  String xml = xstream.toXML(bag);

  response.getWriter().write(xml);

  }

  }

  在查询这个 URL 时,它会返回以下信息:

  new

  还能做什么?

  我选择这些示例代码是为了说明,不需要很多底层通信,URL 也能够实现很多功能。对于其他服务,可能需要处理上传给 REST 服务的 XML 结构。XStream 也可以帮助完成这个任务。例如,要想对包裹的 XML 结构进行去序列化,应该调用:

  Bag bag = (Bag) xstream.fromXML(xml);

共3页。 9 1 2 3 :
  • 本文关键字:
  • 应用(2162)
  • 网友关注
    热门产品
    编辑推荐
    推荐专题
    更多
    思科
  • 打开网络创新之门
  • 思科公司于北京嘉里中心饭店成功举办了主题为“创新网络,绿色引擎”的思科创新日暨思科新品发布会。
  • 论坛热贴
    更多
    博客精选
    更多
    视频推荐
    更多
  • 杜青松:对IT人员要求别具一格
  • 在对杜青松的采访中,他透露出目前在中粮包装有限公司信息化建设的工作中的一个难点——IT人力资源短缺。
  • TMG

    Copyright (C) 1999-2008 Chinabyte.com, All Rights Reserved 版权所有 天极网络

    渝ICP证B2-20030003号 商务联系、网站内容、合作建议:010-82657868

    版权声明 在线提交意见反馈 Powered by 天极内容管理平台CMS4i

    经营性网站备案信息 网警备案 中国网站排名