Webdatenbank + JSON Webservice + ClientProtocolException

O

Odins Auge

Neues Mitglied
0
Hallo

Ich möchte Daten an eine Webdatenbank (mysql + apache) sicken und sie von dort abrufen.
Als Ansatz habe ich die Rest Webservice Tutorials hergenommen und die mit AsyncTask erweitert.

Mein Problem ist, ich bekomme beim Verbindungsaufbau eine ClientProtocolException mit der Meldung: The server failed to respond with a valid http response.

Ich habe verschiedene Tutorials ausprobiert aber an der Fehlermeldung hat sich nichts geändert, ich habe auch zu dieser Fehlermeldung nichts brauchbares finden können, hat jemand eine Ahnung wo der Fehler liegt?

Der Server ist eine lokale Linux-Maschine, mein Nexus S befindet sich ebenfalls per WLAN im lokalen Netz und das PHP script lässt sich im Browser problemlos öffnen.

Hier der Code:

Activity
Code:
package at.vikingstudios.androidtest;

import java.util.ArrayList;
import java.util.concurrent.ExecutionException;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.ListActivity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.widget.ArrayAdapter;

public class AndroidTestActivity extends ListActivity
{
	ArrayList<String> results = new ArrayList<String>();
	JSONObject json_data;
	
	/** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getData();
    }

	private void getData() {
		String url;
		String result = "";
		AsyncTask<String, Void, String> ds;
		
		try {
			url = "http://192.168.1.102:3306" + System.getProperty("file.separator") + "androidtest.php";
			ds = new DataSucker().execute(url);
			result = ds.get();
		} catch (InterruptedException ie)
		{
			Log.e("log_tag", "Error thread interrupted: "+ie.toString());
		} catch (ExecutionException ee)
		{
			Log.e("log_tag", "Error on execution: "+ee.toString());
		}
				
		try
		{
			JSONArray jArray = new JSONArray(result);
			for(int i=0;i<jArray.length();i++)
			{
				json_data = jArray.getJSONObject(i);
				results.add((String) json_data.get("id") + " "+ json_data.get("name"));
				Log.d("debug", (String) json_data.get("id") + " "+ json_data.get("name"));
			} 
				
			fillList();
		} catch(JSONException e)
		{
			Log.e("log_tag", "Error parsing data "+e.toString());
		}
	}

	public void fillList()
	{
		this.setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, results));
	}
}

Thread:
Code:
package at.vikingstudios.androidtest;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;

import android.os.AsyncTask;
import android.util.Log;

public class DataSucker extends AsyncTask<String, Void, String>
{
	InputStream is;

	@Override
	protected String doInBackground(String... urls) {
		String result = "";
		//ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
		
		try
		{
			HttpClient httpclient = new DefaultHttpClient();
			HttpGet httpget = new HttpGet("http://192.168.1.102:3306" + System.getProperty("file.separator") + "androidtest.php");
			//httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
			httpget.setHeader("Accept", "application/json");
	        httpget.setHeader("Content-type", "application/json");
			HttpResponse response = httpclient.execute(httpget);
			Log.e("log_tag", response.getStatusLine().toString());
			HttpEntity entity = response.getEntity();
			is = entity.getContent();
		} catch (ClientProtocolException ce)
		{
			Log.e("log_tag", "Fehler bei der http Verbindung "+ce.toString()+ ce.getCause());
		} catch(Exception e)
		{
			Log.e("log_tag", "Fehler bei der http Verbindung "+e.toString());
		}
		
		try
		{
			BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
			StringBuilder sb = new StringBuilder();
			String line = null;
			while ((line = reader.readLine()) != null)
			{
				sb.append(line + "n");
			} 
			
			is.close();
			result=sb.toString();
			
		} catch(Exception e)
		{
			Log.e("log_tag", "Error converting result "+e.toString());
		}
						
		return result;
	}
	

}

PHP Script:
Code:
<?php
mysql_connect("localhost","android","and123");
    mysql_select_db("androidtest");

    $q=mysql_query("SELECT * FROM androidtest");
    while($e=mysql_fetch_assoc($q))
            $output[]=$e;

    print(json_encode($output));

    mysql_close();
    ?>
 
dein Apache werkelt auf Port 3306 ?
 
Ach herrje ich hab den Wald vor lauter Bäumen nicht gesehen, natürlich ist der Port 3306 der MySql Port und nicht der vom Apache.

Vielen Dank.
 
Moin,
du sagst mittels httpget.setHeader("Accept", "application/json"); das du nur JSON dateien akzeptierst. PHP liefert standardmäßig aber text/html aus.

Vielleicht hilft in der php der entsprechende header
header("Content-type: application/json; charset=utf-8");

Außerdem musst du die ausgabe von json_encode noch utf8 kodieren, sonst wird es an umlauten scheitern.

Da hab ich ne kleine Funktion für
Code:
function array_utf8_encode_recursive($dat)
        { if (is_string($dat)) {
            return utf8_encode($dat);
          }
          if (is_object($dat)) {
            $ovs= get_object_vars($dat);
            $new=$dat;
            foreach ($ovs as $k =>$v)    {
                $new->$k=array_utf8_encode_recursive($new->$k);
            }
            return $new;
          }
         
          if (!is_array($dat)) return $dat;
          $ret = array();
          foreach($dat as $i=>$d) $ret[$i] = array_utf8_encode_recursive($d);
          return $ret;
        }
die ausgabe dann so
json_encode(array_utf8_encode_recursive($output));

MfG
 

Ähnliche Themen

P
Antworten
1
Aufrufe
1.365
prof.dopenudel
P
benj98
  • benj98
Antworten
4
Aufrufe
1.279
benj98
benj98
FalkeNr1
  • FalkeNr1
Antworten
6
Aufrufe
2.340
FalkeNr1
FalkeNr1
Zurück
Oben Unten