为媒体转换设计REST服务

时间:2011-03-25 12:55:56

标签: web-services rest mime-types

我目前的任务是设计一个REST服务,可用于将一种媒体类型转换为另一种媒体类型(例如,从video / x-msvieo转换为video / x-flv)。它不应该是可用浏览器。 通常,我会让客户POST文件并返回一些URL以供进一步参考(如http://www.example.com/Media/12345)。

有趣的是 - 这就是问题出现的地方 - 转换过程可以用两种不同的方式解释:

1)转换后的媒体只是原始媒体的不同表示形式,因此要以新格式请求媒体,您可以获取http://example.com/Media/12345,并在Accept-header中告诉服务您采用何种格式需要。自从转换例如大视频以来,该服务将以202 Accepted响应,直到转换完成。但是,如果转换因任何原因失败,会发生什么?

2)由于转换需要很长时间,因此可以将流程表示为自己的资源。在这种情况下,必须将某种形式的作业描述(可能是xml)发送到http://example.com/Media/12345,服务将使用新的URI响应请求的转换(如http://example.com/Media/12345/jobs/1)。但这种设计难道不是非REST-linke吗?

我现在拥有的是:

1。)将媒体文件POST到http://example.com/Media
2.)回复:201创建/位置:http://example.com/Media/12345
3.)GET http://example.com/Media/12345
4.)响应:200 Ok和xml像这样:

<media id="123457">
    <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://example.com/Media/12345/video/x-flv">video/x-flv</link>
    <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://example.com/Media/12345/video/mpeg">video/mpeg</link>
</media>

xml中的链接会将您发送到此媒体可用的转化目标。

5.。)从xml中的链接中选择以开始转换/通过GET http://example.com/Media/12345/video/mpeg获取结果 6.)回复:202接受/位置:http://example.com/Media/12345/video/mpeg/Status
7.)重复步骤5直到完成转换或查看http://example.com/Media/12345/video/mpeg/Status以查看当前发生的情况。

所以,非常感谢阅读所有这些东西:) 您如何看待我的方法?你会以不同的方式做什么? 我对这些东西很新,所以任何建议都非常感谢。

亲切的问候:比尔

3 个答案:

答案 0 :(得分:2)

在第4步中,我会考虑使用300响应代码。您正在执行与客户端驱动的内容协商非常相似的操作。看看它是如何完成的http://www.w3.org/TR/wd-xptr

创建“作业”资源以表示新媒体文件的创建的想法是处理RESTful系统中长时间运行操作的完全有效且非常常见的方法。

唯一的另一个评论是,在第5步中,我最初担心使用GET来做到这一点,但考虑到它更多似乎是合理的。这很好,因为最终转换的视频可以在同一个URL上使用。然后所有客户端要做的就是要知道,如果他们请求视频并获得202,他们只需等待一段时间再重试。如果他们想要,他们可以检查./status资源以了解它是否已完成。我想你只需要确定你是否已经在转换过程中再返回202但是没有开始新的转换过程:-)

答案 1 :(得分:1)

是的,重定向(大概)到http://example.com/Media/12345/jobs/1听起来不太安静。听起来您正在尝试通过同步接口实现异步服务。你不能发布一个'转换请求'资源来启动会话的过程,即有点像:

Class ConversionRequest
{
 Guid sessionid
  Int status
…
}

然后使用GET / sessionId检查转换的状态?根据我的经验,如果一个安静的界面开始感觉复杂,通常意味着资源不适合手头的任务。

答案 2 :(得分:0)

你接近似乎很好。您可以对URI中的任何概念进行编码,其中显然包括作业概念。这完全取决于您希望如何设计应用程序界面(资源)。

这是我攻击它的一种方式,它可能会给你一些想法。 (这取决于您的客户和应用程序协议/接口

  • /媒体
    • GET - 媒体列表+状态等。
    • POST - 添加媒体+返回位置: / media / {number} / jobs / {number}
  • /媒体/ {数}
    • GET - 显示媒体状态(有效,正在进行),格式等。链接到默认/当前作业
  • /媒体/ {数} /作业
    • GET - 工作列表
    • POST - 做额外/特殊转换
  • /媒体/ {数} /格式/ {名称}
    • GET - 下载
    • PUT - 开始特定转换,重定向到作业。
  • / media / {number} / jobs / {number} - 工作状态等
    • GET - 状态等,
    • 删除 - 取消工作

请记住,PUT和DELETE是幂等的,POST不是。

您使用超媒体和链接的方式看起来不错。客户端应通过链接发现下一步或相关信息,而不是依赖于诸如URI结构之类的带外信息。

相关问题