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
Da bin ich ja! Hier stehen die Verweise. Kann den Teil ab /docs/ auch nicht im Browser durch den Teil im Hinweis ersetzen.
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.)
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.
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 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
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.
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//Variablenrequire_once('var.inc.php');$url = $url . "products/$id";// Zwischenklasse für JSON-Encodingclass product{ public $warenbestand;}// GET-Parameter aus dem Aufrufif(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($ch, CURLOPT_URL, $url);// POST und DATENcurl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");curl_setopt($ch, CURLOPT_POSTFIELDS, $data);curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'Content-Type: application/json', 'Content-Length: ' . strlen($data)));// AUTHENTIFIZIERUNGcurl_setopt($ch, CURLOPT_USERPWD, "$username:$password");curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);// Ausführen, Response$output = curl_exec($ch);curl_close($ch);var_dump($output);?> Vielleicht siehst du ja was, was ich nicht sehe!
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(jsondata, 0, jsondata.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
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
"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.
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": 6 } oder PHP: { "quantity" : 6 } im JSON-String übergeben wird
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!
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.