REST-API - Unterschied POST und PUT

POST erstellt in der Regel einen neuen Datensatz, PUT aktualisiert.

Was passiert bei PUT, wenn der Datensatz nicht exisitiert? Wird dann automatisch ein neuer Datensatz angelegt?

Wie sieht die Rückgabe aus?

Doku schweigt hierzu mal wieder.

Wenn du in der Doku dazu nichts findest, wäre es ja ein leichtes es eben auszuprobieren. Danach teilst du den anderen hier deine Ergebnisse mit.

Im Kopf werden das die wenigsten haben - ich würde das gleiche jetzt auch machen.

… oder den Hersteller fragen???

So eine Antwort darf ein User geben, der hier versucht aktiv zu helfen, aber bitte kein Mitarbeiter von Shopware. Die sollten eigentlich wissen was Sie programmiert haben oder wie der Ablauf gewollt ist oder wenigstens theoretich aussehen sollte.

Ich will ja die API genau deshalb nutzen, damit ich nicht dauernd testen muss ob was geht oder nicht und ich nicht dauernd im Quellcode nachsehen muss ob das nun so geplant war oder ein Bug ist. Heute legt PUT einen fehlenden Datensatz neu an  und in der nächsten Version ist das dann ein BUG, weil es so ja gar nicht vom Entwickler designed war. Und ich schreib dann alles wieder um? Das kann es doch nicht sein. Der Hersteller sollte schon wissen wie es ausshen soll.

@volkerstraehle schrieb:

… oder den Hersteller fragen???

So eine Antwort darf ein User geben, der hier versucht aktiv zu helfen, aber bitte kein Mitarbeiter von Shopware. Die sollten eigentlich wissen was Sie programmiert haben oder wie der Ablauf gewollt ist oder wenigstens theoretich aussehen sollte.

Ich will ja die API genau deshalb nutzen, damit ich nicht dauernd testen muss ob was geht oder nicht und ich nicht dauernd im Quellcode nachsehen muss ob das nun so geplant war oder ein Bug ist. Heute legt PUT einen fehlenden Datensatz neu an  und in der nächsten Version ist das dann ein BUG, weil es so ja gar nicht vom Entwickler designed war. Und ich schreib dann alles wieder um? Das kann es doch nicht sein. Der Hersteller sollte schon wissen wie es ausshen soll.

Nur das ich kein Entwickler bin und das hier kein Support-Kanal ist. Wenn du den Hersteller fragen willst, kannst du das über den Entwickler-Support tun. Der ist in einigen unserer Support-Paketen enthalten und auch ab einem SSP-Partnerstatus. Hier im Forum fragst du die Community und keine Shopware-Mitarbeiter. Die helfen dir vielleicht wenn Sie Lust dazu haben - aber da kann auch mal die Antwort sein „Weiß ich gerade nicht, müsste ich nachschauen, mach doch eben selbst“. 

Also entweder nutzt du die offiziellen Supportkanäle und bekommst auch Antworten von einem Shopware-Entwickler oder du fragst in der Community nach und erhälst Community Antworten. Das ist denke ich klar :slight_smile:

Das ist die Theorie, aber ist das in Shopware auch so umgesetzt? Es ist imme rnoch Sache des Enwicklers was er aus einem POST- oder PUT-Request macht. Und wenn für PUT keine INSERT-Methode bei nicht vorhandenen Datensatz implementiert ist. dann passiert halt nix.

Ich verweise beispielhaft auf https://developers.shopware.com/developers-guide/rest-api/api-resource-categories/ und hier auf

POST (create) and PUT (update)

id   integer (primary key)     If null, a new entity will be created

Bei was? Bei PUT, bei POST, bei id gar nicht vorhanden?

Was soll passieren wenn ich bei POST eine id mit übergebe? Update? Neuanlage? Neuanlage mit vorherigem löschen des Datensatzes (ähnlich REPLACE in SQL)?

Klar kann man das durch try-n-error prüfen, aber das klärt nicht die Frage wie es aus Sicht der Entwickler sein soll.

@Moritz Naczenski schrieb:

