REST Api Dokumentation

Thema wurde von guenter_reit, 25. April 2017 erstellt.

  1. guenter_reit

    guenter_reit Erfahrener Benutzer

    Registriert seit:
    20. April 2017
    Beiträge:
    49
    Danke erhalten:
    2
    Danke vergeben:
    13
    Hallo Zusammen,

    arbeite mich gerade durch die Doku der REST-Api. Dort steht an vielen Stellen immer der Hinweis:

    To see an example usage take a look at docs/REST/samples/category-service/create_category.php
    (dieser Vermerk zum Beispiel im Bereich "create category")

    Kann mir jemand sagen, wo dieser docs-Ordner zu finden ist? Er ist kein Bestandteil der Dateien des Shop-Systems!

    LG Gregor Mannek
     
  2. Anonymous

    Anonymous Erfahrener Benutzer

    Registriert seit:
    26. April 2011
    Beiträge:
    993
    Danke erhalten:
    208
    Danke vergeben:
    100
    (Link nur für registrierte Nutzer sichtbar.)
     
  3. guenter_reit

    guenter_reit Erfahrener Benutzer

    Registriert seit:
    20. April 2017
    Beiträge:
    49
    Danke erhalten:
    2
    Danke vergeben:
    13
    Da bin ich ja! Hier stehen die Verweise.

    Kann den Teil ab /docs/ auch nicht im Browser durch den Teil im Hinweis ersetzen.
     
  4. Anonymous

    Anonymous Erfahrener Benutzer

    Registriert seit:
    17. August 2016
    Beiträge:
    120
    Danke erhalten:
    22
    Danke vergeben:
    17
    Hallo Gregor,
    ich glaube die Textlichen Inhalte beziehen sich noch auf das alte Dokumentationssystem von Gambio, kann mich noch erinnern das es da immer nen docs Ordner in den ZIP Dateien dabei gab.

    Das worauf sich die Meldung bezieht findest du hier:
    (Link nur für registrierte Nutzer sichtbar.)apidoc/#api-Categories-CreateCategory

    in der Doku stehts wie du oben auch angemerkt hast im Fließtext wie folgt:
    docs/REST/samples/category-service/create_category.php

    die farblichen Unterschiede zeigen wie der Link zu lesen ist.

    Hatte anfänglich auch meine Schwierigkeiten weil auch bei Ronald Loyko im Github dieser Ordner nicht existiert was diese Info mir sagen soll, ist wohl noch nen Überbleibsel von "damals®".
    Die Beispiele sind aber alle vorhanden, die Ausgaben als Beispiele auch, findest du nur nicht links in der Navigation sofort, musst auf "APPENDICES" klicken oder den Link nehmen: (Link nur für registrierte Nutzer sichtbar.)


    Den Aufruf des Knoten machst du wie auch im Browser, die Authentifizierung läuft über BASIC Auth.
    In C# nutzt man da die Klasse HttpWebRequest und hängt dieser folgendes an:


    Code:
    _request.Credentials = new NetworkCredential("username", "password");
    willst du zB alle Kategorien haben ist die Url : (Link nur für registrierte Nutzer sichtbar.)
    willst du infos zur Kategorie mit ID 2 haben dann: (Link nur für registrierte Nutzer sichtbar.)


    wie man Basic Auth in PHP macht hatte Marco mal vor Monden in einem anderen Thread beantwortet: (Link nur für registrierte Nutzer sichtbar.)
     
  5. guenter_reit

    guenter_reit Erfahrener Benutzer

    Registriert seit:
    20. April 2017
    Beiträge:
    49
    Danke erhalten:
    2
    Danke vergeben:
    13
    Worauf sich das bezieht, ist klar, weil ich an der Stelle ja bin !!!!!!!!!!!!!!!!!!!!!! Also gibt es diese Beispiele nicht mehr, wenn ich das richtig verstehe?

    Du scheinst in der Thematik ja fit zu sein. Die klassischen GET- und POST-Abfragen habe ich hinbekommen. Was ich gar nicht verstehe ist die PUT-Geschichte, also ein Update via API. Meiner Logik nach ist das ein normaler POST, wo die ID des zu ändernden Datensatzes hinten mit Doppelpunkt an den Endpunkt gehangen wird und die geänderten Daten im Body als JSON-Daten vorhanden sein müssen. Bei mir erzeugt der immer neue Kategorien, anstatt die angegebene zu ändern.
     
  6. Anonymous

    Anonymous Erfahrener Benutzer

    Registriert seit:
    17. August 2016
    Beiträge:
    120
    Danke erhalten:
    22
    Danke vergeben:
    17
    #6 Anonymous, 26. April 2017
    Zuletzt bearbeitet: 26. April 2017
    Hallo Gregor,

    ja soweit schon, habe für unsere Warenwirtschaft den Shopconnector geschrieben und bin fleißig fehlende Parts in der API den Jungs von Gambio am melden :D

    Zu deiner Frage bzgl. PUT-API:

    Schritt 1: du musst aus den Daten die du aktualisieren willst einen String mit Daten im JSON-Format aufbauen
    Beispiel für Menge 10:
    Code:
    { "quantity" : "10" }
    die Feldnamen kannst du dem "GET" des jeweiligen Knotens aus der Doku entnehmen.
    Was da aufgelistet steht geht definitiv.
    Alles drumherum ist nicht 100% bestätigt, habe selber schon gesehen das bei einigen Knoten direkt die Tabellenfelder genommen werden, bei anderen wiederum nicht.

    willst du den Bestand und die EAN-Nummer abändern sieht dein JSON-String wie folgt aus:
    Code:
    {
        "quantity" : "10",
        "ean" : "1234567890127"
    }
    
    Schritt 2: du sendest eine WebRequest-Anfrage an den Knoten UND den Eintrag mit diesem JSON-String
    willst du den Artikel mit ID 9 aktualisieren rufst du die folgende Url auf: (Link nur für registrierte Nutzer sichtbar.) (ohne Punkt)

    - Du übergibst die BASIC Auth Daten dieser Anfrage
    - Als POST-Method schreibt du nicht "POST" sondern "PUT"
    - als Content-Type gibst du "application/json" an
    - du schreibst den JSON-String nun in diese WebRequest-Anfrage

    Als Response bekommst du nun ein Success oder Error zurück, die Aktualisierung ist somit erledigt
     
  7. Anonymous

    Anonymous Erfahrener Benutzer

    Registriert seit:
    17. August 2016
    Beiträge:
    120
    Danke erhalten:
    22
    Danke vergeben:
    17
    Hallo Gregor,
    wäre super wenn du hier im Forenthread kurz ein Feedback zurück gibst ob du mit der Hilfestellung weiter gekommen bist oder ob noch Hilfe benötigt wird. Ich bin selbst frühestens Morgen ab 9 wieder im Forum unterwegs wenn ich im Büro bin kann aber sehen ob du hier noch was gepostet hast und mich Mental dafür für Morgen früh schon mal vorbereiten.
     
  8. guenter_reit

    guenter_reit Erfahrener Benutzer

    Registriert seit:
    20. April 2017
    Beiträge:
    49
    Danke erhalten:
    2
    Danke vergeben:
    13
    #8 guenter_reit, 27. April 2017
    Zuletzt von einem Moderator bearbeitet: 27. April 2017
    Hallo Daniel,
    danke für die detaillierte Anregung. Habe das eins zu eins umgesetzt, bekommen aber nur 405er Fehler zurück: "Method not allowed".
    GET und POST funktionieren wunderbar, nur der PUT will nicht klappen. Hier mein PHP-Code zum testen:

    PHP:
    <?php

    //Variablen
    require_once('var.inc.php');
    $url $url "products/$id";

    // Zwischenklasse für JSON-Encoding
    class product
    {
        public 
    $warenbestand;
    }

    // GET-Parameter aus dem Aufruf
    if(isset($_GET['id']))
    {
        
    $id $_GET['id'];
    }
    if(isset(
    $_GET['bestand']))
    {
        
    $bestand $_GET['bestand'];
    }

    // Zwischen-Objekt
    $produktKlasse = new product();
    $produktKlasse->warenbestand $bestand;

    // JSON-Daten
    $data json_encode($produktKlasse);

    // REQUEST
    $ch curl_init();
    curl_setopt($chCURLOPT_URL$url);
    // POST und DATEN
    curl_setopt($chCURLOPT_CUSTOMREQUEST"PUT");
    curl_setopt($chCURLOPT_POSTFIELDS$data);
    curl_setopt($chCURLOPT_RETURNTRANSFERtrue);
    curl_setopt($chCURLOPT_HTTPHEADER, array(
            
    'Content-Type: application/json',
            
    'Content-Length: ' strlen($data))
    );
    // AUTHENTIFIZIERUNG
    curl_setopt($chCURLOPT_USERPWD"$username:$password");
    curl_setopt($chCURLOPT_HTTPAUTHCURLAUTH_BASIC);

    // Ausführen, Response
    $output curl_exec($ch);
    curl_close($ch);
    var_dump($output);

    ?>
    Vielleicht siehst du ja was, was ich nicht sehe!
     
  9. Anonymous

    Anonymous Erfahrener Benutzer

    Registriert seit:
    17. August 2016
    Beiträge:
    120
    Danke erhalten:
    22
    Danke vergeben:
    17
    #9 Anonymous, 27. April 2017
    Zuletzt bearbeitet: 27. April 2017
    Hallo, guck dir mal den String von deinem JSON an was er dir da zurückgibt.
    Steht da "Warenbestand : 6" drin wenn du eine 6 da reinkippst wird das nicht gehen da dieses Feld nicht existiert, die Variablen die du in deiner Klasse hinterlegst müssen Datentyp und Name der Tabellenstruktur aufweisen soweit ich das in PHP im Kopf habe.
    Die ID darf und wird nicht nochmal übergeben, da du dich ja direkt in dem "Produkt" befindest, die darfst du nur in $url verwenden (Bitte korrigiert mich @Wilken (Gambio) , @Marco (Gambio) und Co. falls ich da falsch liege)

    PHP:
    $url $url "products/$id";
    $url muss den folgenden Wert beinhalten
    PHP:
    "http://www.meinshop.de/api.php/v2/"
    prüf die Ausgaben der Variablen mal in dem du dir die Dumpst satt ein curl_exec auszuführen, close einfach erstmal und gib dir alle Variablen und Werte aus um rauszubekommen was du wo in den Datenstrom gießt.

    ein schnitzer hab ich da grad noch gesehen, ob der nicht dazu führt das da nix bei geht

    PHP:
    CURLOPT_POSTFIELDS
    du übergibst ja keine Felder oder Variablen sondern du übergibst "DATA"

    in C# sieht das ganze so aus:

    PHP:
                    //System.Text.Encoding encode = System.Text.Encoding.GetEncoding("utf-8"); // brauchst du wenn die Daten nicht in utf-8 sind
                    
    _request = (HttpWebRequest)HttpWebRequest.Create(Url);
                    
    _request.Method "PUT";
                    
    _request.ContentType "application/json";

                    
    _request.Credentials = new NetworkCredential("username""password");
                    
    _response null;

                    if (
    _request != null)
                    {
                        
    //var serializer = new JavaScriptSerializer(); // brauchst du wenn du Dictionaries oder objekte umwandeln willst in C#

                        
    string json "{ \"quantity\": 6 } "//ist hier Beispielhaft direkt der JSON-String ohne Konvertierungen
                        
    byte[] jsondata Encoding.UTF8.GetBytes(json); //ist hier Beispielhaft direkt UTF8
                        
    using (Stream streamWriter _request.GetRequestStream())
                        {
                            
    streamWriter.Write(jsondata0jsondata.Length);
                            
    streamWriter.Close();
                        }

                        
    _response = (HttpWebResponse)_request.GetResponse();
                        
    using (var streamReader = new StreamReader(_response.GetResponseStream()))
                        {
                            
    RESPONSE streamReader.ReadToEnd();
                            
    streamReader.Close();
                        }
                    }
    - erst machst du die Verbindung auf,
    - dann wandelst du den String ins JSON Format oder übergibst den sofort so
    - dann holst du dir die Byte-Folge daraus
    - diese schreibst du in den Stream
    - und holst dir am Ende den Response

    ich würde an deiner Stelle auch erstmal kleiner Anfangen:
    - schreib dir direkt einen JSON-Formatierten String, und puste den hart auf eine URL
    - klappt das beginnst du nach und nach die Hartkodierten Sachen zu Parameterisieren
     
  10. guenter_reit

    guenter_reit Erfahrener Benutzer

    Registriert seit:
    20. April 2017
    Beiträge:
    49
    Danke erhalten:
    2
    Danke vergeben:
    13

    Der Stammwert der $url-Variable ist in einer ausgelagerten Datei schon vordefiniert, wird also nur um den sich ändernden Teil erweitert. Daran liegt es definitiv nicht. Die Übertragenen Daten sind im korrekten Format. Und mit den Header-Eigenschaften funktioniert die Datenübertragung als POST ja auch!

    Werde das mal als ASP-Geschichte ausprobieren. C# ist eh das einzig wahre...

    Gebe dann mal Rückmeldung.

    VIELEN DANK FÜR DEINE MÜHEN !!!!!!!!!!!

    LG Gregor
     
  11. Moritz (Gambio)

    Moritz (Gambio) Administrator

    Registriert seit:
    26. April 2011
    Beiträge:
    5.786
    Danke erhalten:
    2.692
    Danke vergeben:
    903
    "Method not allowed" bedeutet, dass PUT, PATCH und DELETE auf deinem Server wohl nicht unterstützt werden. Das sollte der Provider mal für dich freischalten. GET und POST reichen für die Nutzung der REST-Api nicht.
     
  12. Anonymous

    Anonymous Erfahrener Benutzer

    Registriert seit:
    17. August 2016
    Beiträge:
    120
    Danke erhalten:
    22
    Danke vergeben:
    17
    Danke Moritz, so firm in den Betitelungen der Fehlermeldungen war ich jetzt auch nicht ausm Stehgreif (und sorry fürs nicht verlinken / mit Erwähnen)

    Gregor, du solltest trotzdem mal gucken ob da
    PHP:
    "Warenbestand"}
    oder
    PHP:
    "quantity" }
    im JSON-String übergeben wird
     
  13. guenter_reit

    guenter_reit Erfahrener Benutzer

    Registriert seit:
    20. April 2017
    Beiträge:
    49
    Danke erhalten:
    2
    Danke vergeben:
    13
    #13 guenter_reit, 27. April 2017
    Zuletzt bearbeitet: 27. April 2017

    Hallo,

    hätte da noch paar kleine Fragen zu deinem C#-Code. In deinem Code unboxed du HttpWebRequest in HttpWebRequest, dass wird wohl unboxing von WebRequest in HttpWebRequest sein?

    Habe dass jetzt in C# gemacht, wie du angeregt hast. Gibt aber denselben 405er Fehler!
     
  14. Anonymous

    Anonymous Erfahrener Benutzer

    Registriert seit:
    17. August 2016
    Beiträge:
    120
    Danke erhalten:
    22
    Danke vergeben:
    17
    PHP:
    private HttpWebRequest _request null;
    Hier die Erklärung der Klasse die verwendet wurde in meinem Beispiel:

    (Link nur für registrierte Nutzer sichtbar.)

    Rückgabe-Typ "WebRequest" ist nicht gleich Klassen-Typ "HttpWebRequest"

    WebRequest ist generisch, HttpWebRequest ist eine abgeleitete Klasse von "WebRequest" und muss deshalb gecastet werden sonst meckert der Compiler rum.

    Moritz hatte oben geschrieben 405 "Method not allowed" kommt von deinem Provider / Hoster und muss aktiviert werden bevor es geht.