我正在向一个Symfony应用程序添加一个API,该应用程序应该充当REST Web服务。但是有一些悬而未决的问题。
我经常阅读使用像/api/:id/[...]
这样的URI的“建议”,但我认为它们不符合REST:无论是机器人还是人类 - 同样 u nique r esource i 已识别。
我问,因为我上面的陈述是有道理的,但我不认为所有其他人都有错。
为两种情况需要单独的控制器逻辑有几个原因:
我不想修改现有的控制器。根据开放 - 封闭原则,类应该是开放的扩展,但是关闭以进行修改,并且控制器类已经在“生产”环境中使用。
我的想法是使用额外的HTTP标头字段(例如“X-UseApi”)。路由应通过评估来调用不同的操作。这可能在routing.yml中吗?怎么样?你有其他想法吗?
这就是我实现bot-authentication的方法:
$user = Doctrine_Core::getTable('sfGuardUser')->findOneByUsername($params['user']);
if($user->checkPassword($params['password']))
{
//...
}
但代码看起来像是我眼中的一种解决方法。整个REST身份验证问题是否有更好的解决方案? sfGuardPlugin / sfDoctrineGuardPlugin是否不符合此类用例的条件?
先谢谢你的欢呼声, 鱼骨
答案 0 :(得分:0)
我这样做的方法是在路线中使用sf_format来区分机器人和人类(机器人可能需要使用XML而人类需要HTML。
我会改变我的控制器,我会根据请求的格式将逻辑委托给不同的类(这不应该太多工作,你会得到你需要的灵活性)。
至于身份验证 - 请提供更多关于你现在如何做的信息 - 这个例子不足以让我对你的实现如何运作有所了解。
答案 1 :(得分:0)
机器人的不同URI?
我建议不要过多担心URI。它们存在更多问题,并且过多地考虑它只会导致失去时间。恕我直言,如果有标准化的约定如何定义RESTful URI将会很棒。这是一篇关于它的文章:http://redrata.com/restful-uri-design/。你可以看到,设计你的uris的每一种方式都有其优点和缺点。
但是今天我会拒绝'api / ...'不符合REST的声明。我会避免它。
控制器和身份验证
最后,我的解决方案是实现一些sfFilters,其职责如下:
第一个过滤器允许我稍后在我的操作中调用$request->getAttribute('isApiRequest')
。这与isXmlHttpRequest()
类似。最后,我得出的结论是,我必须修改现有的操作,因为Web服务扩展导致需求发生了变化。
干杯,鱼骨