如何用api蓝图格式描述会话?

时间:2014-05-06 21:12:12

标签: sails.js apiblueprint apiary.io apiary dredd

我目前正在尝试使用apiary.io描述现有API。系统通过登录请求实现身份验证,该请求返回包含会话ID的http-cookie。

据我所知,浏览器在发出另一个请求时会将之前从主机收到的所有http-cookies发送回给他。

看来,Dredd在运行我的蓝图文件生成的测试时并没有这样做。因此,任何需要用户登录的请求都无法正常进行测试。

是否有可能将请求标记为“在运行此请求之前需要”以强制Dredd管理这些http-cookies?

顺便说一句,REST服务是在Sails.js中实现的,node.js是一个mvc框架。

2 个答案:

答案 0 :(得分:1)

这是旧的,但我刚遇到同样的问题,而且dredd文档已经过时了(不是那么讽刺吗?!),所以既然我想出来这可能对某人有帮助:))

您可以使用hooks读取和覆盖响应并请求正文和标题(这是我在该主题中找到的最新页面,但仍然存在问题和拼写错误)。需要注意的是,dredd似乎没有cookie的帮助器,所以你必须自己解析并构建cookie头。

在我的情况下,sessionId返回json主体以及cookie:我解析了主体,因为这样更容易,但如果需要,你可以很好地从响应cookie中检索会话。这里大概是我写的使用auth工作的钩子:

hooks = require('hooks');
stash = {}

// hook to retrieve session on a login
hooks.after('Auth > /remoteauth/userpass > POST', function(transaction){
  stash['token'] = JSON.parse(transaction.real.body)['sessionId'];
});

// hook to set the session cookie in all following requests
hooks.beforeEach(function(transaction){
  if(stash['token'] != undefined){
    transaction.request['headers']['Cookie'] = "id=" + stash['token']
  };
});

The docs解释了如何设置钩子,虽然有一件事让我感到困惑的是dredd --names命令在同一目录中有dredd.yml文件时不起作用(看起来像文件的存在使dredd忽略所有命令行参数。)

答案 1 :(得分:0)

Dredd旨在运行并针对测试环境设置,例如在带有测试夹具的CI工具中。它不应该在生产环境中运行。

据说可能有时需要在测试端点时执行设置或拆卸操作。计划最终提供test scenarios

如果您需要设置/拆卸功能,您可以使用Dredd"挂钩"正如所讨论的那样here