REST mit java client und php server

Jigga

Bekanntes Mitglied
Hallo Community,

mir wurde für mein Vorhaben hier die Webservice Technologie ans Herz gelegt, auf die ich mich auch gleich gestürzt habe. Dabei wollte ich REST verwenden, jedoch bildeten sich bei mir nach einigen Tagen einige Gedanken-Knoten, die ich einfach nicht mehr entknoten kann.

Mein Vorhaben: Eine MySQL DB liegt auf einem kostenlosen Webserver. Ich habe eine Anwedung welche auf die DB zugreifen soll. Ein direkter externer Zugriff ist nicht möglich, deswegen die Idee ein PHP-Script zu verwenden. Hier soll dann der Webservice zum Einsatz kommen.
Ich interessiere mich besonders für das Abrufen von Daten aus der DB und die Darstellung/Verarbeitung dieser in meiner Anwedung.

Nach unzähligen Tutorials und anderen Seiten bezüglich des Themas bin ich mehr als nur verwirrt, vorallem weil ich nicht genau weiß, ob ich das ganze richtig verstanden habe.

Verständnisprobleme:
1) In meiner Java Klasse rufe ich eine PHP-Datei via
Java:
URL url = new URL("URL der PHP-Datei");
URLConnection urlC = url.openConnection();
auf, die zB. eine SELECT-Abfrage auf meiner DB ausführt, aber wie sieht die Antwort aus? Irgendwie muss die PHP-Datei ja meiner Anwedung sagen " Hier hast du das Paket mit den Daten"?
2) Wie verarbeite ich die die angekommen Daten?Sind diese einfach nur ein String in dem alle Informationen drin stehen, oder wie sieht die Antwort und dessen Verarbeitung aus?
3) In der PHP-Datei müssten ja die Zugangsdaten zur DB stehen: Was passiert, wenn jemand die URL zu der Datei herausfindet(sniffing?) und diese mit einem Editor öffnet und die Zugangsdaten einfach ausliest?

Randinfos: Diese Jersey-Geschichte würde bei mir nicht funktionieren, weil der Webserver keine Servlets betreiben kann. Deswegen "...PHP Server".


Für Hilfestellung und "Entknotung" wäre ich euch sehr dankbar.

MfG
 

Jigga

Bekanntes Mitglied
Andere Frage. PHP-Grundlagen vorhanden?

nicht wirklich. habe mir hier und da mal was angeschaut, wobei mir aufgefallen ist, dass sich das ganze teilweise gut auf java abbilden lässt,sprich dann teilweise selbsterklärend ist.
eine PHP, die prepared statements ausführt habe ich auf dieser basis bereits erfolgreich erstellen können.
 

TheDarkRose

Gesperrter Benutzer
Ok. Hoffe du verstehst wie REST arbeitet. Um eine Anfrage an eine REST-API zu stellen rufst du einfach eine normale URL mit Parametern auf, wie z.B.
Code:
http://www.example.com/api/showbla.php?param1=foo&param2=bar
. In dieser showbla.php kannst du diese GET-Paramet mit der
Code:
$_GET['paramx']
einfach verarbeiten. Die Antwort erhält der Client einfach durch Ausgeben der Ergebnisse. Natürlich muss man sich auf ein Format einigen. Oft ist es XML oder auch JSON. Also anstatt das du eine HTML-Seite generierst, gibst du formatiertes XML oder JSON aus. Ist natürlich dann nicht zum anschauen im Browser, aber dazu ist ja eine REST Schnittstelle nicht gedacht. Im Java Client kannst du diese XML oder JSON Ausgabe dann gemütlich weiterverarbeiten.

Thema Datenbankzugriff. Du schreibst die Zugriffsdaten in eine config.inc.php. Die Endung .php ist wichtig, da dadurch bei direkten Aufruf durch jemand Fremden, die Datei durch den PHP-Parser gejagt wird anstatt alles offenzulegen.
PHP:
<?php
define('MYSQL_HOST', 'localhost');
define('MYSQL_USER', 'myuser');
define('MYSQL_PASSWD', 'mypassword');
?>
Diese bindest du dann einfach in jede Seite ein und kannst die Konstanten in deinem mysql_connect verwenden. Ich habe bewusst Konstanten anstatt Variablen genommen, da Konstanten nicht durch Fehlerhafte Scripts verändert werden können.
PHP:
<?php
require_once('config.inc.php');

$con = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASSWD);

// TODO
?>
 

Jigga

