it-swarm.com.de

Wie ich einen optionalen Parameter in REST API URL) hinzufügen kann

Wie ich einen optionalen Parameter in drupal 8 REST API URL) hinzufügen kann

"canonical" = "/content/get/{id}"

Aber ich muss hier einen Wert für id hinzufügen, wie ich dieses id optional machen kann

6
Unnikrishnan

Ich habe das gleiche Problem festgestellt und es gelöst, indem ich die aktuelle Anforderung aus dem Anforderungsstapel zu meiner Ressource hinzugefügt habe:

RestBase.php

<?php

namespace Drupal\api\Plugin\rest;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Psr\Log\LoggerInterface;
use Drupal\Core\Session\AccountProxyInterface;
use Drupal\rest\Plugin\ResourceBase;
use Drupal\rest\ResourceResponse;

class RestBase extends ResourceBase {

  /**
   *
   * @var \Drupal\Core\Session\AccountProxyInterface
   */
  protected $currentUser;
  /**
   *
   * @var \Symfony\Component\HttpFoundation\Request
   */
  protected $currentRequest;

  /**
   * 
   * @param array $configuration
   * @param type $pluginId
   * @param type $pluginDefinition
   * @param array $serializerFormats
   * @param \Drupal\api\Plugin\rest\resource\LoggerInterface $logger
   * @param \Drupal\api\Plugin\rest\resource\AccountProxyInterface $currentUser
   */
  public function __construct(array $configuration, $pluginId, $pluginDefinition, array $serializerFormats, LoggerInterface $logger, AccountProxyInterface $currentUser, Request $currentRequest) {
    parent::__construct($configuration, $pluginId, $pluginDefinition, $serializerFormats, $logger);

    $this->currentUser = $currentUser;
    $this->currentRequest = $currentRequest;
  }

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container, array $configuration, $pluginId, $pluginDefinition) {
    return new static(
        $configuration, 
        $pluginId, 
        $pluginDefinition, 
        $container->getParameter('serializer.formats'), 
        $container->get('logger.factory')->get('rest'), 
        $container->get('current_user'),
        $container->get('request_stack')->getCurrentRequest()
    );
  }

  /**
   * 
   * @param array $message
   * @param integer $cache
   * @return ResourceResponse
   */
  protected function getResponse($message, $cache = 0) {
    $build = [
      '#cache' => [
        'max-age' => $cache,
      ]
    ];

    $response = new ResourceResponse($message);
    $response->addCacheableDependency($build);

    return $response;
  }

}

TestResource.php (die tatsächliche REST resouce)

<?php

namespace Drupal\api\Plugin\rest\resource;

use Drupal\rest\ResourceResponse;
use Drupal\api\Plugin\rest\RestBase;

/**
 * Test resource.
 * 
 * @RestResource(
 *   id = "test_resource",
 *   label = @Translation("Test API Resource"),
 *   uri_paths = {
 *     "canonical" = "/api/test-resource"
 *   }
 * )
 */
class TestResource extends RestBase {

  /**
   * 
   * @return ResourceResponse
   */
  public function get() {
    if (!$this->currentUser->hasPermission('use ' . $this->pluginId . ' service')) {
      throw new AccessDeniedHttpException('Access denied.');
    }

    $id = $this->currentRequest->get('id');

    $message = [
      'message' => 'Hello, you called service: ' . $this->pluginId,
      'id' => $id,
    ];

    return parent::getResponse($message);
  }

}

In meiner eigenen Basisklasse RestBase habe ich die aktuelle Anforderung aus dem Anforderungsstapel (neben der Berechtigung AccountProxy für Berechtigungszwecke) hinzugefügt, indem ich die Methode create der ResourceBase überschrieben habe ] Klasse. Sie können dann auf Abfrageparameter in Ihrer Ressource REST) zugreifen, indem Sie die Methode get($key) für das Anforderungsobjekt aufrufen.

