REST-Schnittstelle

Hallo Oxid Community,

wir sind Studenten der Hochschule Offenburg und benötigen Hilfe zur Integration von Produkten und Import von Kunden via REST-Schnittstelle. Wie bekommen wir externe Daten via REST-Schnittstelle in unsere Datenbank? Eventuell mit PHP?

Die Adresse lautet: http://student.mi.hs-offenburg.de:8080/sqlrest (nur über Hochschule-VPN erreichbar). Diese Daten (siehe Anhang) sollen einmalig in unsere eigene Datenbank importiert werden.

Gruß
Nico

aktuell ist mir keine REST-API für den OXIDShop bekannt

es gab mal ein Projekt aus der Community “admin 2.0” der eine solche bekommen sollte, das ist aber aufgrund akutem Zeitmangel eingeschlafen

letzter Stand ist hier zu finden:

Hallo,

wollt ihr laufend Abgleichen und benötigt dafür REST oder geht es um einen einmaligen Import?

Einen REST-Service speziell zu bauen ist nicht so schwierig. Komplex wird es ja erst, wenn man das generisch lösen möchte, wie beim Admin2.0.

Gruß Joscha

Es geht um einen einmaligen Import.

…dann baut euch nen einfachen Importer. Ggf. sogar außerhalb des Frameworks.

Genau das ist das Problem :wink: Gibt es irgendwo Anleitungen dazu bzw. kannst du uns sagen, wie es funktioniert?

Schau mal hier, da gibts was:

Was ihr wollt ist ja einfach ein paar Daten in die DB zu schreiben. Schaut euch das Schema von OXID an und dann frisch frei ans Werk.

Gruß Joscha

Meine xml-Datei sieht jetzt wie folgt aus:

<?xml version=“1.0” encoding=“utf-8”?>

<pma_xml_export version=“1.0” xmlns:pma=“http://www.phpmyadmin.net/some_doc_url/”>
<database name=“eb_apps_15”>
<!-- Tabelle oxarticles -->
<table name=“oxarticles”>
<column name=“OXARTNUM”>0</column>
<column name=“OXTITLE”>Football</column>
<column name=“OXPRICE”>22.5</column>
</table>
</database>
</pma_xml_export>

Ist es möglich, die 50 Produkte mit einer Schleife direkt von http://student.mi.hs-offenburg.de:8080/sqlrest/PRODUCT/0 - http://student.mi.hs-offenburg.de:8080/sqlrest/PRODUCT/49 zu bekommen, damit ich nicht "händisch"alle 50 eintragen muss?

Hi,

kann man nicht einfach so etwas machen?

Gruß

Jupp, das sollte gehen. Sieht ja soa aus, als ob local auch ein OXID läuft.

Gruß Joscha

