2

假设我的文件中有这样的routes文件:

 GET     /api/jobs/:hash                 controllers.Jobs.read(hash)

现在,我知道如果发出这样的请求,Play 可以将其路由到插入controllers.Jobs.read正确的hash参数以触发 anAction并返回 a Result。此外,我知道我可以通过路由routes.Jobs.read.url(hash)生成将字符串返回给我的路径/api/jobs/${hash}(这很棒,我一直都在使用它)。

但是我有一个不同的用例(与上面的用例不同),我想知道 Play 是否也可以帮助我。我想要做的(并且 Play 必须在内部某个地方做)是采用给定的路径,例如/api/jobs/12345,然后将其传递给一个函数,该函数将简单地返回给我一个Option[String]表示哈希参数(假设它是一个有效的路由)但不是调用动作。

我希望在某个地方有一个自动生成的函数,比如routeparsers.Jobs.read(url: String): Option[String],或者更一般地说routeparser.Jobs.read(url: String): Map[String,String]。我查看了一些生成的代码,但没有看到任何这样的实用程序函数(至少不是我认识的那些)。

为了清楚起见,这里的问题在于超媒体 API,其中 API 的用户将向我传递请求,其中主体(在我的情况下为 JSON)通过其 URL 引用资源。我需要能够将这些 URL 转换为对实际服务器端资源的引用,为此,我需要首先确认它们是引用预期类型资源的正确格式(即它们符合模式),然后提取我可以用来识别服务器端资源的关键参数。所以关键是我没有使用这些 URL 来触发Action,我只是使用它们来尝试识别服务器端资源。由于显而易见的原因,我感兴趣的 URL 模式将是与我的routes文件中的 GET 请求相关联的那些。

我希望 a) 因为这对于超媒体 API 来说是非常必要的功能,并且 b) Play 必须在路由期间的某个时间点完成几乎所有这些工作,因为有一种相当简单的方法可以访问此功能。

4

1 回答 1

0

这个答案可能有点晚了,但我只是偶然发现了你的问题。

与您正在搜索的内容最接近的是路由器API本身,您可以通过它访问它Application.router(自 2.2 以来已记录,但它也可能在 2.1 中工作)。

Router对象有一个handlerFor方法,它应该是您想要的(尽管以一种稍微低级的方式)。

于 2014-07-08T03:19:05.060 回答