PlayFramework 之类的中间件

Posted

技术标签:

【中文标题】PlayFramework 之类的中间件【英文标题】:PlayFramework sort of middleware 【发布时间】:2016-04-20 17:14:39 【问题描述】:

我是第一次使用 Play Framework。

通常在 Node.js(使用 Express)中我做了这样的事情:

此代码只是检查请求是否“想要”一个 html 文件,如果是,则发送 index.html 文件,否则将请求传递给 api 路由器,以便以 json 响应。 em>

   app.use('*', function(req,res, next)
        if(req.accepts('html'))
            var options = 
                root: __dirname + '/public/',
            ;
            return res.sendFile('index.html', options);
        else
            next();
        
    );

例如,如果我询问带有任何 url 的 html 页面,服务器会返回 index.html 文件,但如果我询问 JSON(或任何其他不是 html 的内容),则服务器会使用其他路由回答请求。

实际例子:

请求 /api/user -> 使用控制器 a 将服务器句柄作为路由“/api/user”; html 请求 / -> 服务器用 index.html 文件回答; 请求 / -> 使用控制器 b 使用路由“/”服务器应答

在 Play 中有办法做到这一点吗?

【问题讨论】:

【参考方案1】:

是的,只需查看 conf 下的路由文件。它定义了您的 Web 应用程序中的路由。您可以指定路由的类型、URL 模式以及将处理它的控制器/方法。例如,

GET    /                                 controllers.Dashboard.view()
GET    /dashboard/viewdata/:service      controllers.Dashboard.viewData(service: String)
GET    /dashboard/hourlydemand           controllers.Dashboard.hourlyDemandData
GET    /customerservice/meterinfo/daily  controllers.customerService.MeterReports.daily

在上面的第二个路由中,从 URL 中获取服务作为字符串并传递给 Dashboard 控制器的 viewData() 方法。

参见此处:https://www.playframework.com/documentation/2.5.x/JavaRouting

如果您需要处理具有不同结果的单个控制器请求路由,则可以执行以下操作:

public Result list() 
    List<Item> items = Item.find.all();
    if (request().accepts("text/html")) 
        return ok(views.html.Application.list.render(items));
     else 
        return ok(Json.toJson(items));
    

取自:https://www.playframework.com/documentation/2.5.x/JavaContentNegotiation

【讨论】:

我了解如何根植东西,但我需要的是:GET * controllers.Home.requestAcceptHTML() 并且在控制器中,如果请求标头中有Accept text/html 我用索引文件回答,或者我只是使用我在 Play 中的其他路线 我认为这将是两条不同的路线。一个处理 .html 路由,另一个处理 JSON 路由。或者您可以在控制器本身中处理它并根据请求传回适当类型的响应。例如。如果您要求 /path/index.html,那么您处理该路由模式以返回 html。如果它只是转到 /path,那么您也许可以返回 JSON。由你决定如何编码你的路线:) @ManoDestra 您可以为此使用内容协商。不需要单独的路线。 是的,我在上面提到过。 实际上,在您提到它之前,如果您已阅读我的完整评论:“或者您可以在控制器本身中处理它并根据请求传回适当类型的响应。”。我只是在上面编辑了我的答案以包含对它的引用。

以上是关于PlayFramework 之类的中间件的主要内容,如果未能解决你的问题,请参考以下文章

牛客 - Yuki with emofunc and playf(同余最短路)

http chunked, tcp flow control 和 playframework 结合

如何在 Play Framework 2 应用程序的生产模式下进行热重新部署?

markdown Android的开发之TextView的中间设置横线,适用于电商项目,商品原价之类的功能。

Playframework 2.4 单例,对象

如何跟踪 Playframework 调用的所有 HTTP 请求?