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 应用程序的生产模式下进行热重新部署?