Perché questa API RESTful dei servizi Drupal non funziona?


8

Sto usando il modulo Servizi su Drupal 7. Voglio implementare un servizio che mi consenta di inviare un termine di ricerca tramite AJAX e di ricevere un array contenente i primi 5 nodi (nodo ide title) che corrispondono liberamente al titolo. Quando mi connetto a http://example.com/api/ Ricevo questo messaggio

La "ricerca" dell'endpoint servizi è stata impostata correttamente.

ma quando provo a navigare verso qualcosa come http://example.com/api/search/Test , ottengo un 404.


1
Suggerisco di dare un'occhiata a RESTws , che farà parte del core D8.
kqw,

Per i lettori futuri, prendere in considerazione l'utilizzo delle richieste HTTP POST vs GET per recuperare i dati dall'endpoint. Molti endpoint di servizi richiedono richieste POST.
David Thomas,

Risposte:


1

Più tardi prova e, quando letto da altri tutorial, creo una risorsa con il resto, il sapone per me è impossibile in drupal, provo ma senza successo, puoi copiare e pagina questo codice e modificare solo il nome del modulo personalizzato e gli hook.

/**
 * 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;
}

riprovare nel percorso di servizio e successo con http: //path.come/? q = webservice_server_rest / webservice_resources / string.json


0

Se hai creato una risorsa RESTful con il modulo Servizi, credo che si aspetterà di rispondere alle richieste HTTP in formato JSON, quindi potresti provare a navigare verso http://example.com/api/search/Test.json


0

Prova a utilizzare questo modulo https://www.drupal.org/project/services_views . Attualmente ha due funzionalità: - Creazione di una risorsa basata sulla vista che crea la visualizzazione dei servizi in una vista - Esecuzione di qualsiasi vista del sistema tramite la chiamata della risorsa viste


0

fondamentalmente 404 non viene trovato un errore

  1. Assicurarsi che l'endpoint del servizio sia

    http://example.com/api/search/ {search-term}

  2. qual è il corpo della risposta da inviare è nel formato corretto

3.le intestazioni del contenuto sono impostate su application / json e denominano Content-Type


0

Ciao La prima cosa che devi fare è

PASSAGGIO 1: creare un modulo personalizzato e implementare hook_services_resources()

ESEMPIO:

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,
         ),
       ),
      ),
     ),
  );
}

PASSAGGIO 2: vai a

Struttura -> servizi

e abilita il tuo modulo

PASSAGGIO 3: invio dei dati al client $ data - i dati inviati al client dovrebbero essere array

  $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,
               )
             );

stampare la risposta per verificare se funziona correttamente.

ELENCO DI CONTROLLO:

  1. verificare l'eventuale accesso abilitando il modulo di registrazione DB chiamare il servizio.
  2. controlla eventuali errori di sintassi perché quel file viene chiamato solo quando i servizi vengono chiamati fino ad allora non vedrai alcun errore o avviso.
  3. stampa la risposta e verifica che i dati vengano trasmessi correttamente o meno.
  4. controllare l'estremità del client per verificare.

0

Stavo ricevendo anche questo errore e poi mi sono reso conto che dovevo includere sia il percorso del mio endpoint del servizio che il percorso della mia vista nell'URL.

Inizialmente stavo provando http: //my.local/events ma dovevo utilizzare http: //my.local/events/events (il percorso del mio endpoint del servizio era stato identico alla mia vista).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.