REST API ... useNumberAsID

Hi!

Anfrage “http://198.200.0.54:81/api/articles/F08?useNumberAsID=true” an REST API liefert {“success”:false,“message”:“Article by id F08 not found”}

Schon die Fehlermeldung deutet auf einen Bug an (nicht ID sondern Artikelnummer habe ich übergeben)

Wenn so ein Artikelnummer nicht gefunden worden wäre, dann hätte ich diesen Fehler erwartet: Article by number {$number} not found

 

Was ist hier los? Bug in Rest API?

LG,
Kaster

PS. Ich nutze Shopware 5.2.21 ( Rev: 201703211201) im Bitnami auf Windows

Hi,

versuch es mal mit useNumberAsId" - also kleinem “d” am Ende. 

Besten Gruß,

Daniel

Aus dem Browser klappts damit.

Wenn ich aber aus C# über RestSharp (angeblich) die gleiche Anfrage starte, dann habe ich wieder den alten Fehler. Ich muss checken was RestSharp unter der Haube überhaupt absendet.

 

Gruß,

Kaster

Also,

mit RestSharp abgesendeter GET Request kommt nicht klar mit dem Erkennen wann die ID als Artikelnummer zu verwenden ist und wann nicht.

Habe jetzt eine Änderung in Articles.php (function getAction()) gemacht mit der es funktioniert:


        $id = $this->Request()->getParam(‚id‘);
        
        Shopware()->PluginLogger()->info(„getAction id vorher: „.urldecode($id));
        $stuecke = spliti (“?“, urldecode($id), 2);
        $id = $stuecke[0];
        Shopware()->PluginLogger()->info(„getAction id nacher: „.$id);
        $stuecke2 = spliti (“=“, $stuecke[1], 2);
        if ($stuecke2[0] == „useNumberAsId“) {
            $useNumberAsId = (boolean) $stuecke2[1] == „true“;
        } else {
            $useNumberAsId = (boolean) 0;
        }
        //$useNumberAsId = (boolean) $this->Request()->getParam(‚useNumberAsId‘, 0);


Ich weiss nicht genau warum der Request dort in dem Fall so ankommt, aber als workaround, bis das gefixt wird, taugt das hier erstmal.

Gruß,

Kaster

hallo kaster,

wie haben Sie die RestSharp Request geschickt??

Gruß,

Ahmad

hi

mit Hilfe von modifizierten ShopwareApi (jetzt caseSensitive URI mit kleinem D bei “useNumberAsId” in ArticleRessource.cs) und Standard-RestCharp lib habe ich folgendes gemacht:

 

ShopwareApi api = new ShopwareApi(this.settings.shopwareApiUri, this.settings.shopwareApiBenutzername, this.settings.shopwareApiKey);

ArticleMain ShopArtikel = new ArticleMain();
ShopArtikel.name = artikel.BezeichnungKurz;
ArticleMainDetail amd = new ArticleMainDetail();
amd.number = artikel.Artikelnummer;
ShopArtikel.mainDetail = amd;
Supplier supplier = new Supplier();
string lieferantenname = ArtikelService.LieferantennameAusArtikelId(artikel.Id);
supplier.name = lieferantenname;
ShopArtikel.supplier = supplier;
Tax tax = new Tax();
double steuerProzentsatz = ArtikelService.SteuerprozentAusArtikelId(artikel.Id);
tax.tax = steuerProzentsatz;
ShopArtikel.tax = tax;
ShopArtikel.active = true;
api.getArticleRessource().add(ShopArtikel);
// ShopId im WaWi einpflegen (es wird angenommen das die Artikelnummer andeutig ist)
ArticleMain ShopArtikelAngelegt = api.getArticleRessource().getByOrdernumber(artikel.Artikelnummer);
ArtikelService.SetArtikelShopId(artikel.Id, ShopArtikelAngelegt.id);

 

Also ohne die Serverkomponente Articles.php in der Function getAction() geändert zu haben, funktioniert die Geschichte nicht.