Sie müssen Ihre Parameter in der API-URI wie folgt übergeben: http://localhost/api/test-resource?_format=<your-format>&<parameter1>=<value1>. In Anbetracht dieses Beispiel-API-URI würden Sie über $value1 = $this->currentRequest->get('parameter1') auf parameter1 Zugreifen.

Ich denke, dass es im Moment nicht möglich ist, Schnecken in Ihren Ressourcen zu haben. Wenn jemand weiß wie, bitte sag es :).

2
mvdgun

In Ihrer Datei your_module.routing.yml in Ihrer Routenkonfiguration

defaults:
  id: 'default-id'

weitere Informationen finden Sie unter hier unter Optionale Parameter

Wenn Sie versuchen, eine vorhandene Route zu ändern, sollten Sie RouteSubscriber verwenden

Oder wenn Sie auf /content/get/ Etwas anderes anzeigen müssen, sollten Sie eine zusätzliche Route ohne {id} Erstellen.

1
Trupal

Auf dieser Seite finden Sie einige Lösungen, die erklären, wie es geht. Eine andere Frage ist, ob du es tun sollst :)

Von Drupal.org gibt RestResource-Plugins heraus: Verwenden Sie die Methode get () mit optionalem Parameter (oder ohne Parameter), um die Listenunterstützung zu signalisieren? :

Ein Konzept zu den Unterschieden zwischen Sammlungen und Gegenständen:

Eine "Sammlungsressource" unterstützt wahrscheinlich POST und GET. Eine "Ressource für einzelne Elemente" unterstützt wahrscheinlich GET, PUT, PATCH und DELETE.

Ein weiterer Gedanke zum allgemeinen Bereich:

Zumindest denke ich, dass optionale Parameter ein Fehler sind. Ich denke, auf der REST -Domänenebene gibt es keine Vorstellung von optionalen Parametern. Es gibt eine Sammlungsressource und eine einzelne Objektressource.

Und über die Verwendung von Ansichten:

Das Modul REST hat im Grunde keine Zeit/Gedanken darüber aufgewendet, wie mit Sammlungen umgegangen werden soll. AFAICT hat dies vollständig auf Views verschoben.

Zusammenfassend: Es scheint die Standardidee zu sein, dass Sie Ansichten für Sammlungen verwenden oder 2 Ressourcen schreiben können - eine für die Sammlung und eine für das Element .

0
greggles

Für eine benutzerdefinierte REST - Ressource, die nur GET unterstützt, wobei ein optionaler Pfadparameter zum Filtern verwendet werden kann, können Sie einen Standard für einen Parameter in der route () -Methode hinzufügen und ihn daher optional machen.

Zum Beispiel hat dies die wesentlichen Bits:

/**
 * Provides a resource for groups that may have inventory.
 *
 * @RestResource(
 *   id = "owning_groups",
 *   label = @Translation("All Groups That May Own Inventory (optionally limited to one space)"),
 *   uri_paths = {
 *     "canonical" = "/rest/owning_groups/{nid}",
 *   }
 * )
 */
class OwningGroupsRestResource extends ResourceBase {

  /**
   * Responds to a GET request.
   *
   * @param int $nid
   *   Space node ID.
   *
   * @return \Drupal\rest\ResourceResponse
   *   Rest Response with all group nid/titles.
   *
   * @throws \Exception
   */
  public function get($nid): ResourceResponse {
    $space_node = NULL;
    if ($nid) {
      /** @var \Drupal\node\NodeInterface $space_node */
      $space_node = $this->entityTypeManager->getStorage('node')->load($nid);
      if (!$space_node || $space_node->bundle() !== 'space') {
        throw new NotFoundHttpException('No such space');
      }
    }
...

   return $response;
 }

  /**
   * {@inheritdoc}
   */
  public function routes() {
    $collection = parent::routes();
    // Add defaults for optional parameters.
    $defaults = [
      'nid' => 0,
    ];
    foreach ($collection->all() as $route) {
      $route->addDefaults($defaults);
    }
    return $collection;
  }

}

siehe auch: Wie ich einen optionalen Parameter in REST API URL hinzufügen kann

0
pwolanin