Bekanntes Mitglied
na das ist doch mal was. mit dem aufruf war ich bereits soweit. (gibt es für die Variable-Übergabe mittels der URL eigentlich eine Anzahl-Begrenzung oder ähnliches?)
das mit der db-connection auslagerung ist super,ich danke dir :)

Stellt sich für mich aber immer noch die Frage, wie ich in java die Antwort "empfange".
Seitens PHP: meinst du mit "Die Antwort erhält der Client einfach durch Ausgeben der Ergebnisse" die "echo" funktion?
 

TheDarkRose

Gesperrter Benutzer
Zu java. Ja einfach mit einem HttpReader oder so. Wie wenn du ne normale Webseite einliest, nur bekommst du halt XML oder JSON Daten geliefert anstatt HTML.

Zu PHP: Ja ganz normale echo Ausgaben. Aber eben entsprechend formatiert

Achja, hier ein Link zu einer REST-API wie das ausschauen könnte: diverses:carrot_api:manual_v10 [Carrot Wiki] Nicht von den URL's verwirren lassen, hier hängt halt kein PHP sondern was andere dahinter ^^
 
N

nillehammer

Gast
Jigga hat gesagt.:
(gibt es für die Variable-Übergabe mittels der URL eigentlich eine Anzahl-Begrenzung oder ähnliches?)
Nicht wirklich. Tomcat ist aber z.B. so eingestellt, dass die Request-URL inkl. Parametern 2000 Bytes nicht übersteigen darf. Und einige Web-(Firewalls) begrenzen die Anzahl der Parameter auf 100.
 

Jigga

Bekanntes Mitglied
ich kriege gerade eine
Java:
[Fatal Error] :1:1: Content is not allowed in prolog.
 org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; Content is not allowed in prolog.
Und verstehe nicht ganz warum. Code:
Java:
URL url = new URL("...insert.php");
URLConnection uc = url.openConnection();
uc.setDoOutput(true);
OutputStream out = uc.getOutputStream();
String data = "variable";
out.write(data.getBytes());
out.flush();
DocumentBuilderFactory docFac = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuild = docFac.newDocumentBuilder();
Document doc = docBuild.parse(uc.getInputStream());

Wenn ich die Antwort aber mit folgender Methode behandle, kriege ich die werte so wieder, wie ich sie im echo definiert habe:
Java:
public String read() throws IOException {
		InputStream in = urlCon.getInputStream();
		int c = 0;
		StringBuffer incoming = new StringBuffer();
		while (c >= 0) {
			c = in.read();
			incoming.append((char) c);
		}
		return incoming.toString();
	}

Muss ich etwa in meiner php mit dem echo eine XML nachbauen? oO
 

Jigga

Bekanntes Mitglied
ich stehe gerade irgendwie auf dem schlauch,weil mein XML parser gibt mir die ganze zeit "null" ausgibt....
hier mal die .php für alle fälle (ja ist nicht sonderlich elegant,aber anders hat er mir die ganze zeit fehler um die ihren geworfen -.-)
PHP:
<?php
	$name = $_POST["name"];
	$mysqli = new mysqli();
	if ($stmt = $mysqli->prepare("SELECT * FROM test WHERE Name=?")) {
		$stmt->bind_param("s", $name);
		$stmt->execute();		
		$stmt->bind_result($guy, $reporter, $link, $section);
		while($stmt->fetch()) {
			$newxml = '<?xml version="1.0"?>';
			$newxml .= "<request>
			<name>$guy</name>
      <reporter>$reporter</reporter>
      <link>$link</link>
      <section>$section</section>
      </request> ";
			echo $newxml;
		}
		$stmt->close();
	}
	$mysqli->close();
?>

meine methode zum abfragen der daten:

