Android POST String zu Xampp

  • 11 Antworten
  • Letztes Antwortdatum
H

hopen160

Neues Mitglied
0
Hallo liebe Community,

ich habe schon alle möglichen Threads durchgesucht, doch leider habe ich keine Lösung zu meinem Problem finden können.

Ich habe eine App gebaut, mit der ich über ein EditText Feld einen String eingeben kann. Diese Variable wird in einen NameValuePair (ArrayList) gepackt und anschließend über http auf eine angegebene, interne IP (xampp) geschickt.
Das Testen läuft über ein angeschlossenes Android Handy, welches sich auch im gleichen, lokalen WLAN befindet, wie das Netbook wo der Xampp Apache mit der index.php File läuft. Diese index.php soll erst einmal die Variable aufnehmen und per echo-Befehl ausgeben. (später kommen da noch mySQL Befehle hinzu.)

Doch an dieser Stelle scheitert es einfach. Die Variable wird einfach nicht auf der Webseite angezeigt. Ich kann aber auch leider nicht sagen, ob es an dem Java Code liegt oder an der PHP Datei...
Habe zu Testzwecken auch auf dem Xampp Rechner die Firewall ausgemacht, weil ich dachte, dass vielleicht der Port falsch ist.
Leider weiß ich nun nicht mehr weiter.

Wäre super cool, wenn mir jemand einen Hint geben könnte :o

Viele Grüße
Tobi

Hier der Java Android App Code

Code:
package com.example.triathlonsportlercheck;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import android.app.Activity;
import android.content.Context;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.inputmethod.InputMethodManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.Toast;

public class MainActivity extends Activity implements OnClickListener {

	private EditText value;
	private Button submitButton;
	private ProgressBar uploadsign;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		value = (EditText) findViewById(R.id.editText1);
		submitButton = (Button) findViewById(R.id.button1);
		uploadsign = (ProgressBar) findViewById(R.id.progressBar1);
		uploadsign.setVisibility(View.GONE);
		submitButton.setOnClickListener(this);
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

	public void onClick(View v) {
		// TODO Auto-generated method stub
		if (value.getText().toString().length() < 1) {

			// Toast, falls nichts eingegeben wird
			Toast.makeText(this, getText(R.string.outOfBounds),
					Toast.LENGTH_LONG).show();
		} else {
			uploadsign.setVisibility(View.VISIBLE);
			new MyAsyncTask().execute(value.getText().toString());
		}

		// Textfeld nach dem Hochladen auf dem Server wieder leeren
		value.setText("");
	}

	private class MyAsyncTask extends AsyncTask<String, Integer, Double> {

		@Override
		protected Double doInBackground(String... urls) {
			// TODO Auto-generated method stub
			postData(urls[0]);
			return null;
		}

		protected void onPostExecute(Double result) {
			uploadsign.setVisibility(View.GONE);
			Toast.makeText(getApplicationContext(), getText(R.string.toast),
					Toast.LENGTH_LONG).show();
		}

		protected void onProgressUpdate(Integer... progress) {
			uploadsign.setProgress(progress[0]);
		}

		public void postData(String sportlerID) {
			sportlerID = value.getText().toString();
			InputMethodManager inputManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);

			inputManager.hideSoftInputFromWindow(getCurrentFocus()
					.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);

			// HTTP Client und Header initialisieren
			HttpClient httpclient = new DefaultHttpClient();
			HttpPost httppost = new HttpPost(
					"http://192.168.0.2:80/triathlon/index.php");

			try {

				// Wert des Textfeldes in einem Array-Pair hochladen
				// "myHTttpData" ist das Objekt in dem der Wert gespeichert wird
				// und im PHP Script auf dem
				// Server ausgelesen wird
				List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
				nameValuePairs.add(new BasicNameValuePair("sportlerID",
						sportlerID));

				httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

				// Execute HTTP Post Request

				HttpResponse response = httpclient.execute(httppost);

			} catch (ClientProtocolException e) {
				Log.e("log_tag", "Error in http connection" + e.toString());
			} catch (IOException e) {
				// TODO Auto-generated catch block
			}

		}

	}
}

Hier die Layout XML

HTML:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
 
    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="20dp"
        android:text="@string/sportIDInfoText"
        android:textAppearance="?android:attr/textAppearanceLarge" />
 
    <EditText
        android:id="@+id/editText1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/textView1"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="30dp"
        android:ems="10"
        android:hint=""
        android:inputType="number"
        >
 
        <requestFocus />
    </EditText>
 
    <ProgressBar
        android:id="@+id/progressBar1"
        style="?android:attr/progressBarStyleLarge"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/editText1"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="24dp" />

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/progressBar1"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="32dp"
        android:text="@string/sqlSubmit" />
 
</RelativeLayout>

Und hier das Mini PHP Schnipsel

PHP:
<?php
   if(isset($GLOBALS['sportlerID']) == true) {
    echo $GLOBALS['sportlerID'];
    }else{
             echo "nicht initialisiert";
            }
?>
 
Ich bin kein PHP Experte aber müsstest du nicht statt GLOBALS die _POST Variable auswerten?
 
mmh, hatte auch mit _POST probiert, aber leider auch ohne Erfolg.
Ich habe so das Gefühl, dass es an der IP des Xampp Apache Servers liegen könnte...
Habe ja ein lokales Netzt eingerichtet. Das Netbook mit dem Xampp ist per Ethernet direkt am Router. Das Android Handy greift per WLan auf das Netzwerk zu.
Habe als IP Adresse die IP des Netbooks genommen. Vlt scheint das aber auch falsch zu sein...
Oder irgendwas im Java Code scheint nicht zu stimmen.
Bekomme über Logcat aber auch keine vernünftigen Infos dazu...
 
