KasterKaster MitgliedKommentare: 5 Danke erhalten: 0 Mitglied seit: 12. Mai

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

Kommentare

  • Daniel NögelDaniel Nögel ModeratorKommentare: 1517 Danke erhalten: 357 Mitglied seit: September 2012

    Hi,

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

    Besten Gruß,

    Daniel

  • KasterKaster MitgliedKommentare: 5 Danke erhalten: 0 Mitglied seit: 12. Mai

    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

  • KasterKaster MitgliedKommentare: 5 Danke erhalten: 0 Mitglied seit: 12. Mai

    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

  • ahmadsaadahmadsaad MitgliedKommentare: 137 Danke erhalten: 32 Mitglied seit: September 2016

    hallo kaster,

    wie haben Sie die RestSharp Request geschickt??

    Gruß,

    Ahmad

  • KasterKaster MitgliedKommentare: 5 Danke erhalten: 0 Mitglied seit: 12. Mai

    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. :-(

     

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

  • KasterKaster MitgliedKommentare: 5 Danke erhalten: 0 Mitglied seit: 12. Mai

    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 ...

  • ahmadsaadahmadsaad MitgliedKommentare: 137 Danke erhalten: 32 Mitglied seit: September 2016

    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

     

  • KasterKaster MitgliedKommentare: 5 Danke erhalten: 0 Mitglied seit: 12. Mai

    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ß,
     

  • ahmadsaadahmadsaad MitgliedKommentare: 137 Danke erhalten: 32 Mitglied seit: September 2016

    Hallo @Kaster‍,

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

    es ist in diese Line https://github.com/restsharp/RestSharp/blob/e7c65df751427298cb59f5456bbf1f59967996be/RestSharp/RestClient.cs#L331

    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 https://github.com/shopdoktor/shopware-csharp-api-connector (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

  • WillemMeertWillemMeert MitgliedKommentare: 8 Danke erhalten: 1 Mitglied seit: 5. März

    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).

     

Anmelden oder Registrieren, um zu kommentieren.