Symfony:针对机器人和人类的REST Web服务 - 开放式问题

时间:2011-02-01 12:25:38

标签: php web-services rest symfony1 bots

我正在向一个Symfony应用程序添加一个API,该应用程序应该充当REST Web服务。但是有一些悬而未决的问题。

机器人的不同URI?

我经常阅读使用像/api/:id/[...]这样的URI的“建议”,但我认为它们不符合REST:无论是机器人还是人类 - 同样 u nique r esource i 已识别。

我问,因为我上面的陈述是有道理的,但我不认为所有其他人都有错。

修改现有控制器?

为两种情况需要单独的控制器逻辑有几个原因:

  • 如果是api-requests
  • ,则无会话登录
  • 必须创建不同的Symfony表单(例如,根本不需要任何小部件。)
  • JSON / XML而不是HTML输出

我不想修改现有的控制器。根据开放 - 封闭原则,类应该是开放的扩展,但是关闭以进行修改,并且控制器类已经在“生产”环境中使用。

我的想法是使用额外的HTTP标头字段(例如“X-UseApi”)。路由应通过评估来调用不同的操作。这可能在routing.yml中吗?怎么样?你有其他想法吗?

验证

这就是我实现bot-authentication的方法:


$user = Doctrine_Core::getTable('sfGuardUser')->findOneByUsername($params['user']);
if($user->checkPassword($params['password']))
{
  //...
}

但代码看起来像是我眼中的一种解决方法。整个REST身份验证问题是否有更好的解决方案? sfGuardPlugin / sfDoctrineGuardPlugin是否不符合此类用例的条件?

先谢谢你的欢呼声, 鱼骨

2 个答案:

答案 0 :(得分:0)

我这样做的方法是在路线中使用sf_format来区分机器人和人类(机器人可能需要使用XML而人类需要HTML。

我会改变我的控制器,我会根据请求的格式将逻辑委托给不同的类(这不应该太多工作​​,你会得到你需要的灵活性)。

至于身份验证 - 请提供更多关于你现在如何做的信息 - 这个例子不足以让我对你的实现如何运作有所了解。

答案 1 :(得分:0)

机器人的不同URI?

我建议不要过多担心URI。它们存在更多问题,并且过多地考虑它只会导致失去时间。恕我直言,如果有标准化的约定如何定义RESTful URI将会很棒。这是一篇关于它的文章:http://redrata.com/restful-uri-design/。你可以看到,设计你的uris的每一种方式都有其优点和缺点。

但是今天我会拒绝'api / ...'不符合REST的声明。我会避免它。

控制器和身份验证

最后,我的解决方案是实现一些sfFilters,其职责如下:

  • ApiAccessFilter :如果将X-ApiKey定义为标题字段,则设置request-attribute'isApiRequest'。
  • ApiKeyAuthFilter :通过X-ApiKey标识用户,调用signIn / forwards进行登录操作。
  • SecureApiAccessFilter :检查当前用户是否有凭据 'apiWriteAccess',如果HTTP方法是POST,PUT或DELETE。

第一个过滤器允许我稍后在我的操作中调用$request->getAttribute('isApiRequest')。这与isXmlHttpRequest()类似。最后,我得出的结论是,我必须修改现有的操作,因为Web服务扩展导致需求发生了变化。

干杯,鱼骨