Ich hangele mich anscheinen von Fall zu Fall hier durch … gerade funktioniert die Gruppenanlage nicht. :frowning:

 

  1. ShopwareApi (https://github.com/shopdoktor/shopware-csharp-api-connector)

Um den Kontext zu behalten und nicht in einem neuen Thread alles wieder erklären zu müssen, fahre ich hier fort mit den Erlebnissen bei Versuch der Synchronisierung einer Warenwirtschaft-Software mit Shopware mittels der API …

Nächstes Problem ist bei Anlage von neuen Kategorien (wie oben schon erwähnt) aufgetreten.

Fehlermeldung: PHP Fatal error:  Call to a member function getId() on null in C:\Bitnami\shopware-5.2.21-0\apps\shopware\htdocs\engine\Shopware\Components\Model\CategorySubscriber.php on line 344

Also klassische NullPointerException … erstmal frage ich mich wer da am Werk und wann … anscheinend letzte Änderungen dies betreffend wurden zuletzt 2013 (!) gemacht.

Wie auch immer … ich sichere den Zugriff auf $parent->getId() wenn $parent null ist und liefere in dem Fall dann einfach als $path die null zurück, und schaue was passiert …

Hallo Kaster,

über die erstes Problem , was ich möchte ist, wie haben Sie die Query parameter useNumberAsId zu url hinzufügen.

ich gluabe dass ist im methon api.getArticleRessource().getByOrdernumber method.

könnten Sie dieses Code schreiben.

VG,

Ahmad

 

Mein Code:

                    ArticleMain ShopArtikel = new ArticleMain();
                    ShopArtikel.name = artikel.BezeichnungKurz;
                    ArticleMainDetail amd = new ArticleMainDetail();
                    amd.number = artikel.Artikelnummer;

                    api.getArticleRessource().add(ShopArtikel);
                    // Ich will wissen Daten des angelegten Artikels … ShopId im WaWi einpflegen (es wird angenommen das die Artikelnummer andeutig ist)
                    ArticleMain ShopArtikelAngelegt = api.getArticleRessource().getByOrdernumber(artikel.Artikelnummer);

im der Function getByOrdernumber steht folgendes

                    return this.get(ordernumber + „?useNumberAsId=true“);

Da ist also Korrektur zu Originalcode der ShopwareApi die case sensitivity betrifft (im Original steht „useNumberAsID“) untergebracht.

Um die Daten des angelegten Artikels zu bekommen könnte man auch alternativ alle Artikel vorher mit den Artikeln nach der Anlage vergleichen und den neuen herauspicken … nur performant gerade ist die Methode nicht.

 

Gruß,
 

Hallo @Kaster‍,

diese ist mein erste mal mit C# aber ich glaube ich habe das Problem gefounden.

es ist in diese Line RestSharp/RestClient.cs at e7c65df751427298cb59f5456bbf1f59967996be · restsharp/RestSharp · GitHub

genua mit p.Value.ToString().UrlEncode() ==> „F08?useNumberAsId=true“.ToString().UrlEncode() ==> „F08%3FuseNumberAsId%3Dtrue“

deshalbe shopware sehe diese wert als ID , weil es ist String für Shopware und nicht QueryString

Ich habe diese GitHub - shopdoktor/shopware-csharp-api-connector: C# Client for Shopware API (forked) und habe meine Lösung hinzufügt und ein PR zu Ihnen gescheckt.

Probieren Sie das Code mal und gib mir Bescheid.

Wie ich habe gesagt, diese ist meine erste mal mit C#, so vielleicht gibt ein oder zwei Fehler, aber die globale Idea ist dort.

VG,

Ahmad

Hallo Kaster,

ich benutze momentan auch den shopware-csharp-api-connector, und habe schon mehrere Änderungen/Bugfixes in meinen Fork bereit gestellt auf GitHub.

zB. gibt den POST hinter das „api.getArticleRessource().add(ShopArtikel)“ schon die „id“ zurück von den gerade angelegte Artikel. Das habe ich geändert mit diesem commit und können Sie dann benutzen wie:   int shop_id;  shop_id = api.getArticleRessource().add(ShopArtikel);

und mit diesem commit ist den Fehler behoben wie auch Ahmad hier beschrieben hat (es wird im Original Connector url encoded, was nicht mehr funktioniert in 5.2.x).