Nur das ich kein Entwickler bin und das hier kein Support-Kanal ist. Wenn du den Hersteller fragen willst, kannst du das über den Entwickler-Support tun. Der ist in einigen unserer Support-Pakete enthalten und auch ab einem SSP-Partenrstatus. Hier im Forum fragst du die Community und keine Shopware-Mitarbeiter. Die helfen dir vielleicht wenn Sie Lust dazu haben - aber da kann auch mal die Antwort sein „Weiß ich gerade nicht, müsste ich nachschauen, mach doch eben selbst“.

Dann könnte der Mitarbeiter des Herstellers auch hergehen und den Enwickler informieren? Oder sagen „gute Frage, weis ich nicht, geb ich weiter“?

Stattdessen sol ich rausfinden wie der Hersteller das wohl gemeint haben könnte wie es funktionieren soll. Und dem Hersteler die doku dazu liefern? Genau dafür zahlt man dann 1.000 € + ?

Das Community Forum ist erstmal „Kunde hilft Kunde“. Wenn das mal nicht funktioniert, dann unterstützen wir auch gerne mal Außer der Reihe. Der erste Schritt ist aber erstmal „Hilfe zur Selbsthilfe“ und die hab ich dir gegeben. Eine Aussage wie „So war das initial mal gedacht“ wird dir keiner geben, zum einen weil das eben keiner „Mal eben“ aus dem Kopf weiß, geschweige denn die komplette API von einer Person geschrieben wurde, zum anderen die API auch schon über mehre Versionen auf Basis von Kundenwünschen erweitert und ausgebaut wurde. Du kannst den IST-Zustand nachprüfen und damit must du nun klarkommen. Die Frage „Wie haben sich die Entwickler das Gedacht“ ist prädestiniert dafür unbeantwortet zu bleiben. Niemand hat ganz Shopware aus dem FF im Kopf :wink:

Natürlich helfe ich dir gerne, indem ich den IST-Zustand für dich nachschaue - das kann ich morgen gerne mal machen. Unabhängig davon, wirst du damit erstmal klarkommen müssen.

Die offiziellen Support-Kanäle erreichst du über account.shopware.com.

Put wirft z.B ein Fehler wenn der Artikel nicht existiert siehe shopware/Article.php at 5.4 · shopware/shopware · GitHub

POST erzeugt einen Datensatz und kann nicht genutzt werden, um einen Datensatz zu aktualisieren

-> Wenn man per POST einen bestehenden Artikel übergibt, erfolgt eine Meldung „A variant with the given order number „SW1001“ already exists.“

PUT aktualisiert einen Datensatz, wenn dieser nicht vorhanden ist, wird ein Fehler geworfen

-> Wenn man per PUT einen Datensatz übergibt, der nicht existiert, erfolgt eine Meldung „Article by number SW1005 not found“

 

Generell geht PUT immer direkt auf den Artikel - also bspw. /articles/ID oder /articles/Ordernumber?useNumberAsId=true. POST hingegen geht direkt gegen die /articles-Resource.

 

Genutzt wurde unser Client aus der Doku, mit folgendem, einfachen Beispiel:

function createArticle()
{
    global $client;

    $minimalTestArticle = [
        'name' => 'TestPProduct',
        'active' => false,
        'tax' => 19,
        'supplier' => 'TestSupplier',
        'mainDetail' => [
            'number' => 'SW1001',
            'prices' => [
                [
                    'customerGroupKey' => 'EK',
                    'price' => 70,
                ],
            ]
        ],
    ];
    echo json_encode($minimalTestArticle);

    $client->put('articles/SW1005?useNumberAsId=true', $minimalTestArticle);
  //$client->post('articles', $minimalTestArticle); Für Artikelanlage
}

POST also immer gegen die Hauptresource, erzeugt einen Datensatz, PUT immer gegen die Details der Resource, aktualisiert einen Datensatz.

Die Besonderheit bei Kategorien ist, dass hier die ID übernommen wird, damit man sich bei einem Parent/Child Konstrukt auf die IDs verlassen kann. Auch hier jeweils eine Meldung, wenn die Kategorie nicht existiert (PUT). Im Batch-Modus verändert sich das natürlich.

1 „Gefällt mir“

Übernimmst Du sowas auch in die Doku?