跳转至

53 RESTful Web Services(17):如何进行Spike的架构愿景细化?

你好,我是徐昊。今天我们继续使用TDD的方式实现RESTful Web Services。

回顾架构愿景与任务列表

目前我们已经实现了ResourceRouter,整体的架构愿景如下:


细化任务列表

沿着调用栈的顺序,就要进入RootResource/Resource/ResourceMethod的开发中。未经细化的任务列表如下:

  • Resource/RootResource/ResourceMethod

  • 在处理请求派分时,可以支持多级子资源(Sub-Resource)

  • 在处理请求派分时,可以根据客户端提供的超媒体类型,选择对应的资源方法(Resource Method)
  • 在处理请求派分时,可以根据客户端提供的Http方法,选择对应的资源方法
  • 资源方法可以返回Java对象,由Runtime自行推断正确的返回状态
  • 资源方法可以不明确指定返回的超媒体类型,由Runtime自行推断,比如,资源方法标注了Produces标注,那么就使用标注提供的超媒体类型等
  • 资源方法可按找期望的类型,访问Http请求的内容
  • 资源对象和资源方法可接受环境组件的注入

而在当前架构愿景下,RootResource/Resource/ResourceMethod都需要使用UriTemplate、UriInfoBuilder作为支撑。其中,UriInfoBuilder还没有具体的接口设计,那么我们可以先实现UriTemplate。视频演示如下:

接下来,我们可以细化UriTemplate的任务:

  • UriTemplate

  • 匹配无参数的Uri模版

    • 如果Uri可以与模版匹配,则返回匹配结果
    • 如果Uri不能与模版匹配,则返回Optional.empty
    • 匹配带参数的Uri模版

    • 如果Uri可以与模版匹配,按照指定参数从Uri中提取值

    • 参数可以通过正则表达式指定格式
    • 如果参数重复定义,则抛出异常
    • 模版匹配的结果可以比较大小

    • 如果匹配的非参字符多,则优先(长的优先)

    • 如果匹配的非参数字符一样,匹配的分组多,则优先(参数优先)
    • 如果匹配的分组一样多,指定格式参数匹配多的优先(指定格式参数优先)

思考题

如何根据variable获取值?

欢迎把你的想法分享在留言区,也欢迎把你的项目代码分享出来。相信经过你的思考与实操,学习效果会更好!

精选留言(1)
  • Jason 👍(0) 💬(0)

    正则表达式真是神奇😅

    2022-08-11