Ich habe jetzt mal folgendes erstellt. Auslesen funktioniert auch alles. Das Problem muss nur noch bei $result = mysqli_query($con, “INSERT INTO…” liegen. Findet ihr den Fehler? Die Daten werden nicht in die Datenbank geschrieben!

<?php

require_once dirname(FILE) . “/bootstrap.php”;

//Shop starten
$url_request = ‘http://student.mi.hs-offenburg.de:8080/sqlrest/CUSTOMER’;
$response = file_get_contents($url_request);

$xmldat = simplexml_load_string($response);

$con=mysqli_connect(“localhost”,“","","******”");

// Connection überprüfen
if (mysqli_connect_errno())
{
echo "Failed to connect to MySQL: " . mysqli_connect_error();
}

foreach ($xmldat->CUSTOMER as $entry)
{
$tmp_url = $url_request."/".$entry;
$tmp_response = file_get_contents($tmp_url);
$tmp_xmldat = simplexml_load_string($tmp_response);

$ID = $tmp_xmldat-&gt;ID;
$FIRST = $tmp_xmldat-&gt;FIRSTNAME;
$LAST = $tmp_xmldat-&gt;LASTNAME;
$STREET = $tmp_xmldat-&gt;STREET;
$CITY = $tmp_xmldat-&gt;CITY;

$result = mysqli_query($con, "INSERT INTO 'oxuser' (OXCUSTNR, OXFNAME, OXLNAME,OXSTREET,OXCITY) VALUES (NULL, '$FIRST','$LAST', '$STREET', '$CITY')");

}
mysqli_close($con);
Oxid::run();

schreib den Code zwischen die PHP-Tags, dann liest es sich leichter:
(oder markier den Code und klick oben rechts aufs PHP-Symbol)

<?php

 require_once dirname(__FILE__) . "/bootstrap.php";

 //Shop starten
 $url_request = 'http://student.mi.hs-offenburg.de:8080/sqlrest/CUSTOMER';
 $response = file_get_contents($url_request);

 $xmldat = simplexml_load_string($response);

 $con=mysqli_connect("localhost","eb_apps_15","YlDT HDDzccqM","eb_apps_15");

 // Connection überprüfen
 if (mysqli_connect_errno())
 {
 echo "Failed to connect to MySQL: " . mysqli_connect_error();
 }

 foreach ($xmldat->CUSTOMER as $entry)
 {
 $tmp_url = $url_request."/".$entry;
 $tmp_response = file_get_contents($tmp_url);
 $tmp_xmldat = simplexml_load_string($tmp_response);

 $ID = $tmp_xmldat->ID;
 $FIRST = $tmp_xmldat->FIRSTNAME;
 $LAST = $tmp_xmldat->LASTNAME;
 $STREET = $tmp_xmldat->STREET;
 $CITY = $tmp_xmldat->CITY;

 $result = mysqli_query($con, "INSERT INTO 'oxuser' (OXCUSTNR, OXFNAME, OXLNAME,OXSTREET,OXCITY) VALUES (NULL, '$FIRST','$LAST', '$STREET', '$CITY')");

 }
 mysqli_close($con);
 Oxid::run();

<?php

require_once dirname(FILE) . “/bootstrap.php”;

//Shop starten
$url_requestPRODUCT = ‘http://student.mi.hs-offenburg.de:8080/sqlrest/PRODUCT’;
$responsePRODUCT = file_get_contents($url_requestPRODUCT);
$xmldatPRODUCT = simplexml_load_string($responsePRODUCT);

$url_requestCUSTOMER = ‘http://student.mi.hs-offenburg.de:8080/sqlrest/CUSTOMER’;
$responseCUSTOMER = file_get_contents($url_requestCUSTOMER);
$xmldatCUSTOMER = simplexml_load_string($responseCUSTOMER);

$con=mysqli_connect(“localhost”,“eb_apps_15”,“YlDTHDDzccqM”,“eb_apps_15”);

// Connection überprüfen
if (mysqli_connect_errno())
{
echo "Failed to connect to MySQL: " . mysqli_connect_error();
}

foreach ($xmldatPRODUCT->PRODUCT as $entry)
{
$tmp_urlPRODUCT = $url_requestPRODUCT."/".$entry;
$tmp_responsePRODUCT = file_get_contents($tmp_urlPRODUCT);
$xmldatPRODUCT = simplexml_load_string($tmp_responsePRODUCT);

$ID = $tmp_xmldat-&gt;ID; 	
$NAME = $tmp_xmldat-&gt;NAME; 	
$PRICE = $tmp_xmldat-&gt;PRICE; 	
	
$resultPRODUCT = mysqli_query($con, "INSERT INTO oxarticles (OXARTNUM, OXTITLE, OXPRICE) VALUES ('$ID', '$NAME','$PRICE')"); 

}
foreach ($xmldatCUSTOMER->CUSTOMER as $entry)
{
$tmp_urlCUSTOMER = $url_requestCUSTOMER."/".$entry;
$tmp_responseCUSTOMER = file_get_contents($tmp_urlCUSTOMER);
$xmldatCUSTOMER = simplexml_load_string($tmp_responseCUSTOMER);

$ID = $tmp_xmldat-&gt;ID; 	
$FNAME = $tmp_xmldat-&gt;FIRSTNAME; 	
$LNAME = $tmp_xmldat-&gt;LASTNAME; 	
$STREET = $tmp_xmldat-&gt;STREET; 	
$CITY = $tmp_xmldat-&gt;CITY; 	
	
$resultCUSTOMER = mysqli_query($con, "INSERT INTO oxuser (OXCUSTNR, OXFNAME, OXLNAME, OXSTREET, OXCITY) VALUES ('$ID', '$FNAME','$LNAME','$STREET','$CITY')"); 

}
mysqli_close($con);

Oxid::run();
?>

Mittlerweile wird immer das erste Produkt bzw. der erste Kunde in die Datenbank geschrieben. Wo liegt der Fehler?

<?php

require_once dirname(__FILE__) . "/bootstrap.php";

//Shop starten
$url_requestPRODUCT = 'http://student.mi.hs-offenburg.de:8080/sqlrest/PRODUCT';
$responsePRODUCT = file_get_contents($url_requestPRODUCT);
$xmldatPRODUCT = simplexml_load_string($responsePRODUCT);

$url_requestCUSTOMER = 'http://student.mi.hs-offenburg.de:8080/sqlrest/CUSTOMER';
$responseCUSTOMER = file_get_contents($url_requestCUSTOMER);
$xmldatCUSTOMER = simplexml_load_string($responseCUSTOMER);

$con=mysqli_connect("localhost","eb_apps_15","YlDTHDDzccqM","eb_apps_15");

// Connection überprüfen
if (mysqli_connect_errno())
{
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
}

foreach ($xmldatPRODUCT->PRODUCT as $entry)
{
	$tmp_urlPRODUCT = $url_requestPRODUCT."/".$entry;
	$tmp_responsePRODUCT = file_get_contents($tmp_urlPRODUCT);
	$xmldatPRODUCT = simplexml_load_string($tmp_responsePRODUCT);
		
	$ID = $tmp_xmldat->ID; 	
	$NAME = $tmp_xmldat->NAME; 	
	$PRICE = $tmp_xmldat->PRICE; 	
		
	$resultPRODUCT = mysqli_query($con, "INSERT INTO oxarticles (OXARTNUM, OXTITLE, OXPRICE) VALUES ('$ID', '$NAME','$PRICE')"); 
	
}
foreach ($xmldatCUSTOMER->CUSTOMER as $entry)
{
	$tmp_urlCUSTOMER = $url_requestCUSTOMER."/".$entry;
	$tmp_responseCUSTOMER = file_get_contents($tmp_urlCUSTOMER);
	$xmldatCUSTOMER = simplexml_load_string($tmp_responseCUSTOMER);
		
	$ID = $tmp_xmldat->ID; 	
	$FNAME = $tmp_xmldat->FIRSTNAME; 	
	$LNAME = $tmp_xmldat->LASTNAME; 	
	$STREET = $tmp_xmldat->STREET; 	
	$CITY = $tmp_xmldat->CITY; 	
		
	$resultCUSTOMER = mysqli_query($con, "INSERT INTO oxuser (OXCUSTNR, OXFNAME, OXLNAME, OXSTREET, OXCITY) VALUES ('$ID', '$FNAME','$LNAME','$STREET','$CITY')"); 
}
mysqli_close($con);

Oxid::run();

Mittlerweile wird immer das erste Produkt bzw. der erste Kunde in die Datenbank importiert. Wo liegt der Fehler? Wenn ich den Code mit echo ausgebe, wird alles angezeigt…

Laß dir mal eventuelle Fehler der Datenbank ausgeben


$resultCUSTOMER = mysqli_query($con, "INSERT INTO oxuser (OXCUSTNR, OXFNAME, OXLNAME, OXSTREET, OXCITY) VALUES ('$ID', '$FNAME','$LNAME','$STREET','$CITY')");  

if (!$resultCUSTOMER) { echo mysqli_error($con); }

Haben das Problem gelöst! PHP-Code war soweit richtig. Das Problem lag in der Oxid-Datenbank-Struktur. In der Datenbank sind Pflichtfelder vorhanden gewesen, die mit dem Import nicht gefüllt werden konnten!