webentwicklung-frage-antwort-db.com.de

Warum funktioniert mein benutzerdefinierter API-Endpunkt nicht?

Ich habe versucht, diesen Code in meine Plug-in-PHP-Dateien sowie in functions.php Einzuhalten. (Am Ende möchte ich, dass es in der PHP-Datei des Plug-Ins enthalten ist, aber ich bin mir noch nicht sicher, ob dies wahrscheinlich das Thema einer anderen Frage ist.)

Es ist eine sehr grundlegende Methode, ich versuche nur, eine Antwort mit einigen Inhalten zu bekommen.

In beiden Fällen erhalte ich eine 404-Antwort.

add_action( 'rest_api_init', function () {
  register_rest_route( plugin_dir_url(__DIR__).'my-project/api/v1/form', '/action', array(
    'methods' => 'GET, POST',
    'callback' => 'api_method',
  ) );
});

function api_method($data) {
    var_dump($data);
    return 'API method end.';
}

Und ich habe versucht, auf URLs zuzugreifen (in Brower oder mit AJAX)

Ich vermisse wohl etwas.

4
TTT

Beginnen Sie vielleicht mit nur GET. Ihre Route sieht auch komisch aus. Versuchen Sie einfach:

register_rest_route('my-project/v1', '/action/', [
  'methods'  => WP_REST_Server::READABLE,
  'callback' => 'api_method',
]);

Und Ihr Rückruf gibt keine gültige Antwort zurück. Lassen Sie Ihren Rückruf eher so aussehen:

$data = [ 'foo' => 'bar' ];

$response = new WP_REST_Response($data, 200);

// Set headers.
$response->set_headers([ 'Cache-Control' => 'must-revalidate, no-cache, no-store, private' ]);

return $response;

Schließlich müssen Sie wp-json, der Namespace my-project/v1 und Ihre Route action zu der URL können Sie jetzt überprüfen, was Sie erhalten:

 Https: //my-domain.local/wp-json/my-project/v1/action 
3
leymannx

Hier ist dein Problem:

register_rest_route( plugin_dir_url(__DIR__).'my-project/api/v1/form', '/action', array(

Speziell die Idee, dass dies möglich ist:

http://my-domain.local/wp-content/plugins/my-project/api/v1/form

Dies ist äußerst ungewöhnlich und widerspricht den Angaben in den Dokumenten, im Handbuch und in den Tutorials.

REST-API-Endpunkte befinden sich in der REST-API, die sich in der von rest_url() zurückgegebenen URL befindet. Sie befinden sich in yoursite.com/wp-json. Ein Endpunkt ist kein vollständiger URL-Pfad oder ein unabhängiger API von der Haupt-API getrennt.

Stattdessen müssen Sie Ihre Endpunktnamen in Form von Namespaces und Endpunkten definieren und die richtige URL aufrufen, wie in den Erkennungsmechanismen der API REST API) beschrieben.

Wenn wir dies verwenden:

register_rest_route( plugin_dir_url(__DIR__).'my-project/api/v1/form', '/action', array(

Dann würden wir folgendes erwarten:

example.com/wp-json/wp-content/plugins/my-project/api/v1/form/action

Diese URL ist ziemlich lang und weist eine Reihe von Problemen auf:

  • Der erste Parameter ist ein Namespace, keine URL
  • es ist nicht möglich, v1 der API korrekt von v2 zu trennen, da diese /form- Komponente in den ersten Parameter und nicht in den zweiten Parameter eingefügt wurde. Der erste Parameter ist ein Namespace, der zweite eine Route
  • /action ist /action, es wird nicht gegen GET OR POST ausgetauscht)

Es gibt auch Probleme mit der Rückruffunktion:

function api_method($data) {
    var_dump($data);

Ein Endpunkt muss seine Daten zurückgeben, er kann sie nicht direkt wie var_dump ausgeben, andernfalls sind die zurückgegebenen Daten ungültiger JSON.

Schließlich ist der Methodenparameter falsch:

'methods' => 'GET, POST',

methods nimmt keine durch Kommas getrennte Liste an, auch keine Dokumente schlagen dies vor. Verwenden Sie stattdessen die vordefinierten Werte, die von der API REST API) bereitgestellt werden, z. B. WP_REST_Server::READABLE oder WP_REST_Server::ALLMETHODS. Diese werden alle im Handbuch und in der offiziellen Dokumentation zu register_rest_route erwähnt.

Ein besserer Weg zur Registrierung wäre:

    register_rest_route( 'my-project/form/v1', '/action', array(

Geben uns:

example.com/wp-json/my-project/form/v1/action

Beachten Sie, wie ich die Plugin-URL und das redundante /api- Fragment entfernt habe (es ist offensichtlich, dass es sich bereits um eine API handelt).

3
Tom J Nowell