基于标题的路由与Slim 3

我有一条Slim 3路线: $ app-&gt; get('/ calendar / {date} ','CalendarCtrl:getSchedule'); </ code>

这条路由可以通过简单的HTML列表,json或xml格式返回相同的时间表。

我现在正在寻找一个基于的简单REST解决方案 接受</ code>(或更多标头)HTTP标头。 </ p>

例如:

请求:</ p>

  GET / calendar / 2017-01-01 
Accept:application / json \ n </ code> </ pre>

响应:</ p>

  Content-Type:application / json 
Body:{json schedule}
</ 代码> </ pre>

所以路由应该是这样的: $ app-&gt; get('/ calendar / {date}',{Accept:application / json},' CalendarCtrl:getScheduleJson'); </ code> </ p>

我知道我可以在路由处理程序中检查该标头。 但我正在寻找一个简单的声明性</ strong>解决方案。</ p>
</ div>

展开原文

原文

I have a Slim 3 route: $app->get('/calendar/{date}', 'CalendarCtrl:getSchedule');
This route can return the same schedule by simple HTML list, json or xml format.
Now I'm looking for a simple REST solution based on Accept (or more headers) HTTP header.

For example:
Request:

GET /calendar/2017-01-01  
Accept: application/json

Response:

Content-Type: application/json
Body: {json schedule}

So a route should be smth like this: $app->get('/calendar/{date}', {Accept: application/json}, 'CalendarCtrl:getScheduleJson');

I know I can check for that header in a route handler. But I'm looking for a simple declarative solution.

1个回答



在从API发送响应之前添加中间件以检查该标头</ p>

  $ app-&gt; add(函数($ req,$ res,$ next){
//在这里检查$ req content-type然后发送带有相同的响应
//示例
$ headerValue = $ req-&gt; getHeader('Accept');
if($ headerValue =='application / json')
{
$ response = $ next($ req,$ res);
return $ response
  • &gt; withHeader('Content-type','application / json');
    }
    else {

    //在此检查其他标题
    }
    });
    </ code> < / pre>
    </ div>

展开原文

原文

Add a middleware to check for that header before sending the response from your API

$app->add(function ($req, $res, $next) {
//Checking for $req content-type here then send the response with the same one 
//example 
$headerValue= $req->getHeader('Accept');
if($headerValue=='application/json')
{
  $response = $next($req, $res);
    return $response
            ->withHeader('Content-type', 'application/json');
 }
else{

//check for other header here  
}      
});

douao8204
douao8204 在Slim3中添加中间件很容易就像我的代码一样,我使用add函数来创建任何middelware层
3 年多之前 回复
duanjian7617
duanjian7617 Slim中的中间件变化很简单,你将在你的API周围提供一个图层在将请求传递给API之前检查一些事情并在响应中添加一些东西然后再发送给客户端
3 年多之前 回复
dongqiao1888
dongqiao1888 还有一个问题:在Accept:text / html标题的情况下,我需要使用Twig模板渲染构建一个html页面。 它比简单的返回$ response-> withHeader('Content-type','application / json')更复杂但更复杂; 问题是:这样的逻辑应该在中间件中吗? 也许控制器是正确的地方? 如果是,我回到上一个问题:中间件无法解决基于头的路由问题。 它根本不是路由。
3 年多之前 回复
dousi3362
dousi3362 感谢中间件的想法。 对我来说这是一个新概念,请告诉我在Slim中使用中间件的最佳做法是什么? 你使用了匿名函数,Slim docs使用invokable类,其他指南扩展了SlimMiddleware(Slim 2)。 你用什么作为中间件的最佳实践? 谢谢
3 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