2016-05-03 8 views
0

Ich baue eine App, die bei meiner Arbeit mit einem internen Webserver kommuniziert, es hat einen Login-Prozess.MalformedURLException in Android Studio SDK 23, Website leitet an keine Präfix weiter

Das Problem ist, wenn ich die tatsächliche URL verwende, die funktioniert, bekomme ich eine MalformedURLException. Und wenn ich http: // mit der Adresse in meiner app, erhalte ich eine Fehlermeldung:

com.an[email protected]42c06aa0

Wenn ich hinzufügen http: // auf die Adresse in einem Browser wie Firefox oder Chrome, leitet die Seite zu sich selbst, aber ohne die http: //. Ich denke, es ist irgendwie so konzipiert, dass es nicht mit dem "http: //" Teil funktioniert, aber ich bin nicht sicher, wie ich das umgehen soll.

Ich habe jetzt ein paar Stunden über die Verwendung der HttpUrlConnection gesucht und alles, was ich gefunden habe, ist, dass das Protokoll mit URLs erforderlich ist.

So sieht mein Code jetzt aus, ich habe die tatsächliche URL aus Datenschutzgründen durch "MyServerName", "MyOrgName" ersetzt.

public class DoLogin extends AsyncTask<Void, Void, Void> { 
    @Override 
    protected Void doInBackground(Void... params) { 



     Bundle extras = getIntent().getExtras(); 
     String username = extras.getString("Username"); 
     String password = extras.getString("Password"); 
     String charset = "UTF-8"; 
     String pageText = ""; 
     try { 
      URL url = new URL("http://MyServerName.MyOrgName.k12.mo.us/service/login.asp?ucode=" + username + "&upassword=" + password); 
      //URL url = new URL("http://www.google.com/"); 
      URLConnection connection = url.openConnection(); 
      connection.setRequestProperty("Accept-Charset", charset); 
      InputStream response = connection.getInputStream(); 
      pageText = response.toString(); 

     } catch (MalformedURLException e) { 
      //Do something with the exception. 
      pageText = "MalformedURLException " + e.getMessage(); 
     } catch (IOException e2) { 
      //Do something with the exception. 
      pageText = "IOException " + e2.getMessage(); 
     } catch (NullPointerException e3) { 
      pageText = "NullPointerException " + e3.getMessage(); 
     } 
     setData(pageText); 
     return null; 

    } 
} 

Meine Frage ist, wie kann ich entweder verwenden, um eine URL wie folgt aber ohne „http: //“, oder wie kann ich die Website oder DNS ändern, so dass es „http: //“ verwenden, oder stimmt etwas mit meinem Code nicht?

Wenn möglich, würde ich gerne ein paar Möglichkeiten vorgestellt haben.

Danke, Wayne

+0

Hat der Server, den Sie auf eine andere Seite umleiten, wenn die Seite in Chrom öffnen? –

+0

'Ich denke, es ist irgendwie entworfen, nicht mit dem" http: // "-Teil zu arbeiten. Es heißt" Protokoll "und es gibt immer einen bestimmten. In Ihrem Fall entweder "http" oder, da Sie wahrscheinlich am liebsten das Passwort über eine sichere Verbindung senden würden, "https". Hast du das probiert? –

+0

"Ich bekomme einen Fehler" - das ist kein Fehler. Das ist die Ausgabe von 'toString()', die auf einem 'com.android.okhttp.internal.http.HttpTransport $ FixedLengthInputStream' Objekt aufgerufen wird. Wenn Sie abstürzen, möchten Sie möglicherweise die vollständige Stapelverfolgung in Ihrer Frage veröffentlichen. – CommonsWare

Antwort

0

Es stellt sich heraus, dass, obwohl die Website zu einer URL umleitet ohne „http: //“ Teil, dass dies keine Rolle spielt.

Das eigentliche Problem war in, wie ich versuchte, die Seite zu lesen, die durch den Webserver gedient wurde UND, dass ich meine intent.extra Werte nicht richtig passierte!

Hier ist Arbeitscode, Es ist Debugging Zeug in diesem Moment, aber hoffentlich jemand anderen wird dadurch geholfen.

public class DoLogin extends AsyncTask<Void, Void, String> { 
    protected void onPostExecute(String result) { 
     PostLoginStatus(result); 
    } 
    protected String doInBackground(Void... params) { 
     String username = "No Username passed."; 
     String password = "No Password passed."; 
     Bundle extras = getIntent().getExtras(); 
     if (extras != null) { 
      username = extras.getString("Username"); 
      password = extras.getString("Password"); 
     } 
     String charset = "UTF-8"; 
     String pageText = ""; 
     try { 
      URL url = new URL("http://MyServer.MyOrg.k12.mo.us/service/login.asp?ucode=" + username + "&upassword=" + password); 
      URLConnection connection = url.openConnection(); 
      // wrap the urlconnection in a bufferedreader 
      BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(connection.getInputStream())); 

      String line; 

      // read from the urlconnection via the bufferedreader 
      while ((line = bufferedReader.readLine()) != null) 
      { 
       pageText = pageText + line + "\n"; 
      } 
      bufferedReader.close(); 

     } catch (MalformedURLException e) { 
      pageText = "Username: " + username + " Password: " + password + "MalformedURLException " + e.getMessage(); 
     } catch (IOException e2) { 
      pageText = "Username: " + username + " Password: " + password + " IOException " + e2.getMessage(); 
     } catch (NullPointerException e3) { 
      pageText = "Username: " + username + " Password: " + password + " NullPointerException " + e3.getMessage(); 
     } 
     return pageText; 
    } 
} 

Hier ist, wie die Absicht Extras in der vorherigen Aktivität hinzugefügt wurden:

String username = eusername.getText().toString().trim(); 
String password = epassword.getText().toString().trim(); 
Intent i = new Intent(Login.this, VerifyInventory.class); 
// Where 'login' would be the current activity's name and 'VerifyInventory' is the next activity's name. 
i.putExtra("Username", username); 
i.putExtra("Password", password); 
startActivity(i); 
+0

Haben Sie die Umleitungsantwort gehandhabt? Wie? –

+0

Ich habe es überhaupt nicht behandelt. Der obige Code liest die Seite, zu der der Webserver Sie weiterleitet. Jetzt habe ich den Blues mit Keksen ... Das wird eine neue Frage sein. –