3

これが機能しない理由を解読しようとして、私は機知に富んでいます。Drupal 7 インスタンスから REST サーバーをセットアップしようとしています。現在、認証不要に焦点を当てています (うまく話せたら設定します)。

関連するコードビットは次のとおりです。

mymodule.module

/**
 * Implements hook_ctools_plugin_api().
 * Declares the mymodule services endpoint (stored in
 * mymodule.services.inc).  Note that the referenced ctools
 * hook obviates creating this endpoint through the UI.
 */
function mymodule_ctools_plugin_api($owner, $api) {
  if ($owner == 'services' && $api == 'services') {
    return array(
      'version' => 3,
      'file' => 'mymodule.services.inc',
      'path' => drupal_get_path('module', 'mymodule'),
    );
  }
}
/**
 * Implements hook_services_resources
 * Defines the resources available via services module (REST, in this case).
 *
 * @return array The definition array
 */
function mymodule_services_resources() {
  watchdog('mymodule', __FUNCTION__, array(), WATCHDOG_NOTICE, 'link');
    return array(
      '#api_version' => 3001,
      'test' => array(
        'retrieve' => array(
          'help' => t("A test of the REST api"),
          'file' => array(
            'type' => 'inc',
            'module' => 'mymodule',
            'name' => 'resources/test_resource',
          ),
          'access arguments'=>array('access content'),
          'callback' => 'mymodule_services_test',
          'args' => array(
            array(
              'name' => 'id',
              'type' => 'int',
              'description' => t("a test of rest arguments"),
              'source' => array('path' => '0'),
              'optional' => FALSE,
            ),
          ),
        ),
        'index' => array(
          'help' => t('A test of the REST api index functionality'),
          'file' => array(
            'type' => 'inc',
            'module' => 'mymodule',
            'name' => 'resources/test_resource',
          ),
          'callback' => 'mymodule_services_test',
        ),

      ),
    );
}

resources/test_resources.inc

/**
 *
 */
function mymodule_services_test() {
  watchdog('mymodule', __FUNCTION__, array(), WATCHDOG_NOTICE, 'link');
  $result = array('foo' => 'bar');
  drupal_json_output($result);
}
/**
 * Access callback for test services (currently unused)
 * @param  string $op   The operation being performed: creat
 * @param  [type] $args [description]
 * @return [type]       [description]
 */
function mymodule_services_test_access($op, $args) {
  watchdog('mymodule', __FUNCTION__, array(), WATCHDOG_NOTICE, 'link');
  return TRUE;
}

mymodule.services.inc

/**
 * @file
 */

/**
 * Implements hook_default_services_endpoint().
 */
function mymodule_default_services_endpoint() {
  watchdog('mymodule', __FUNCTION__, array(), WATCHDOG_NOTICE, 'link');
  $endpoint = new stdClass();
  $endpoint->disabled = FALSE;  //Edit this to true to make a default endpoint disabled initially
  $endpoint->api_version = 3;
  $endpoint->name = 'mymodule_rest_api_v1';
  $endpoint->server = 'rest_server';
  $endpoint->path = 'api/mymodule/v1';
  $endpoint->authentication = array();
  $endpoint->server_settings = array(
    'formatters' => array(
      'json' => TRUE,
      'bencode' => FALSE,
      'jsonp' => FALSE,
      'php' => FALSE,
      'xml' => FALSE,
    ),
    'parsers' => array(
      'application/json' => TRUE,
      'text/xml' => TRUE,
      'application/vnd.php.serialized' => FALSE,
      'application/x-www-form-urlencoded' => FALSE,
      'application/xml' => FALSE,
      'multipart/form-data' => FALSE,
    ),
  );
  $endpoint->resources = array();
  $endpoint->debug = 0;
  return array('mymodule'=>$endpoint);
}

このサービスの UI ビルド定義を削除し、コードから正常に再作成されたことを確認できます。さらに、「api/mymodule/v1/」にアクセスすると、「サービス エンドポイント "mymodule_rest_api_v1" が正常にセットアップされました」というメッセージが表示されます。 .' であるため、hook_default_services_endpoint と hook_ctools_plugin_api が正しく機能していることがわかります。

ただし、何らかの理由で、mymodule_services_resources で定義されたパスを有効として認識することができません。すべてのアクセス制限を削除し、キャッシュを複数回クリアしました。常に、「test」で終わる URL にアクセスすると、404 not found になります (例: https://[my-domain]/api/mymodule /v1/testhttps://[my-domain]/api/mymodule/v1/test/1はどちらも「見つかりません: リソース テストが見つかりませんでした。」) を生成します。

アドバイスをいただければ幸いです。

4

1 に答える 1

5

理解した。他の誰かがこれに出くわした場合に備えて、理由を投稿してください。

hook_services_resources は、モジュールによって提供されるリソースを宣言します。それがしないことは、それらのリソースを有効にすることです。サービス エンドポイントの [リソース] タブに戻ると、公開可能な新しいリソースとして "test" が利用可能であることがわかりました。さらに言えば、有効化されていませんでした。

有効にしてコードにエクスポートした後、mymodule_default_services_endpoint の内容を次のように変更できました。

function mymodule_default_services_endpoint() {
  watchdog('mymodule', __FUNCTION__, array(), WATCHDOG_NOTICE, 'link');
  $endpoint = new stdClass();
  $endpoint->disabled = FALSE; /* Edit this to true to make a default endpoint disabled initially */
  $endpoint->api_version = 3;
  $endpoint->name = 'mymodule_rest_api_v1';
  $endpoint->server = 'rest_server';
  $endpoint->path = 'api/mymodule/v1';
  $endpoint->authentication = array(
    'services' => 'services',
  );
  $endpoint->server_settings = array(
    'formatters' => array(
      'json' => TRUE,
      'bencode' => FALSE,
      'jsonp' => FALSE,
      'php' => FALSE,
      'xml' => FALSE,
    ),
    'parsers' => array(
      'application/json' => TRUE,
      'text/xml' => TRUE,
      'application/vnd.php.serialized' => FALSE,
      'application/x-www-form-urlencoded' => FALSE,
      'application/xml' => FALSE,
      'multipart/form-data' => FALSE,
    ),
  );
  $endpoint->resources = array(
    'test' => array(
      'operations' => array(
        'retrieve' => array(
          'enabled' => '1',
        ),
        'index' => array(
          'enabled' => '1',
        ),
      ),
    ),
  );
  $endpoint->debug = 0;
  return array('mymodule' => $endpoint);
}

今、認証エラーが発生していますが、これは予想通りであり、対処できます。これが誰かに役立つことを願っています。

于 2015-11-04T21:43:35.733 に答える