Mit FileMaker 16 ist es möglich cURL-Optionen mit nativen Bordmitteln zu nutzen.
Wie man ein JSON von einem Webserver abholt, haben wir schon in einem früheren Tutorial gezeigt. In diesem Artikel geht es darum, ein JSON zu einem Webserver zu schicken.
Auf unserer Homepage findet Ihr unter https://fm-tutorial.de/api/json/json_check.php ein PHP-Script, an das Ihr euer JSON senden könnt.
Wenn Ihr auf den Link klickt, erscheint ein JSON:
{ "code": 500, "msg": "JSON - Syntaxfehler, ung\u00fcltiges JSON" }
Dieses PHP-Script dient als kleine API z.B. zur eurer Homepage, Webshop, etc.
Hier in unserem Beispiel-PHP-Script wird ein Token “fm-tutorial.de” im JSON erwartet. Sollte kein gültiger Token im JSON enthalten sein, wird obige Meldung mit dem HTTP-Code 500 ausgegeben. Da ich über einen ganz gewöhnlichen Browseraufruf kein JSON mit senden kann, wird ein JSON-Syntax-Fehler ausgegeben.
Das PHP-Script beinhaltet zwei Funktionen isJSONValid()
und getCode($code)
, um das JSON zu prüfen und einen Antwort-Header zu setzen.
function isJSONValid() { switch(json_last_error()) { case JSON_ERROR_NONE: return "ok"; case JSON_ERROR_DEPTH: return 'JSON - Maximale Stacktiefe überschritten'; case JSON_ERROR_STATE_MISMATCH: return 'JSON - Unterlauf oder Nichtübereinstimmung der Modi'; case JSON_ERROR_CTRL_CHAR: return 'JSON - Unerwartetes Steuerzeichen gefunden'; case JSON_ERROR_SYNTAX: return 'JSON - Syntaxfehler, ungültiges JSON'; case JSON_ERROR_UTF8: return 'JSON - Missgestaltete UTF-8 Zeichen, möglicherweise fehlerhaft kodiert'; default: return 'JSON - Unbekannter Fehler'; } }
Wird ausgeführt nachdem versucht wurde, das gesendete JSON in ein Objekt zu parsen, um zu prüfen welcher Fehler beim parsen des JSON auftrat.
function getCode($code) { switch ($code) { case 100: $text = 'Continue'; break; case 101: $text = 'Switching Protocols'; break; case 200: $text = 'OK'; break; case 201: $text = 'Created'; break; case 202: $text = 'Accepted'; break; case 203: $text = 'Non-Authoritative Information'; break; case 204: $text = 'No Content'; break; case 205: $text = 'Reset Content'; break; case 206: $text = 'Partial Content'; break; case 300: $text = 'Multiple Choices'; break; case 301: $text = 'Moved Permanently'; break; case 302: $text = 'Moved Temporarily'; break; case 303: $text = 'See Other'; break; case 304: $text = 'Not Modified'; break; case 305: $text = 'Use Proxy'; break; case 400: $text = 'Bad Request'; break; case 401: $text = 'Unauthorized'; break; case 402: $text = 'Payment Required'; break; case 403: $text = 'Forbidden'; break; case 404: $text = 'Not Found'; break; case 405: $text = 'Method Not Allowed'; break; case 406: $text = 'Not Acceptable'; break; case 407: $text = 'Proxy Authentication Required'; break; case 408: $text = 'Request Time-out'; break; case 409: $text = 'Conflict'; break; case 410: $text = 'Gone'; break; case 411: $text = 'Length Required'; break; case 412: $text = 'Precondition Failed'; break; case 413: $text = 'Request Entity Too Large'; break; case 414: $text = 'Request-URI Too Large'; break; case 415: $text = 'Unsupported Media Type'; break; case 500: $text = 'Internal Server Error'; break; case 501: $text = 'Not Implemented'; break; case 502: $text = 'Bad Gateway'; break; case 503: $text = 'Service Unavailable'; break; case 504: $text = 'Gateway Time-out'; break; case 505: $text = 'HTTP Version not supported'; break; default: exit('Unknown http status code "' . htmlentities($code) . '"'); break; } $protocol = (isset($_SERVER['SERVER_PROTOCOL']) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0'); header($protocol . ' ' . $code . ' ' . $text); }
Setzt den HTTP-Antwort-Code und den entsprechenden Header. Auf diesen Header reagiert auch FileMaker. Senden wir z.B. den Code 401, gibt FileMaker den FileMaker-Error-Code 1627 aus.
Hinweis:
FileMaker zeigt nur die Response, wenn es sich um einen erfolgreichen Quittierungcode z.B. 200, 201 handelt.
Damit immer eine Response an FileMaker zurück gegeben wird, sollte im Header immer Code 200 zurückgegeben werden.
Die Überprüfung kann man über das JSON vornehmen, in dem der Parameter code auf den Wert 200, in FileMaker geprüft wird.
Da das JSON über keinen POST-Parameter z.B. data = {“json” : “wert”} gesendet wird, muss die Response über file_get_contents
ermittelt werden.
json_decode(file_get_contents('php://input'));
Das JSON wird aus dem Request-Body in ein Objekt geparst. Anschließend wird die Funktion isJSONValid()
ausgeführt, um zu überprüfen, ob das JSON der Norm entspricht.
Anschließend erfolgt die Überprüfung des Tokens. Dieser kann z.B. mittels einer Datenbank geprüft bzw. gesperrt werden. Ist der Token nicht “fm-tutorial.de” wird der Code 401 zurückgegeben.
#JSON validieren $isValid = isJSONValid(); if( $isValid != 'ok') { $r['code'] = 500; $r['msg'] = $isValid; } #Token prüfen elseif($ar->token != 'fm-tutorial.de') { $r['code'] = 401; $r['msg'] = 'Dein Token stimmt nicht!'; } else { $r['code'] = 200; $r['msg'] = 'Ok, dein JSON entspricht der Prüfung.'; }
Nun muss die Antwort ($r), welche momentan noch ein PHP-Array ist, in ein JSON formatiert und ausgegeben werden.
#Output getCode($r['code']); header('Content-Type: application/json'); echo json_encode($r, JSON_PRETTY_PRINT); exit;
Wir übergeben den Parameter “code” in der Funktion getCode
, dadurch wird der entsprechende HTTP-Status-Code und Header gesetzt.
Zusätzlich geben wir im Header an, das wir ein JSON zurückgeben – gefolgt von der Ausgabe des $r-Arrays als formatiertes (JSON_PRETTY_PRINT) JSON.
FileMaker
Damit ein JSON an unseren kleinen Webservice gesendet werden kann, benötigt man mindestens FileMaker 16.
Das JSON holen wir hier im Beispiel aus dem Feld “json” und speichern dies in der Variablen $data.
-H 'Content-Type: application/json' --data @$data
Wir setzen den Header ( -H ), dass wir ein JSON senden.
Durch das –data Attribut übermitteln wir die Daten. Durch das vorangestellte @ weißen wir FileMaker an, den Wert für –data aus der Variabelen $data zu holen, welches unser JSON gespeichert hat.
Zusätzlich können wir noch für das Debuggen die Trace und Header setzen.
--show-error --dump-header $header --trace-ascii $trace -i -v -H 'Content-Type: application/json' --data @$data
Diese cURL-Anweisung speichern wir in den FileMaker-Variablen $curl.
Danach benötigen wir noch den Scriptschritt Aus URL einfügen
, um den Request abzusetzen.
Das PHP-Script und die FileMaker-Programmierung findet Ihr im Download.
Falls Ihr dieses PHP-Script auf eurem eigenen Webserver betreiben wollt, benötigt ihr PHP ab Version 5.6.
Download
FM cURL JSON Webserver (212,0 KiB, 2.493 hits)