# API Verständnisproblem

**URL:** <https://forum.shopware.com/t/api-verstandnisproblem/69150>\
**Category:** Programmierung\
**Created:** [25. August 2020 um 06:51 UTC](https://forum.shopware.com/t/api-verstandnisproblem/69150 "2020-08-25T06:51:28Z")\
**Posts on this page:** 10\
**Page:** 1

<div class="post-metadata">

**Author:** ![Systemcheck](https://dub1.discourse-cdn.com/flex013/user_avatar/forum.shopware.com/systemcheck/32/13432_2.png) [@Systemcheck](https://forum.shopware.com/u/Systemcheck)\
**Post date:** [25. August 2020 um 06:51 UTC](https://forum.shopware.com/t/api-verstandnisproblem/69150/1 "2020-08-25T06:51:28Z")

</div>

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](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&nbsp;

```
//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: []

```

&nbsp;

Sollten hier jetzt nicht irgendwo alle Customer auftauchen?

---

<div class="post-metadata">

**Author:** ![Systemcheck](https://dub1.discourse-cdn.com/flex013/user_avatar/forum.shopware.com/systemcheck/32/13432_2.png) [@Systemcheck](https://forum.shopware.com/u/Systemcheck)\
**Post date:** [27. August 2020 um 10:48 UTC](https://forum.shopware.com/t/api-verstandnisproblem/69150/2 "2020-08-27T10:48:19Z")

</div>

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.

---

<div class="post-metadata">

**Author:** ![AlexGalax](https://dub1.discourse-cdn.com/flex013/user_avatar/forum.shopware.com/alexgalax/32/9925_2.png) [@AlexGalax](https://forum.shopware.com/u/AlexGalax)\
**Post date:** [28. August 2020 um 07:40 UTC](https://forum.shopware.com/t/api-verstandnisproblem/69150/3 "2020-08-28T07:40:03Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![Systemcheck](https://dub1.discourse-cdn.com/flex013/user_avatar/forum.shopware.com/systemcheck/32/13432_2.png) [@Systemcheck](https://forum.shopware.com/u/Systemcheck)\
**Post date:** [28. August 2020 um 08:57 UTC](https://forum.shopware.com/t/api-verstandnisproblem/69150/4 "2020-08-28T08:57:49Z")

</div>

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; 
    }
}
```

---

<div class="post-metadata">

**Author:** ![AlexGalax](https://dub1.discourse-cdn.com/flex013/user_avatar/forum.shopware.com/alexgalax/32/9925_2.png) [@AlexGalax](https://forum.shopware.com/u/AlexGalax)\
**Post date:** [28. August 2020 um 11:07 UTC](https://forum.shopware.com/t/api-verstandnisproblem/69150/5 "2020-08-28T11:07:37Z")

</div>

Wenn du über den Customer-Endpoint gehst, musst man vorher den Kunden einloggen, um seine Infos zu ziehen: [Shopware 6: SalesChannel-API customer endpoint](https://docs.shopware.com/en/shopware-platform-dev-en/sales-channel-api/sales-channel-customer-api#full-example)

Oder man geht über den Search-Endpoint und durchsucht direkt die Customer-Entity: [Shopware 6: Reading entities](https://docs.shopware.com/en/shopware-platform-dev-en/admin-api-guide/reading-entities?category=shopware-platform-dev-en/admin-api-guide#search-endpoint)

---

<div class="post-metadata">

**Author:** ![Systemcheck](https://dub1.discourse-cdn.com/flex013/user_avatar/forum.shopware.com/systemcheck/32/13432_2.png) [@Systemcheck](https://forum.shopware.com/u/Systemcheck)\
**Post date:** [29. August 2020 um 07:50 UTC](https://forum.shopware.com/t/api-verstandnisproblem/69150/6 "2020-08-29T07:50:27Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![shyim](https://dub1.discourse-cdn.com/flex013/user_avatar/forum.shopware.com/shyim/32/7681_2.png) [@shyim](https://forum.shopware.com/u/shyim)\
**Post date:** [29. August 2020 um 12:10 UTC](https://forum.shopware.com/t/api-verstandnisproblem/69150/7 "2020-08-29T12:10:19Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![euroxid](https://dub1.discourse-cdn.com/flex013/user_avatar/forum.shopware.com/euroxid/32/15105_2.png) [@euroxid](https://forum.shopware.com/u/euroxid)\
**Post date:** [30. August 2020 um 00:39 UTC](https://forum.shopware.com/t/api-verstandnisproblem/69150/8 "2020-08-30T00:39:43Z")

</div>

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&nbsp;Schritt für Schritt durchgehen und schauen wann er Prozess von einem “funktionierenden” Aufruf abweicht.  
&nbsp;

Viel Erfolg.

---

<div class="post-metadata">

**Author:** ![Systemcheck](https://dub1.discourse-cdn.com/flex013/user_avatar/forum.shopware.com/systemcheck/32/13432_2.png) [@Systemcheck](https://forum.shopware.com/u/Systemcheck)\
**Post date:** [31. August 2020 um 09:46 UTC](https://forum.shopware.com/t/api-verstandnisproblem/69150/9 "2020-08-31T09:46:11Z")

</div>

> [@Shyim schrieb:](https://forum.shopware.com/profile/20792/Shyim "Shyim")
> 
> Versuch mal die Response zum string zu casten. Dann solltest du das ergebniss kriegen

&nbsp;$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.

---

<div class="post-metadata">

**Author:** ![AlexGalax](https://dub1.discourse-cdn.com/flex013/user_avatar/forum.shopware.com/alexgalax/32/9925_2.png) [@AlexGalax](https://forum.shopware.com/u/AlexGalax)\
**Post date:** [1. September 2020 um 06:14 UTC](https://forum.shopware.com/t/api-verstandnisproblem/69150/10 "2020-09-01T06:14:58Z")

</div>

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.
