Webdatenbank + JSON Webservice + ClientProtocolException

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von Odins Auge, 09.02.2012.

  1. Odins Auge, 09.02.2012 #1
    Odins Auge

    Odins Auge Threadstarter Neuer Benutzer

    Beiträge:
    2
    Erhaltene Danke:
    0
    Registriert seit:
    08.06.2011
    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();
        ?>
    
    
     
  2. RED-BARON, 10.02.2012 #2
    RED-BARON

    RED-BARON Android-Hilfe.de Mitglied

    Beiträge:
    146
    Erhaltene Danke:
    19
    Registriert seit:
    06.10.2009
    dein Apache werkelt auf Port 3306 ?
     
  3. Odins Auge, 10.02.2012 #3
    Odins Auge

    Odins Auge Threadstarter Neuer Benutzer

    Beiträge:
    2
    Erhaltene Danke:
    0
    Registriert seit:
    08.06.2011
    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.
     
  4. Sentence, 10.02.2012 #4
    Sentence

    Sentence Erfahrener Benutzer

    Beiträge:
    242
    Erhaltene Danke:
    51
    Registriert seit:
    27.01.2011
    Phone:
    S3, S6 Edge
    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
     

Diese Seite empfehlen