Java:
try {
			URL url = new URL(
					"insert.php");
			URLConnection uc = url.openConnection();
			uc.setDoOutput(true);
			OutputStream out = uc.getOutputStream();
			String data = "name=banGuy";
			out.write(data.getBytes());
			out.flush();
			InputStream is = uc.getInputStream();
			Document d = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(is);
			Element e = d.getDocumentElement();
			System.out.print( e );
		} catch (NullPointerException e) {
			e.printStackTrace();
		} catch (MalformedURLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SAXException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ParserConfigurationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
was mache ich falsch? :/


EDIT: habe gerade das XML aus einem String generieren lassen,sprich erst die empfangenen Daten in String umgewandelt und dann xml daras gemacht.aber an die werte komme ich immer noch nicht dran ....


EDIT2: ok mit folgendem anhang an die XML-lese-Methode kann ich an die Werte rankommen:

Java:
XPathFactory factory = XPathFactory.newInstance();
			XPath xpath = factory.newXPath();
			XPathExpression expr = xpath
					.compile("/request/af");
			String name = (String) expr.evaluate(doc, XPathConstants.STRING);
			System.out.println(name);

nur stellt sich mir jetzt die Frage,warum ich im echo der PHP nicht einfach sowas mache wie "var1=key1;var2=key2;var3=key3;..."
und dies mit einem strinktokenizer oder sowas auseinander pflücke?sehe gerade den vorteil der XML geschichte nicht ???:L
 
Zuletzt bearbeitet:

TheDarkRose

Gesperrter Benutzer
nur stellt sich mir jetzt die Frage,warum ich im echo der PHP nicht einfach sowas mache wie "var1=key1;var2=key2;var3=key3;..."
und dies mit einem strinktokenizer oder sowas auseinander pflücke?sehe gerade den vorteil der XML geschichte nicht ???:L

Naja, weil sowas total unschön ist und keiner Konvention im Endeffekt folgt. Aber du könntest auch JSON verwenden.
 
T

tuxedo

Gast

Jigga

Bekanntes Mitglied
Interessantes Projekt. So eins, oder auch evtl genau dieses hatte ich bereits im Netz gefunden.
Der Nachteil dabei ist aber, dass die DB Zugangsdaten im Quellcode stehen..
 
T

tuxedo

Gast
Wo ist das Problem? Hat man mit JDBC eigentlich immer.

Passwort kannst du in der PHP File hardcodieren wenn du unbedingt willst. Ist ja OpenSource :)

Gruß
Alex
 

Jigga

Bekanntes Mitglied
So wie ich es verstehe, meint er damit die DB-Zugangangsdaten: Diese in einer PHP-Datei speichern, aber den DB-Zugang ansich beim Client realisieren.
Stellt sich aber mir jetzt die Frage, inwiefern das sinnvoll ist. Da man ja auf die PHP-Datei, wenn man deren Verlinkung aus dem Quellcode erst hat, frei zugreifen kann. Damit wäre ein voller Zugriff auf die DB möglich??

Generelle Frage: Wie sicher ist denn meine DB vor Angriffen Dritter auf einem kostenlosen Webspace? Ich habe derzeit nur PHP-Dateien die etwas in die DB schreiben bzw Zeilen ändern (prepared statements). Die Zugangsdaten sind in einer seperaten PHP ausgelagert.
Prinzipiell geht es mir darum, dass meine Daten nicht gelöscht werden können.
 

TheDarkRose

Gesperrter Benutzer
Solange du die Logik in den PHP Webservice hast und der Client i.E. dumm ist, eigentlich relativ sicher. Was noch angebracht wäre ist eben Zugriffsschutz. OAuth z.b.
 
T

tuxedo

Gast
So wie ich es verstehe, meint er damit die DB-Zugangangsdaten: Diese in einer PHP-Datei speichern, aber den DB-Zugang ansich beim Client realisieren.
Stellt sich aber mir jetzt die Frage, inwiefern das sinnvoll ist. Da man ja auf die PHP-Datei, wenn man deren Verlinkung aus dem Quellcode erst hat, frei zugreifen kann. Damit wäre ein voller Zugriff auf die DB möglich??

An die PHP Datei mit den Zugangsdaten kommst du als aussenstehender nur dann wenn:

* Du Zugriff auf die PHP Datei vor der Evaluierung durch den PHP-Interpreter hast
* Das Passwort irgendwohin übertragen, und diese Übertragung abgefangen wird

Beides wäre mit meinem Ansatz nicht der Fall.
Und wenn einem das noch zu unsicher ist: jPMdbc kann auch https.

Aber den REST Ansatz finde ich eigentlich auch ganz interessant. Ist halt mehr SOA als mein JDBC Ansatz.

- Alex
 

Jigga

Bekanntes Mitglied
Die logik ansich ist nur in den PHP-Dateien, sprich auf dem Server. Mich würde noch interessieren wie das ganze in Wireshark aussieht. Lässt sich da die Ziel-URL rauslesen?Oder generell, falls jemand meine exe/jar entpackt und an die URLs zu den PHPs gelangt: kann er dann irgendwie an die Zugangsdaten der DB kommen? (wie erwähnt sind diese in einer externen PHP)
 

TheDarkRose

Gesperrter Benutzer
Das was mich an jPMdbc ist, das die Logik wieder komplett im Client sein muss. Was beim SOA Ansatz nicht der Fall ist. Dort ist die Logik komplett im Webservice selbst. Der Client ruft dann nur mehr die entsprechenden Webservice Methoden auf, ist aber sonst nur dumm, bzw. für die GUI Darstellung zuständig. Bringt auch unter anderem weitere Vorteile, das man nicht auf einen Client beschränkt ist, sondern auch Android/iOS Apps einfach anbinden kann, oder auch die API Drittanbietern zur Verfügung stellen kann, ohne die Logik mehrfach implementieren zu müssen.
 

