Warum funktioniert diese RESTful-API für Drupal-Dienste nicht?

8

Ich verwende das Dienstemodul auf Drupal 7. Ich möchte einen Dienst implementieren, mit dem ich einen Suchbegriff über AJAX senden und ein Array erhalten kann, das die fünf wichtigsten Knoten (Knoten idund title) enthält, die lose mit dem Titel übereinstimmen. Beim Herstellen einer Verbindung zu http://example.com/api/ erhalte ich diese Nachricht

Services Endpoint "Suche" wurde erfolgreich eingerichtet.

Wenn ich jedoch versuche, zu etwas wie http://example.com/api/search/Test zu navigieren , erhalte ich eine 404.

Rybosom
quelle
1
Ich schlage vor, RESTws zu testen , die Teil des D8-Kerns sein werden.
kqw
Erwägen Sie für zukünftige Leser die Verwendung von HTTP POST vs GET-Anforderungen, um Daten vom Endpunkt abzurufen. Viele Service-Endpunkte erfordern POST-Anforderungen.
David Thomas

Antworten:

1

Später von Versuch und Versuch, wenn ich aus einem anderen Tutorial lese, mache ich eine Ressource mit Ruhe, Seife ist für mich in Drupal unmöglich, ich versuche, aber ohne Erfolg können Sie diesen Code kopieren und paginieren und nur den benutzerdefinierten Modulnamen und die Hooks ändern.

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

Versuchen Sie es erneut in Ihrem Servicepfad und Erfolg mit http: //path.come/? q = webservice_server_rest / webservice_resources / string.json

Jonathan
quelle
0

Wenn Sie mit dem Modul "Dienste" eine RESTful-Ressource erstellt haben, wird diese voraussichtlich auf HTTP-Anforderungen im JSON-Format antworten. Sie können daher versuchen, zu zu navigieren http://example.com/api/search/Test.json

TerryCB
quelle
0

Versuchen Sie, dieses Modul https://www.drupal.org/project/services_views zu verwenden . Derzeit stehen zwei Funktionen zur Verfügung: - Erstellen einer ansichtsbasierten Ressource Erstellen einer Services-Anzeige in einer Ansicht - Ausführen einer beliebigen Ansicht des Systems über den Aufruf eines Ressourcenansichts

Lächeln
quelle
0

Grundsätzlich wird 404 Fehler nicht gefunden

  1. Stellen Sie sicher, dass Ihr Service-Endpunkt ist

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

  2. Der zu sendende Antworttext ist im richtigen Format

3. Die Inhaltsheader sind auf application / json gesetzt und heißen Content-Type

DEVARAJ JOHNSON
quelle
0

Hallo, als erstes musst du tun

SCHRITT 1: Erstellen Sie ein benutzerdefiniertes Modul und implementieren Sie es hook_services_resources()

BEISPIEL:

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

SCHRITT 2: Gehen Sie zu

Struktur -> Dienstleistungen

und aktivieren Sie Ihr Modul

SCHRITT 3: Senden von Daten an den Client $ data - Daten, die an den Client gesendet werden, sollten Array sein

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

Drucken Sie die Antwort aus, um zu überprüfen, ob sie ordnungsgemäß funktioniert.

CHECKLISTE:

  1. Suchen Sie nach Anmeldungen, indem Sie das DB-Protokollierungsmodul aktivieren. Rufen Sie Ihren Dienst auf.
  2. Überprüfen Sie, ob Syntaxfehler vorliegen, da diese Datei nur aufgerufen wird, wenn Dienste aufgerufen werden. Bis dahin werden keine Fehler oder Warnungen angezeigt.
  3. Drucken Sie die Antwort aus und testen Sie, ob die Daten korrekt übergeben wurden oder nicht.
  4. Überprüfen Sie das Client-Ende, um zu überprüfen.
DEVARAJ JOHNSON
quelle
0

Ich habe auch diesen Fehler erhalten und dann festgestellt, dass ich sowohl den Pfad meines Service-Endpunkts als auch den Pfad meiner Ansicht in die URL aufnehmen muss.

Ursprünglich habe ich http: //my.local/events ausprobiert, aber ich musste http: //my.local/events/events verwenden (ich hatte meinen Service-Endpunktpfad genauso benannt wie meine Ansicht).

Eric Johnson
quelle