Drupal 7 — не удается отобразить конечные точки служб

Я нахожусь в конце своего остроумия, пытаясь понять, почему это не работает. Я пытаюсь настроить REST-сервер из моего экземпляра Drupal 7. В настоящее время основное внимание не уделяется аутентификации (я настрою ее, как только мне удастся заставить ее говорить).

Вот соответствующие биты кода:

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',
),

),
);
}

ресурсы / 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);
}

Я удалил определение этой службы, созданное в пользовательском интерфейсе, и вижу, что оно было успешно воссоздано из кода. Кроме того, при доступе к «api / mymodule / v1 /» я вижу сообщение «Конечная точка служб« mymodule_rest_api_v1 »успешно настроена . ‘, поэтому я знаю, что hook_default_services_endpoint и hook_ctools_plugin_api работают правильно.

Однако по какой-то причине я не могу получить ни один из путей, определенных в mymodule_services_resources, для распознавания как допустимых. Я удалил все ограничения доступа, очистил кэш несколько раз — всегда получаю 404, не найденный, когда я получаю любой URL, заканчивающийся «test» (например, https: // [мой-домен] / API / MyModule / v1 / тест а также https: // [мой-домен] / API / MyModule / v1 / тест / 1 оба выдают «Не найдено: не удалось найти тест ресурса».)

Любой совет будет принят во внимание.

3

Решение

Догадаться. Отпишитесь почему, если кто-нибудь еще столкнется с этим.

hook_services_resources объявляет ресурсы, предоставленные модулем. Что он НЕ делает, так это включает эти ресурсы. Вернувшись на вкладку ресурсов для моей конечной точки службы, я обнаружил, что «тест» был доступен в качестве нового ресурса, который можно открыть. Более того, он не был включен.

После его включения и экспорта в код я смог изменить содержимое 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);
}

Теперь я получаю ошибки аутентификации, которые я ожидал и могу исправить. Надеюсь, это кому-нибудь поможет.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]