TheDarkRose

Gesperrter Benutzer
Die logik ansich ist nur in den PHP-Dateien, sprich auf dem Server. Mich würde noch interessieren wie das ganze in Wireshark aussieht. Lässt sich da die Ziel-URL rauslesen?Oder generell, falls jemand meine exe/jar entpackt und an die URLs zu den PHPs gelangt: kann er dann irgendwie an die Zugangsdaten der DB kommen? (wie erwähnt sind diese in einer externen PHP)

Nein, alles was in den PHP Dateien steht, darauf hat keiner Zugriff. Solange halt alles durch den Intepreter selbst gejagt wird. auf die Ausgaben, sofern keine Zugriffsschutz erfolgt hat halt jeder Zugriff. Also sowas wie OAuth solltest du schon implementieren. und HTTPS wäre eigentlich Pflicht, das schon mal keiner mitschneiden kann.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B REST - es gibt eine REST API, wie mache ich nun in JAVA weiter? SOA 8
sascha-sphw Statuscode REST Response DELETE SOA 2
B Authentication & Authorization REST API SOA 43
mrBrown Rest - Bilder mit Metadaten modellieren SOA 24
OnDemand REST Client Aufbau SOA 7
D POST-Request mit Chrome Rest Client wirft Fehler : HTTP Status 415 - Cannot consume content type SOA 3
Shams Was ist ein "Deployment" bei Rest? SOA 1
M HTTP 400 Feher bei REST Web Service durch POST per FormParam SOA 3
M Kann man das Protokoll eines REST (Jersey) bzw. SOAP Web Services manipulieren? SOA 5
P REST POST -> return SOA 4
G WebServices REST SOA 5
H [REST] Deserialisierung eines Object-Feldes SOA 6
G Rest und Sicherheit SOA 3
J Berechtigungen bei REST SOA 2
G Rest - Session Handling SOA 3
C REST Webservices, XML Ausgabe und Objektübertragung SOA 2
F REST Service mit Netbeans und MySQL Datenbank SOA 1
D Sicherheit bei REST-Webservice SOA 19
M Sicherer REST-Service SOA 2
K Vortrag über REST SOA 5
T Hat AXIS2 noch Zukunft und wie REST implementieren? SOA 6
T Rest Webservice der 2 verschiedene XML Objekte(JaxB) entgegennimmt SOA 10
J SOA WebService JAX-WS Java-Klasse per wsimport generieren lassen SOA 3
D [SOAP] wsdl & maven & java 1.8 SOA 6
S Java EE 7 Tutorial unvollständig? SOA 0
M JAVA Webservice Währungsrechner DRINGEND Hilfe SOA 1
P Java Webservice mit JWS Bindingnamen customizen SOA 4
G WSDL Java C# SOA 8
E Webservice durch Java ansprechen SOA 7
T Mehrdimensionale Objekte in WebServices für Nicht-Java SOA 4
A PHP WebService aus Java aufrufen SOA 2
E wsdl into Java-Klassen Maven-Plugin SOA 2
N Java -> WSDL char mit max-Length SOA 5
C Problem mit Java Webservice - SOAPBinding.Style - Wrapper class fehlt SOA 1
T Krankes Vorhaben: Von VB auf Java Webservice SOA 10
G Webservice mit Java aufrufen SOA 2
O brauche hilfe bei java/webservice geschichte SOA 29
N Web Services Client aus externen WebService erstellen SOA 4
M Web Services Client erstellen: Grundlegende Starthilfe SOA 2
G Apache-CXF Client am public key erkennen SOA 0
F Client Problem gegen Webservice SOA 3
M Webservice Client erstellen und XML Request senden SOA 3
K Axis2 SOAP Logging via Client SOA 2
G WebService, was darf der Client alles sehen SOA 19
S Axis2 Fault - Wie im Client auslesen? SOA 6
G OpenLigaDB Webservice Client SOA 4
N JAX-WS Client Timeout Problem SOA 4
H WS-Client geht nur wenn JBoss läuft SOA 4
S Webservice-Client-Klasse gibt immer null zurück SOA 3
R Wie verschicke ich serverseitig eine Nachricht an client SOA 2
R XML verschicken mit Webservice Server Client SOA 2
boxi Axis1 Client: loggen der requests und Response SOA 8

Ähnliche Java Themen

Neue Themen


Oben