Daten von Rest API in Datenbank?

4 Antworten

Welche Datenbank? In welcher Form sollen die Daten gespeichert werden? In welcher Form liefert die API die Daten?


Elton971 
Fragesteller
 25.05.2020, 11:25

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

0
KuarThePirat  25.05.2020, 11:53
@Elton971

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.

2

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.


Elton971 
Fragesteller
 25.05.2020, 12:10

Weil sich die Daten ständig aktualisieren sonst würde ich das nicht fragen

0

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.


Elton971 
Fragesteller
 25.05.2020, 17:04

Ich möchte sozusagen die Daten auslesen und zur Datenbank schicken

0

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.

Woher ich das weiß:Studium / Ausbildung – Informatikstudium

Elton971 
Fragesteller
 25.05.2020, 11:08

Das Problem besteht darin wie ich das in einem shell script oder in einem anderen schreibe

0
triopasi  25.05.2020, 11:09
@Elton971

In z.B. Python sind das wahrscheinlich nur ein paar Zeilen.

Ansonsten kannst du das auch in jeder anderen Sprache schreiben die du halt kannst.

1
Elton971 
Fragesteller
 25.05.2020, 11:12
@triopasi

Mit Python kenne ich mich halt überhaupt nicht aus gibts dazu irgendwo ein Codebeispiel, wobei mir ein shell script lieber wäre

0
triopasi  25.05.2020, 11:15
@Elton971

Irgendwo kommt dann halt doch wieder eigenes Wissen rein. Und Google.

Schreibe es in irgendeiner Sprache die du kannst. Beispiele wie man eine einfache API vie HTTP(S) anspricht oder in eine DB schreibt gibt es im Internet tausende.

2
Elton971 
Fragesteller
 25.05.2020, 11:27
@triopasi

Ich habe mal ein script mit python gesucht jedoch finde ich nichts passendes

0
triopasi  25.05.2020, 11:30
@Elton971

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

1
triopasi  25.05.2020, 12:25
@Elton971

Kann funktionieren, muss aber nicht. file_get_contents() funktioniert oft nicht wenn man auf andere Domains zugreift.

Und ja, man kann PHP Script auch über die Konsole ausführen, auch als cronjob.

1
Elton971 
Fragesteller
 25.05.2020, 16:26
@triopasi

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?

0
triopasi  25.05.2020, 16:31
@Elton971

Keine Ahnung. WAS funktioniert denn daran nicht? Fehlermeldung?

1
triopasi  25.05.2020, 16:36
@Elton971

Dann schau doch mal deine Daten an und dann das IF welches diese Fehlermeldung auslöst..

1
triopasi  25.05.2020, 17:29
@Elton971

Doch, deine Daten von der API sehen doch ganz anders aus als du prüfst. "Name" ist in den Daten kein Array, du setzt das aber voraus. Natürlich kann das nicht funktionieren.

0
Elton971 
Fragesteller
 25.05.2020, 17:33
@triopasi

Ja was muss ich dann hinschreiben wenn ich den namen abspeichern möchte

0
triopasi  25.05.2020, 17:36
@Elton971

Es geht um die Prüfung deiner Daten. Das was den Fehler erzeugt. Das hat nichts mit irgendwas abspeichern zu tun.

0
Elton971 
Fragesteller
 25.05.2020, 17:45
@triopasi

laut der aussage ist je der parameter den ich angegeben habe falsch

0
Elton971 
Fragesteller
 26.05.2020, 15:24
@triopasi
<?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?

0
triopasi  26.05.2020, 16:39
@Elton971

Ja du insertest ja immer neu. Natürlich wird das alles wieder in die DB geschrieben.

0