Problem bei Log-In auf einem Webserver mit POST

F

fairsein

Neues Mitglied
0
Hallo ihr,

Ich habe folgendes Problem. der folgende Code liefert bei der Zeile HttpResponse response = httpclient.execute(httppost); einen Fehler aus. Das habe ich mit der Log- Konstruktion schon heraus gefunden.


Code:
package de.jan.inka_base;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.HeaderElement;
import org.apache.http.HttpEntity;
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.entity.BufferedHttpEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;

import android.R.string;
import android.net.ParseException;
import android.net.Uri;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

    

public class MainActivity extends Activity implements OnClickListener {

    
    String name;
    String password;
    private String Antwort;
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button = (Button) findViewById(R.id.button1);
        button.setOnClickListener(this);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
    
    public void onClick(View v){
   
        
        EditText et_name = (EditText) findViewById(R.id.editText1);
           name  = et_name.getText().toString();
        EditText et_password = (EditText) findViewById(R.id.editText2);
        password = et_password.getText().toString();
        TextView tv_name = (TextView) findViewById(R.id.textView3);
           //tv_name.setText(name);
           postData();
           
           tv_name.setText(Antwort);
    }
    
    public void postData() {
           
        
        
        // Create a new HttpClient and Post Header
        HttpClient httpclient = new DefaultHttpClient();
        HttpPost httppost = new HttpPost("http://www.beispiel.com/controller/login.php");
        
        
        try {
            // Add your data
            List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
            nameValuePairs.add(new BasicNameValuePair("name", name));
            nameValuePairs.add(new BasicNameValuePair("password", password));
            httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
   
            // Execute HTTP Post Request
            Log.w("Name","onCreate gestartet");
            HttpResponse response = httpclient.execute(httppost);
            Log.w("Name1","onCreate gestartet1");
            Antwort = inputStreamToString(response.getEntity().getContent()).toString();
            
          
             
            
            
        } catch (IOException e) {
            System.out.println("konnte "+httppost+" nicht oeffnen: "+e.getMessage());
        }
    }
Laut LogCat wird folgender Fehler ausgegeben:


Code:
    ^    11-07 20:16:28.091: E/AndroidRuntime(4758): FATAL EXCEPTION: main
11-07 20:16:28.091: E/AndroidRuntime(4758): android.os.NetworkOnMainThreadException
11-07 20:16:28.091: E/AndroidRuntime(4758):     at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099)
11-07 20:16:28.091: E/AndroidRuntime(4758):     at java.net.InetAddress.lookupHostByName(InetAddress.java:391)
11-07 20:16:28.091: E/AndroidRuntime(4758):     at java.net.InetAddress.getAllByNameImpl(InetAddress.java:242)
11-07 20:16:28.091: E/AndroidRuntime(4758):     at java.net.InetAddress.getAllByName(InetAddress.java:220)
11-07 20:16:28.091: E/AndroidRuntime(4758):     at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137)
11-07 20:16:28.091: E/AndroidRuntime(4758):     at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
11-07 20:16:28.091: E/AndroidRuntime(4758):     at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
11-07 20:16:28.091: E/AndroidRuntime(4758):     at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
11-07 20:16:28.091: E/AndroidRuntime(4758):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
11-07 20:16:28.091: E/AndroidRuntime(4758):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
11-07 20:16:28.091: E/AndroidRuntime(4758):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
11-07 20:16:28.091: E/AndroidRuntime(4758):     at de.jan.inka_base.MainActivity.postData(MainActivity.java:100)
11-07 20:16:28.091: E/AndroidRuntime(4758):     at de.jan.inka_base.MainActivity.onClick(MainActivity.java:71)
11-07 20:16:28.091: E/AndroidRuntime(4758):     at android.view.View.performClick(View.java:3511)
11-07 20:16:28.091: E/AndroidRuntime(4758):     at android.view.View$PerformClick.run(View.java:14105)
11-07 20:16:28.091: E/AndroidRuntime(4758):     at android.os.Handler.handleCallback(Handler.java:605)
11-07 20:16:28.091: E/AndroidRuntime(4758):     at android.os.Handler.dispatchMessage(Handler.java:92)
11-07 20:16:28.091: E/AndroidRuntime(4758):     at android.os.Looper.loop(Looper.java:137)
11-07 20:16:28.091: E/AndroidRuntime(4758):     at android.app.ActivityThread.main(ActivityThread.java:4424)
11-07 20:16:28.091: E/AndroidRuntime(4758):     at java.lang.reflect.Method.invokeNative(Native Method)
11-07 20:16:28.091: E/AndroidRuntime(4758):     at java.lang.reflect.Method.invoke(Method.java:511)
11-07 20:16:28.091: E/AndroidRuntime(4758):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
11-07 20:16:28.091: E/AndroidRuntime(4758):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
11-07 20:16:28.091: E/AndroidRuntime(4758):     at dalvik.system.NativeStart.main(Native Method)
Ich hoffe, dass ihr mir weiterhelfen könnt.
 
Zuletzt bearbeitet:
am einfachsten ist es die exceptions mal bei google einzugeben, dann wirst du schnell merken, dass

NetworkOnMainThreadException
bedeutet
dass du Netzwerk Operationen im Main Thread machst - da es eine exception ist, ist das sehr böse

Stichworte: Thread, Asynctask, UI Thread
 
Ich habe jetzt mich mal ein bisschen damit beschäftigt. Ich weiß jetzt, dass ich die Funktion postData() auslagern muss. Aber ich weiß leider im Moment nicht genau wie? Könnt ihr mir vielleicht ein Tutouriallink oder so etwas posten?

