API Verständnisproblem

Guten Morgen,

um die API zu testen habe ich folgendes Beispiel durchgearbeitet um ein Verständnis für die Vorgehensweise zu bekommen.

https://entwickler.de/online/php/shopware-6-api-first-579912696.html

  1. die Credentials Auth Methode hat nicht funktioniert, daher jetzt mit Integrations Key

Der Aufruf erfolgt im Controller somit über 

//Controller
$service->request('GET', 'customer');

//Service
$this->restClient->send($request); //$this->restClient = GuzzleHttp\Client

Als Antwort bekomme ich lediglich die Stream Resource von Guzzle:

 stream: stream resource @779 ▼ wrapper\_type: "PHP" stream\_type: "TEMP" mode: "w+b" unread\_bytes: 0 seekable: true uri: "[php://temp](php://temp)" options: [] } -size: 4 -seekable: true -readable: true -writable: true -uri: "php://temp" -customMetadata: []

 

Sollten hier jetzt nicht irgendwo alle Customer auftauchen?

Jetzt, 2 Tage später bin ich immer noch nicht weiter. Ich erhalte nach wie vor leere Ergebnisse.

Gibt es irgendwo ein funktionierendes Beispiel? ich will lediglich die Daten des customers der ein Event ausgelöst hat. Die Id habe ich. Nur der Rest bleibt mir verborgen.

Wie soll man anhand von 2 Codezeilen, erkennen was du falsch machst?

ok, dann hier der vollständige Code:

//Controller

$service = $this->container->get('geolocation.restService');
$response = $service->request('GET', 'customer');

//restService

use GuzzleHttp\Client;
use GuzzleHttp\Psr7\Request;
use Psr\Http\Message\RequestInterface;
use Shopware\Core\System\SystemConfig\SystemConfigService;


class RestService
{
    /**
     * @var Client
     */
    private $restClient;

    /**
     * @var SystemConfigService
     */
    private $config;

    /**
     * @var string
     */
    private $accessToken;

    /**
     * @var string
     */
    private $refreshToken;

    /**
     * @var \DateTimeInterface
     */
    private $expiresAt;

    public function __construct(SystemConfigService $config)
    {
        $this->restClient = new Client();
        $this->config = $config;
    }

       
    private function getAdminAccess(): void
    {
        
        $body = \json_encode([
            "grant_type" => "client_credentials",
            "client_id" => "integrations_id",
            "client_secret" => "integrations_secret"
    
            
        ]);

        $request = new Request(
            'POST',
            'https://meinedomain.de/api/oauth/token', //getenv('APP_URL') . '/api/oauth/token',
            ['Content-Type' => 'application/json'],
            $body
        );

        $response = $this->restClient->send($request);
        //dd($response);
        $body = json_decode($response->getBody()->getContents(), true);

        $this->setAccessData($body);
    }

    private function setAccessData(array $body): void
    {
        $this->accessToken = $body['access_token'];
        //$this->refreshToken = $body['refresh_token'];
        $this->expiresAt = $this->calculateExpiryTime((int) $body['expires_in']);
    }

    private function calculateExpiryTime(int $expiresIn): \DateTimeInterface
    {
        $expiryTimestamp = (new \DateTime())->getTimestamp() + $expiresIn;

        return (new \DateTimeImmutable())->setTimestamp($expiryTimestamp);
    }

    private function createShopwareApiRequest(string $method, string $uri, ?string $body = null): RequestInterface
    {
        return new Request(
            $method,
            'https://meinedomain.de/api/v3/'. $uri, //getenv('APP_URL') . '/api/v3/' . $uri,
            [
                'Authorization' => 'Bearer ' . $this->accessToken,
                'Accept' => '*/*'
            ],
            $body
        );
    }
    
    private function send(RequestInterface $request, string $uri)
    {
        if ($this->expiresAt <= (new \DateTime())) {
            $this->refreshAuthToken();

            $body = $request->getBody()->getContents();

            $request = $this->createShopwareApiRequest($request->getMethod(), $uri, $body);
        }
        $body = $request->getBody();
        $send = $this->restClient->send($request);
        //dd($request);
        return $body; 
    }

    private function refreshAuthToken(): void
    {
        $body = \json_encode([
            'client_id' => 'administration',
            'grant_type' => 'refresh_token',
            'scopes' => $this->config->get('RestApiHandling.config.scope'),
            'refresh_token' => $this->refreshToken
        ]);

        $request = new Request(
            'POST',
            getenv('APP_URL') . '/api/oauth/token',
            ['Content-Type' => 'application/json'],
            $body
        );

        $response = $this->restClient->send($request);

        $body = json_decode($response->getBody()->getContents(), true);

        $this->setAccessData($body);
    }
    
    public function request(string $method, string $uri, ?array $body = null)
    {
        if ($this->accessToken === null || $this->refreshToken === null || $this->expiresAt === null) {
            $this->getAdminAccess();
        }

        $bodyEncoded = json_encode($body);

        $request = $this->createShopwareApiRequest($method, $uri, $bodyEncoded);

        $response = $this->send($request, $uri);
        return $response; 
    }
}

Wenn du über den Customer-Endpoint gehst, musst man vorher den Kunden einloggen, um seine Infos zu ziehen: Shopware 6: SalesChannel-API customer endpoint

Oder man geht über den Search-Endpoint und durchsucht direkt die Customer-Entity: Shopware 6: Reading entities

Vielen Dank für die links. Ich werde mir das mal ansehen.

Versuch mal die Response zum string zu casten. Dann solltest du das ergebniss kriegen

Ansonsten, wie so oft:

  1. Im Profiler schauen ob die gewünschten Daten überhaupt aus der DB gezogen werden.
  2. Falls ja: in xDebug Schritt für Schritt durchgehen und schauen, an welcher Stelle die gezogenen Daten “verschwinden”.
  3. Falls nein: In xDebug Schritt für Schritt durchgehen und schauen wann er Prozess von einem “funktionierenden” Aufruf abweicht.
     

Viel Erfolg.

@Shyim schrieb:

Versuch mal die Response zum string zu casten. Dann solltest du das ergebniss kriegen

 $this->restClient->send($request)->getBody() ist „“ leer falls du das meintest.

Es scheint das gar keine Daten gezogen werden so dass ich den Service grundlegend überarbeiten muss.

Natürlich werden keine Daten gezogen. Du gehst über den customer Endpoint aber dafür müsstest du vorher den User über den selben Endpoint einloggen.

Du musst über den search Endpoint gehen, da kannst du direkt nach ids suchen.