Pourquoi cette API RESTful des services Drupal ne fonctionne-t-elle pas?

8

J'utilise le module Services sur Drupal 7. Je veux implémenter un service qui me permet de soumettre un terme de recherche via AJAX et de recevoir un tableau contenant les 5 premiers nœuds (nœud idet title) qui correspondent vaguement au titre. Lorsque je me connecte à http://example.com/api/ je reçois ce message

La «recherche» du point de terminaison des services a été configurée avec succès.

mais lorsque j'essaie de naviguer vers quelque chose comme http://example.com/api/search/Test , j'obtiens un 404.

rybosome
la source
1
Je suggère de vérifier RESTws , qui fera partie du noyau D8.
kqw
Pour les futurs lecteurs, envisagez d'utiliser les requêtes HTTP POST vs GET pour récupérer les données du point de terminaison. De nombreux points de terminaison de services nécessitent des requêtes POST.
David Thomas

Réponses:

1

Plus tard, essayez et essayez, lorsque lu à partir d'un autre tutoriel, je crée une ressource avec du repos, du savon pour moi est impossible dans drupal, j'essaie mais sans succès, vous pouvez copier et paginer ce code et modifier uniquement le nom du module personnalisé et les crochets.

/**
 * Implements hook_ctools_plugin_api().
 */
function core_custom_webservice_ctools_plugin_api($owner, $api) {
  if ($owner == 'services' && $api == 'services') {
    return array(
      'version' => 3,
      'file' => 'core_custom_webservice.services.inc'
    );
  }
}


function core_custom_webservice_services_resources() {
  $resources = array(
    'webservice_resources' => array(
      'operations' => array(
        'retrieve' => array(
          'help' => t('Response of webservice'),
          'file' => array('type' => 'inc', 'module' => 'core_custom_webservice', 'name' => 'core_custom_webservice.resource',),
          'callback' => '_core_custom_webservice_get_response',
          'access callback' => '_core_custom_webservice_access',
          'access arguments' => array('view'),
          'access arguments append' => TRUE,
          'args' => array(
            array(
              'name' => 'parameters',
              'type' => 'string',
              'description' => 'The parameters that define requested data',
              'source' => array('path' => '0'), // first argument in the url 
              'optional' => FALSE,
            ),
          ),
        ),
      ),
    ),
  );
  return $resources;
}

/* * *************************************************************************************************
 * Access callback 
 * For now only view/retrieve is implemented and if the user is logged in, he gets access
 */

function _core_custom_webservice_access($op) {
  global $user;
  $access = TRUE;

  switch ($op) {
    case 'view':
      if ($user->uid) {
        $access = TRUE;
      }
      break;
  }

  return $access;
}

function _core_custom_webservice_get_response($arg) {
  $response = 'something';
  return 'print '.$response;
}

réessayez dans votre chemin de service et réussissez avec http: //path.come/? q = webservice_server_rest / webservice_resources / string.json

Jonathan
la source
0

Si vous avez créé une ressource RESTful avec le module Services, je pense qu'elle s'attendra à répondre aux requêtes HTTP au format JSON, vous pouvez donc essayer de naviguer vers http://example.com/api/search/Test.json

TerryCB
la source
0

Essayez d'utiliser ce module https://www.drupal.org/project/services_views . Il a actuellement deux fonctionnalités: - Créer une ressource basée sur une vue créant des services d'affichage dans une vue - Exécuter n'importe quelle vue du système via un appel de ressource de vues

sourire
la source
0

essentiellement 404 est introuvable erreur

  1. Assurez-vous que votre point de terminaison de service est

    http://example.com/api/search/ {terme_recherche}

  2. quel est le corps de réponse à envoyer est dans le bon format

3. les en-têtes de contenu sont définis sur application / json et nomment Content-Type

DEVARAJ JOHNSON
la source
0

Salut La première chose que tu dois faire est

ÉTAPE 1: créer un module personnalisé et implémenter hook_services_resources()

EXEMPLE:

function mymodule_services_resources() {
  return array(
    'search' => array(
      'create' => array(
        'help' => 'Search for a content',
        'file' => array('file' => 'inc', 'module' => 'your module name'),
        'callback' => '_function_to_call_when_this_service_is_called',
        'access callback' => 'user_access',
        'access arguments' => array('access content'),
        'access arguments append' => FALSE,
        'args' => array(
         array(
           'name' => 'data',
           'type' => 'struct',
           'description' => 'The id of the data to get',
           'source' => 'data',
           'optional' => FALSE,
         ),
       ),
      ),
     ),
  );
}

ÉTAPE 2: allez à

Structure -> services

et activez votre module

ÉTAPE 3: envoi de données au client $ data - les données envoyées au client doivent être un tableau

  $url = $base_url.'/api/search';
            $response = drupal_http_request($url, array(
                'headers' => array('Content-Type' => 'application/json', 'Accept' => 'application/json'),
               'method' => 'POST',
               'data' => json_encode($data),
               'max_redirects' => 0,
               )
             );

imprimer la réponse pour vérifier si son fonctionnement fonctionne correctement.

LISTE DE CONTRÔLE:

  1. vérifier toute connexion en activant le module de journalisation DB appeler votre service.
  2. vérifier toute erreur de syntaxe, car ce fichier est appelé uniquement lorsque les services sont appelés jusque-là, vous ne verrez aucune erreur ou avertissement.
  3. imprimer la réponse et tester que les données passent correctement ou non.
  4. vérifier le côté client pour vérifier.
DEVARAJ JOHNSON
la source
0

J'obtenais également cette erreur, puis j'ai réalisé que je devais inclure à la fois le chemin de mon point de terminaison de service et le chemin de ma vue dans l'URL.

À l'origine, j'essayais http: //my.local/events mais je devais utiliser http: //my.local/events/events (j'avais nommé mon chemin de point de terminaison de service de la même manière que ma vue).

Eric Johnson
la source