hopen160 schrieb:
Doch an dieser Stelle scheitert es einfach. Die Variable wird einfach nicht auf der Webseite angezeigt.

was heisst denn "auf der Webseite"? Wenn du den POST per Java aufrufst, erhält natürlich auch die App die Antwort, nicht eine Webseite. (Meine Aussage beruht momentan hauptsächlich darauf, dass du in deinem geposteten Java-Code keine Auswertung der Antwort vom Server machst ;) Die Antwort vom Server ist natürlich eine Webseite, nur wird diese nicht in einem Browser angezeigt)
 
Das verstehe ich nicht ganz^^ Also ein Response wird nicht ausgegeben, weil in der Android App keine Response vom Server benötigt wird. Dazu habe ich einfach einen Toast der ausgibt, dass Sie hochgeladen wurde.
Ich möchte, dass die Variable, die per POST Befehl an den Server geschickt wird, im Browser des Netbooks zu sehen ist, wenn ich dort die Webseite localhost/triathlon/index.php aufrufe, denn dorthin wird die Variable ja geschickt und in der index.php per echo eigentlich ausgegeben. :)
 
Oha, da liegt aber noch einiges im argen, was das Verständis davon angeht wie das Web funktioniert ;)

Die Variable wird dahin gesendet, ja aber sie wird nicht gespeichert. Du wirst die Antwort wenn überhaupt nur sehen, wenn du den Response den dein Post erzeugt auswertest.

Ka was du vorhast, aber so wie du dir das gerade vorstellst funktioniert das nicht.
Vielleicht solltest du dich nochmal in HTTP einlesen.

Die Ausgabe erfolgt wie gesagt NUR im direkten Response nicht wenn du mit dem Browser später nochmal drauf zugreifst.
 
Oh misst, aber das ist mir auch gerade aufgefallen, dass das so nicht geht.
Dachte mir auch gerade: Wenn ich die index.php ja immer wieder aktualisiere, woher kommt die Variable dann...
Hatte den HTTP Response im Java Code jetzt mal so angepasst, dass die komplette PHP Seite in einer Textview ausgegeben wird. Das funktioniert super. Aber das ist leider nicht das, was ich brauche.

Kennt jemand denn eine Möglichkeit, um Variablen aus einer Android App die im gleichen lokalen Netz ist, persistent für eine PHP Datei zu speichern und diese dort nach Belieben zu verwenden?
Ich steh jetzt irgendwie auf dem Schlauch...
 
Du kannst den Inhalt der übergebebenen Variable mit deinem PHP-Script zum Beispiel als Datei speichern. Oder in einer Datenbank.

Hier gibts zum Beispiel ein Beispielscript mit file_put_contents und file_get_contents:
PHP: file_put_contents - Manual
PHP:
<?php
$file = 'people.txt';
// Open the file to get existing content
$current = file_get_contents($file);
// Append a new person to the file
$current .= "John Smith\n";
// Write the contents back to the file
file_put_contents($file, $current);
?>
 
Vielen Dank, das probiere ich morgen aus!
Eigentlich ist mein Anliegen relativ simpel. Über ein EditText wird eine Zahl eingegeben, dann über einen Button wird diese Variable an die index.php auf den Xampp Server geschickt. Dort soll diese Variable über eine Select Anweisung, die Zeile in einem Datenbank Table auswählen, wo der Primärschlüssel (ID) == von Android App gesendete Variable ist.
Dieser Eintrag der Tabelle soll dann nur noch ausgegeben werden. Das wars eigentlich.
 
Willst du die SQL abfrage dann in deiner Android APP verarbeiten?
Oder willst du wirklich mit der App nur die ID setzen und dann von woanders darauf zugreifen? (Browser am Laptop).

Bei Zweiterem erkenn ich irgendwie nicht den Sinn ;)
Bei erstem brauchst du die Variable ja eigentlich nicht speichern, sonder führst einfach die SQL Abfrage direkt im PHP script aus und schickst das Ergebnis in geigneter Form (Ich würde JSON empfehlen) an das Telefon zurück, dass dann damit arbeiten kann.

Ansonsten kann ja jeder der die Adresse des Webservers kennt einfach nach lust und laune die ID ändern.
 
Es soll tatsächlich die zweite, angesprochene Variante sein. :o Die Tatsache, dass jeder die Id ändern kann ist erstmal nicht gegeben, da es ein lokales, Passwort gesichertes Netzwerk ohne Verbindung zum Internet ist.

Geht darum, dass auf einem kleinen, lokalen Triathlon ein Mitarbeiter etwa 50 Meter vor dem Ziel die Id des Sportlers eingegeben werden kann, die Id mit der Datenbank geprüft und der Tabelleneintrag dann angezeigt wird. Diese index.php ist dann auf einer größeren Anzeigetafel zu sehen, damit der Zielsprecher den Sportler ansagen kann^^
 
Zum testen der Verbindung zum Server vom Handy aus, erstell doch einfach eine "test.php", welche einfach nur "echo "Verbindung erfolgreich";" beinhaltet. Die rufst du dann über den Browser auf dem Handy im WLAN auf. So kannst du deine Verbindung testen.
 

Ähnliche Themen

M
Antworten
21
Aufrufe
1.362
swa00
swa00
Mr-Fisch
Antworten
5
Aufrufe
967
migi01
migi01
Mr-Fisch
Antworten
8
Aufrufe
1.006
Mr-Fisch
Mr-Fisch
M
Antworten
9
Aufrufe
790
mkuz24
M
A
Antworten
5
Aufrufe
696
swa00
swa00
Zurück
Oben Unten