Php 通过外部HTTP请求标记Drupal中的内容

Php 通过外部HTTP请求标记Drupal中的内容,php,drupal,drupal-7,drupal-modules,Php,Drupal,Drupal 7,Drupal Modules,我正在编写一个iOS应用程序,它显示Drupal管理的网站的内容。我想知道如何在Drupal中创建视图,以便将内容作为JSON交付到应用程序。但现在我想让我的登录用户能够将内容标记为他们的收藏夹。用户可以在网站上创建帐户,也可以在应用程序内部登录。收藏夹按用户存储 在Drupal中,这是使用实现的,它呈现用于在网站上切换标志的相应链接。这些链接指向一个特定的URL,该URL还包含一个令牌以防止欺骗。不使用令牌调用URL会导致访问拒绝 现在不幸的是,我无法在我的应用程序中生成这些令牌。有没有一种方

我正在编写一个iOS应用程序,它显示Drupal管理的网站的内容。我想知道如何在Drupal中创建视图,以便将内容作为JSON交付到应用程序。但现在我想让我的登录用户能够将内容标记为他们的收藏夹。用户可以在网站上创建帐户,也可以在应用程序内部登录。收藏夹按用户存储

在Drupal中,这是使用实现的,它呈现用于在网站上切换标志的相应链接。这些链接指向一个特定的URL,该URL还包含一个令牌以防止欺骗。不使用令牌调用URL会导致访问拒绝

现在不幸的是,我无法在我的应用程序中生成这些令牌。有没有一种方法可以在不使用网站的情况下标记内容


我是Drupal的新手。我所需要的基本上是一个关于如何实现我自己的HTTP API的提示,允许外部程序操作内容。

事实证明,我必须编写我自己的模块来提供菜单回调条目。我的
收藏夹\u api.module
文件如下所示:

/**
 * Implements hook_menu().
 */
function favorites_api_menu() {
    $items['node/%/favorite/%'] = array(
        'title' => 'Mark as favorite',
        'page callback' => 'favorites_api_toggle_favorite',
        'page arguments' => array(1, 3),
        'access callback' => 'user_access',
        'access arguments' => array('access content'),
        'type' => MENU_CALLBACK,
    );

    return $items;
}

/**
 * Callback for above menu entry
 */
function favorites_api_toggle_favorite($entity_id, $action) {
    $favorites_flag = flag_get_flag('favorites') or die('no "favorites" flag defined');
    $favorites_flag->flag($action, $entity_id);

    // error handling and return message
    // ...
}
现在我可以调用
http://myurl/node/3/favorite/flag
将节点3标记为收藏夹和
http://myurl/node/3/favorite/unflag
取消标记

必须编写菜单项来创建自定义URL操作有点误导,尽管…

下载并启用“会话api”模块()

正如在“标志访问”部分中创建/编辑标志模块时所述:

如果会话API模块为空,则匿名用户可以标记内容 安装

每个匿名用户将拥有相同的令牌(“flag.module”文件中的第2358行):

如果您可以获得实体/节点id(私钥可以在Drupal配置中固定和设置),那么您可以在应用程序中构建此令牌


编辑:您必须在权限列表中为匿名用户的标志名添加权限。列出

谢谢你的回答。不幸的是,收藏夹标志不是全局性的,这意味着收藏夹是按用户存储的。因此,用户必须登录才能将内容标记为收藏夹。登录用户的令牌是使用会话ID构建的。此外,我认为在应用程序中存储页面的私钥不是一个好主意,原因很明显。是的,我同意私钥存储,但不太安全。。。此外,您自己的答案中的代码是否有效?我的意思是你必须登录才能正常工作。您在问题中没有提到您可以在Drupal站点上登录应用程序用户。我认为如果你能在你的回答中(或在你的问题中)解释你能够登录你的用户以及如何登录,这将是一件好事。谢谢,很公平。我在问题中补充了这个事实。我在回答中描述的方法很有效。但我不认为它很优雅。你知道更好的方法吗?
md5(drupal_get_private_key() . $entity_id)