Custom REST API Endpoint Öffentlich machen

Hallo,

gibt es die Möglichkeit den selbst erstellten API Endpoint öffentlich zu machen? Also das keine Authentifizurung von nöten ist bei einem POST Request? 

würde ich auch gerne wissen.

Und ich habe eine weitere Frage:

ich habe einen custom enpoint unter my-shop.de/api/order/.

Wie bekomme ich den auf my-shop.de/api/one/two/order/ ?

@Rocks360 schrieb:

Hallo,

gibt es die Möglichkeit den selbst erstellten API Endpoint öffentlich zu machen? Also das keine Authentifizurung von nöten ist bei einem POST Request? 

Klar. Du kannst dir ein Plugin schreiben, dass die Authentifizierung an entsprechender Stelle unterbindet.

 ich habe einen custom enpoint unter my-shop.de/api/order/.

Was ist daran custom?

Wie bekomme ich den auf my-shop.de/api/one/two/order/ ?

Du müsstest wohl den Router umschreiben.

Edit:

Vielleicht klappt es auch über einen Eintrag in der s_rewrite_urls

Hallo,

die Authentifizierung kann doch recht einfach deaktiviert werden.

@Rocks360: Aber bist Du Dir sicher, dass einfach jeder ohne Authentifizierung bei Dir Daten hinzufügen können soll und Du weisst was Du tust?!

Also API Abfragen via GET Method öffentlich zugänglich machen kann ich ja noch nachvollziehen…

Um die Digest Auth Authentifizierung für bestimmte API Controller/Methods zu unterbinden, schreib ein Plugin und subscribe Dich auf folgendes Event:

$this->subscribeEvent(
            ‘Enlight_Controller_Front_DispatchLoopStartup’,
            ‘onStartDispatch’
        );

Hier dann der zugehörige Event Handler für z.B. den API Articles Controller bzgl. GET Requests:

public function onStartDispatch(\Enlight_Event_EventArgs $args)
{

    if ($args->getSubject()->Request()->getModuleName() == “api” &&
        $args->getSubject()->Request()->getControllerName() == “articles” &&
        $args->getSubject()->Request()->getMethodName() == “GET”) {

        $initAuth = Shopware()->Events()->getListeners(‘Enlight_Bootstrap_InitResource_Auth’);
        $frontPreDispatch = Shopware()->Events()->getListeners(‘Enlight_Controller_Front_PreDispatch’);
        $listeners = array_merge($initAuth, $frontPreDispatch);
        foreach ($listeners as $listener) {
            if ($listener instanceof \Enlight_Event_Handler_Plugin) {
                if ($listener->Plugin()->getName() == “RestApi”) Shopware()->Events()->removeListener($listener);
            }

        }

        $rawBody = $args->getSubject()->Request()->getRawBody();

        try {
            if ($rawBody != ‘’) {
                $input = Zend_Json::decode($rawBody);
            } else {
                $input = null;
            }
        } catch (Zend_Json_Exception $e) {
            $args->getSubject()->Response()->setHttpResponseCode(400);
            $args->getSubject()->Request()->setControllerName(‘error’);
            $args->getSubject()->Request()->setActionName(‘invalid’);

            return;
        }

        if ($input !== null) {
            $args->getSubject()->Request()->replacePost($input);
        }

    }

}

Hey, danke für deine Antwort. Ja icc weiß was ich tuhe :smiley: ;). Der hintergrund war, dass wir mehrere Newsletter Subscribe Formulare auf verschieden Webseiten haben und wir gerne das Newsletter System von Shopware nutzen wollten. Ich habe jedoch ein java microservice geschrieben der die Requests von den Seiten annimmt und dann mit basic auth an shopware weiterleitet. War schneller zu Implementien. Die erste Idee war, alles per js dierekt zu einer Öffentlichen API zu schicken. Nun mahcen die Webseiten das ganze zuerst an die ensprechende Website gesendet und dort geprüft und dann über z.B. php per Restcall an den Microservice gesendet. Was dann dementsprechend auch noch etwas Sicherer ist. Wobei der microservice jeglichen Input ebenfalls noch einmal Valiediert…