Daten von Rest API in Datenbank?
Hallo,
Gibt es irgendeine Möglichkeit die Daten einer rest api in die Datenbank zu speichern. Es sollte immer nach einer gewissen Zeit die Daten in der Datenbank aktualisieren da könnte ich mir vorstellen, dass dies mit einem Crontab geht.
Wenn möglich ein Codebeispiel
4 Antworten
Welche Datenbank? In welcher Form sollen die Daten gespeichert werden? In welcher Form liefert die API die Daten?
Dann wäre die Vorgehensweise mit curl die API abzurufen und den JSON-String in einer temporären Datei abzulegen.
curl https://api.truckyapp.com/v2/traffic/servers > tmp
Anschließend verarbeitet man diese Datei mit jq, einem Kommandozeilen-Tool für JSON-Daten.
NAME=$(cat tmp|jq -r '.response[0].name')
Damit lese ich aus response den ersten Eintrag (.response[0]) und dort dann den Eintrag name und weise dem einer Variablen zu.
Das muss ich dann mit dem mysql Kommandozeilen-Tool nur noch in die Datenbank schreiben.
Warum schreibst du die Daten nicht direkt in eine Datenbank? Dafür sind diese gedacht und falls man das nicht macht kann es sehr leicht zu einem Datenverlust kommen.
Weil sich die Daten ständig aktualisieren sonst würde ich das nicht fragen
Willst du die Daten von einer API lesen, oder hast du eine API wo Daten hingeschickt werden? Könnte beides bedeuten.
In nodejs machen mir APIs Spaß. Also sowohl benutzen als auch anbieten kannst du eine API damit. Damit kannst du auch easy in eine SQL oder noSql Datenbank schreiben.
Aber auch in Python oder so kein Ding.
Ich möchte sozusagen die Daten auslesen und zur Datenbank schicken
Und worin besteht das Problem?
Schreibe dir ein Script welches die Daten von der API holt und in deine DB schreibt. Das Script kannst du dann per Cron Job regelmäßig laufen lassen.
Das Problem besteht darin wie ich das in einem shell script oder in einem anderen schreibe
Natürlich gibt es nichts was 100% genau das macht was du willst.
Aber gegeben eine API die per HTTP GET ein JSON Objekt zurückgibt, da sollte sich etwas finden lassen.
Dann die Daten in einen pandas-Dataframe packen, den kann man mit 3 Zeilen Code in eine DB schreiben. Gibt es auch haufenweise Beispiele zu. (Woher ich das weiß? Habe das vor 2 Wochen selbst gebraucht. Gab genug Beispiele.)
https://www.webslesson.info/2016/04/get-multiple-json-data-insert-into-mysql-database-in-php.html Würde das gehen? Also wenn ich dann bei $filename den url eintrage und die parameter anpasse und geht dann überhaupt das mit dem cronjob
Also ich habe jetzt etwas gefunden, jedoch funktioniert das nicht ganz.
<?php
$data = json_decode( file_get_contents('https://api.truckyapp.com/v2/traffic/servers'), true, 5, JSON_BIGINT_AS_STRING ) ;
if ( !$data ) {
die('something went wrong with the JSON data');
}
else if ( !isset($data['response']) || !isset($data['response']['name'], $data['response']['name']) || !is_array($data['response']['name']) ) {
die('unexpected JSON format');
}
else {
// connect to the database
// see http://docs.php.net/pdo.construct
// and ht
tp://docs.php.net/ref.pdo-mysql.connection
$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', '', array(
PDO::ATTR_EMULATE_PREPARES=>false,
PDO::MYSQL_ATTR_DIRECT_QUERY=>false,
PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION
));
// this will create a (temporary) table, that fits the INSERT statement for this example
setup($pdo);
// prepare a statement with two parameters
// see ht
tp://docs.php.net/pdo.prepared-statements
$stmt = $pdo->prepare('INSERT INTO test (`name`) VALUES ( :pit, :measurement )');
$stmt->bindParam(':pit', $pit);
$stmt->bindParam(':measurement', $measurement);
// when the statement is executed the values that are "in" $pit and $measurement at that moment will be used where the placeholders :pit and :measurement were placed in the statement.
$date = $data['response']['name']; // won't be using this ....
foreach( $data['response']['name'] as $mp ) {
// ? mp[1] <-> measurement reading failed?
// skip those entries that do not have a value in $mp[1]
// you might want to insert those anyway ....but I don't ;-)
if ( !is_null($mp[1]) ) {
$mp[0] = gmdate('Y-m-d H:i:s', substr($mp[0], 0, -3));
// assign the values to the parameters bound to the statement
list($pit, $measurement) = $mp;
// execute the statement (with those parameters)
$stmt->execute();
}
}
// now let's see what is in the table
foreach( $pdo->query('SELECT id,`name` FROM test ORDER BY id', PDO::FETCH_ASSOC) as $row ) {
echo join(', ', $row), "\r\n";
}
}
Weist du was da falsch ist?
<?php
error_reporting(E_ALL);
ini_set('display_errors', true);
$dbname='test';
$json_datei='https://api.truckyapp.com/v2/traffic/servers';
$mysqli=mysqli_connect('localhost', 'root', '', '');
if (mysqli_connect_errno()) die ("Connect failed: " . mysqli_connect_error());
mysqli_set_charset($mysqli, "utf8");
$query = "INSERT INTO `$dbname` (`name`, `url`, `short`, `game`)
VALUES ('%s','%s','%s', '%s')";
$json = json_decode(file_get_contents($json_datei),true);
$queries = array();
foreach ($json['response'] as $data){
$name=mysqli_real_escape_string($mysqli, $data['name']);
$url=mysqli_real_escape_string($mysqli, $data['url']);
$short=mysqli_real_escape_string($mysqli, $data['short']);
$game=mysqli_real_escape_string($mysqli, $data['game']);
$queries[] = sprintf($query, $name, $url, $short, $game);
}
$menge=count($queries);
if (mysqli_multi_query($mysqli, implode(";", $queries))){
echo "$menge Datensätze erfolgreich importiert<br>";
}else{
echo "Irgendwelche errors<br>";
}
echo "";
$mysqli->close();
?>
Also ich habe hier nun ein skript habe es nur noch nicht mit dem cornjob ausprobiert, weil es immer die sachen mehrmals importiert also stehen die Sachen z.B. zweimal in der Datenbank wenn man die Seite reloadet. Weist du was das problem ist?
Wenn wir jetzt z.B. nehmen diese https://api.truckyapp.com/v2/traffic/servers api dann soll zum Beispiel dieser https://prnt.sc/snag52 Name in PHPmyadmin gespeichert werden