Der ursprüngliche Beitrag von 13:21 Uhr wurde um 14:21 Uhr ergänzt:

Ich habe jetzt mal die ASyncTask in die MainActivity eingebaut. Wie kann ich die jetzt aufrufen. Und was bedeutet String... uri und <String, String, String>?

Hier der Code:

Code:
package de.jan.inka_base;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.HeaderElement;
import org.apache.http.HttpEntity;
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.entity.BufferedHttpEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;

import android.R.string;
import android.net.ParseException;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

    

public class MainActivity extends Activity implements OnClickListener {

    
    String name;
    String password;
    private String Antwort;
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button = (Button) findViewById(R.id.button1);
        button.setOnClickListener(this);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
    
    public void onClick(View v){
   
        
        EditText et_name = (EditText) findViewById(R.id.editText1);
           name  = et_name.getText().toString();
        EditText et_password = (EditText) findViewById(R.id.editText2);
        password = et_password.getText().toString();
        TextView tv_name = (TextView) findViewById(R.id.textView3);
           //tv_name.setText(name);
           
           
           tv_name.setText(Antwort);
           
           
    
        
    }
    
    private class RequestTask extends AsyncTask<String, String, String>{

        @Override
        protected String doInBackground(String... uri) {
            HttpClient httpclient = new DefaultHttpClient();
            HttpPost httppost = new HttpPost("http://www.beispiel.com/controller/login.php");
            
            
            try {
                List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
                nameValuePairs.add(new BasicNameValuePair("name", name));
                nameValuePairs.add(new BasicNameValuePair("password", password));
                httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
                
                HttpResponse response = httpclient.execute(httppost);
                Antwort = inputStreamToString(response.getEntity().getContent()).toString(); 
            } catch (IOException e) {
                Log.w("jan", "kaputt");
            }
            return Antwort;
        }

        private StringBuilder inputStreamToString(InputStream is) {
            String line = "";
            StringBuilder total = new StringBuilder();
            
            // Wrap a BufferedReader around the InputStream
            BufferedReader rd = new BufferedReader(new InputStreamReader(is));

            // Read response until the end
            try {
                while ((line = rd.readLine()) != null) { 
                    total.append(line); 
                }
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
            // Return full string
            return total;
        }
Gruß fairsein
 
So. Ich habe den Quelltext jetzt noch mal verändert. So richtig will das immer noch nicht funktionieren. Hauptproblem ist,das die Webseite nicht eine Adresse, sondern einen Quelltext zurückgibt. Wie kann man in Android HTML- Code anzeigen?

Hier der Code:

Code:
package de.jan.inka_base;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.HeaderElement;
import org.apache.http.HttpEntity;
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.entity.BufferedHttpEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;

import android.R.string;
import android.net.ParseException;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

    

public class MainActivity extends Activity implements OnClickListener {

    
    String name;
    String password;
    private String Antwort;
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button = (Button) findViewById(R.id.button1);
        button.setOnClickListener(this);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
    
    public void onClick(View v){
   
        
        EditText et_name = (EditText) findViewById(R.id.editText1);
           name  = et_name.getText().toString();
        EditText et_password = (EditText) findViewById(R.id.editText2);
        password = et_password.getText().toString();
        TextView tv_name = (TextView) findViewById(R.id.textView3);
           //tv_name.setText(name);
           
           new RequestTask().execute(""http://www.beispiel.com/controller/login.php"");
           tv_name.setText(Antwort);
           
           
           /*Intent browser = new Intent(Intent.ACTION_VIEW,
                Uri.parse("http://inka.gatzky.com/"));
        startActivity(browser);*/
        
    }
    
    private class RequestTask extends AsyncTask<String, String, String>{

        @Override
        protected String doInBackground(String... uri) {
            HttpClient httpclient = new DefaultHttpClient();
            HttpPost httppost = new HttpPost(""http://www.beispiel.com/controller/login.php"");
            
            
            try {
                List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
                nameValuePairs.add(new BasicNameValuePair("name", name));
                nameValuePairs.add(new BasicNameValuePair("password", password));
                httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
                
                HttpResponse response = httpclient.execute(httppost);
                Antwort = inputStreamToString(response.getEntity().getContent()).toString(); 
            } catch (IOException e) {
                Log.w("jan", "kaputt");
            }
            return Antwort;
        }

        private StringBuilder inputStreamToString(InputStream is) {
            String line = "";
            StringBuilder total = new StringBuilder();
            
            // Wrap a BufferedReader around the InputStream
            BufferedReader rd = new BufferedReader(new InputStreamReader(is));

            // Read response until the end
            try {
                while ((line = rd.readLine()) != null) { 
                    total.append(line); 
                }
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
            // Return full string
            return total;
        }  
        // see http://androidsnippets.com/get-the-content-from-a-httpresponse-or-any-inputstream-as-a-string

        
        
        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);
            //Do anything with response..
        }
    }
 
Warum sollte eine Adresse zurück gegeben werden? Du hast die Adresse ja :)

rufst eine Methode auf die schon "inputStreamToString()" heißt. Na dann ist es doch logisch, dass du einen String bekommst :)

Quellcode kannst anzeigen, in dem du den Code einer Webview übergibst
 

Ähnliche Themen

B
Antworten
4
Aufrufe
491
bb321
B
D
Antworten
23
Aufrufe
2.542
Data2006
D
G
Antworten
8
Aufrufe
1.196
gnome2012
G
Zurück
Oben Unten