【问题标题】:How can I retrieve a user using a query string from drupal using REST?如何使用 REST 使用来自 drupal 的查询字符串检索用户?
【发布时间】:2011-06-21 17:47:31
【问题描述】:

我想要什么

我希望能够在不发送电子邮件的情况下重置用户密码。我还需要通过 REST 执行此操作(用于信息亭系统)。

所以我需要:

  1. 获取具有特定用户名的用户
  2. 重置该用户的密码

尽我所能,我无法使用用户名获取用户。

问题

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

GET on @987654321@

根据 REST 文档,这应该会获取名称为 user 的用户。

我收到 200 响应,但正文中没有返回任何内容

我的尝试

从 ID 获取节点

以管理员身份登录后,我可以:

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

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

不同的 GETs

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 上的 GET 有效,但 http://mydomain.com/rest/node?nid=1 给了我一个 200 响应,正文中没有任何内容。

所有用户列表

GET on @987654323@ 也不显示所有用户的列表。我又得到了一个 200 的空身体。

更多详情

  • 我正在使用 Drupal 6.22 安装。
  • 我已经安装了服务模块 (3.0 RC1) 和 REST Server (2.0 beta 1)。
  • 我已经安装了会话身份验证模块。
  • 我已经在会话身份验证开启和关闭的情况下尝试了上述方法。
  • 我已经为我设置的 REST 端点启用了所有节点资源和用户资源。
  • 我已经尝试过上面有和没有干净 URL 的方法,但似乎没有任何区别。

问题

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

更新

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

更新 2

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

【问题讨论】:

    标签: web-services drupal drupal-6 httpwebrequest


    【解决方案1】:

    对不起,这让你很沮丧。我是服务模块的维护者,并且确实在编写文档,但我想我会在这里回答以帮助您继续前进。

    你没有得到任何你想要的数据的原因是你传递的参数是错误的。

    如果你看 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,
      ),
    

    注意第三个参数,参数。 只要打开索引查询,您就可以做各种有趣的事情,但您没有尝试过的是 ?parameters[name]=user 下面的示例

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

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

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

    我希望这会有所帮助。

    【讨论】:

    • 哇,凯尔。感谢您提供出色的示例和详细的答案。不过,这一切都不是它对我不起作用的原因。这是因为在查询用户时,服务模块查看了错误的表名并抛出了一个错误——我忽略了它,就像一个 plonker。一旦我更改了服务代码,它就像做梦一样工作。看我的回答。
    【解决方案2】:

    尝试类似:

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

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

    【讨论】:

    • 不。它给了我完全相同的东西 - 一个空白正文的 200 响应。 :(
    • @John Gallagher -- 您是否按照drupal.org/node/783722端点设置 部分所述为用户资源启用了所有CRUD+Index 功能?我知道在 Drupal 7 中,我可以选择只提供检索服务而不提供索引服务。
    • @John Gallagher -- 获取用户列表似乎很简单,所以如果这不起作用,也许您可​​以发布一些客户端代码,看看其他人是否有任何想法?
    • 我还没有把它放到客户端代码中——我只是在 Chrome 中使用 REST 控制台测试它——chrome.google.com/webstore/detail/…——以生成我的请求并检查我的响应。我不能让它变得更简单 - 我的问题中没有我没有得到的测试请求的额外细节。
    • 尽管如此,这个问题显然需要更多细节,所以我将在明天添加一个更新,详细说明这次交流。感谢您迄今为止的所有帮助!
    【解决方案3】:

    我发现了问题。这是我设置的服务模块的错误/错误。

    来自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 并没有解决这个问题。

    【讨论】:

    • 谢谢凯尔。您认为我应该下载 cmets 中的最新补丁,还是等到模块本身更新?我正在处理一个将在未来几周内投入生产的网站。
    • 我会把补丁放在sites/all/patches(或类似的东西)中并应用它直到更新出来,但它应该在更新出来之前修复。
    猜你喜欢
    • 1970-01-01
    • 2020-10-13
    • 1970-01-01
    • 2022-11-10
    • 1970-01-01
    • 2011-01-04
    • 2010-11-13
    • 2017-11-30
    • 2011-01-11
    相关资源
    最近更新 更多