如何使用REST使用drupal中的查询字符串检索用户?

时间:2011-06-21 17:47:31

标签: web-services drupal drupal-6 httpwebrequest

我想要什么

我希望能够重置用户密码而无需通过电子邮件发送。我还需要通过REST(这是一个自助服务终端系统)来做到这一点。

所以我需要:

  1. 获取具有特定用户名的用户
  2. 重置该用户的密码
  3. 尽我所能,我无法使用用户名获取用户。

    问题

    在我通过REST使用管理员用户登录之后我做了:

    GET on http://mydomain.com/rest/user?name=user

    根据REST文档,这应该让用户名为user

    我得到200回复​​,但身体没有任何回复

    我尝试过什么

    从ID获取节点

    一旦我以管理员身份登录,我就可以:

    获取http://mydomain.com/rest/user/1

    这样可以在响应中返回用户1的详细信息。但我需要通过用户名搜索用户。

    不同的GET

    GET on http://mydomain.com/rest/user/admin
    GET on http://mydomain.com/rest/user/account/name/admin
    GET on http://mydomain.com/rest/user?account[name]=admin
    GET on http://mydomain.com/rest/user?uid=1
    GET on http://mydomain.com/rest/user/retrieve?uid=1
    GET on http://mydomain.com/rest/user?account[uid]=1
    

    所有这些都失败了。

    节点而不是用户

    http://mydomain.com/rest/node/1上工作,但是http://mydomain.com/rest/node?nid=1给了我200回复​​,身体里没有任何内容。

    所有用户列表

    GET on http://mydomain.com/rest/user/也未显示所有用户的列表。我再次获得200空身体。

    进一步详情

    • 我正在使用Drupal 6.22安装。
    • 我已经安装了服务模块(3.0 RC1)和REST服务器(2.0 beta 1)。
    • 我安装了会话认证模块。
    • 我尝试了以上会话身份验证并关闭它。
    • 我已为我设置的REST端点启用了所有节点资源和用户资源。
    • 我尝试过上面有没有干净的网址,似乎没什么区别。

    问题

    如何获得具有特定用户名的用户?我做错了什么?

    更新

    我已经卸载然后重新安装的服务模块,我对REST服务器做了同样的事情。我还将我的CTools版本推回到最新推荐的版本。我已经添加了一个全新的服务,以防它被破坏。我什么都做不了。令人沮丧!

    更新2

    我发现了问题,但想要一个更持久的解决方案。事实证明,由于表命名,这是一个错误。请参阅我当前接受的答案。

3 个答案:

答案 0 :(得分:3)

对不起,这对你来说太令人沮丧了。我是服务模块的维护者,并且真的在编写文档,但我想我会在这里回答让你继续前进。

您没有获得任何所需数据的原因是您传递的参数错误。

如果你看一下user_resource.inc索引定义如下

      'index' => array(
    'file' => array('type' => 'inc', 'module' => 'services', 'name' => 'resources/user_resource'),
    'callback' => '_user_resource_index',
    'args' => array(
      array(
        'name' => 'page',
        'optional' => TRUE,
        'type' => 'int',
        'description' => 'The zero-based index of the page to get, defaults to 0.',
        'default value' => 0,
        'source' => array('param' => 'page'),
      ),
      array(
        'name' => 'fields',
        'optional' => TRUE,
        'type' => 'string',
        'description' => 'The fields to get.',
        'default value' => '*',
        'source' => array('param' => 'fields'),
      ),
      array(
        'name' => 'parameters',
        'optional' => TRUE,
        'type' => 'array',
        'description' => 'Parameters',
        'default value' => array(),
        'source' => array('param' => 'parameters'),
      ),
    ),
    'access arguments' => array('access user profiles'),
    'access arguments append' => FALSE,
  ),

注意第三个参数,参数。 你可以使用索引查询做各种有趣的事情,只要它打开,但你尝试过的是什么?参数[name] = user下面的例子

当我向http://test/api/user?parameters[name]=gdsfgsdfgsdfg&fields=name,uid提出请求时 我回来了

[
 {
  "name":"gdsfgsdfgsdfg",
  "uid":"36",
  "uri":"http:\/\/test\/api\/user\/36"
 }
]

注意我还添加了一些字段,uid和name。显然这些是可选的,但它向您展示了索引查询的强大功能。这同样适用于节点。

我希望这会有所帮助。 Fetcher

答案 1 :(得分:1)

尝试类似:

GET on http://mydomain.com/rest/user?parameters[name]=admin

这在Drupal7中对我有用。不确定它是否会相同6.但我也没有问题在http://mydomain.com/rest/user/上使用GET获取所有用户的索引

答案 2 :(得分:1)

我发现了这个问题。这是我所拥有的设置中的服务模块的错误/错误。

来自services.module档案

449  // Now implode that array into an actual WHERE clause.
450  $where = !empty($where) ? ' WHERE '. implode(' AND ', $where) : '';

451  // Run through db_rewrite_sql to make sure proper access checks are applied.
    // **** Error logged for this next line ****
452  $sql = "SELECT $fields FROM {$table} $where ORDER BY $order"; // <-- Error was logged for this line
453  $sql = db_rewrite_sql($sql);
454  $result = db_query_range($sql, $parameters, $page * 20, 20);
455  return $result;

错误

  Table '<REDACTED>_drup1.users' doesn't exist query: SELECT * FROM users ORDER BY created DESC LIMIT 0, 20 in /<REDACTED>/sites/all/modules/services/services.module on line 455.

我的安装中的用户表称为drup_users。当我将第452行更改为

452  $sql = "SELECT $fields FROM drup_{$table} $where ORDER BY $order";

有效。我有兴趣了解如何获得更持久的解决方案。我多次运行update.php并没有解决这个问题。