2016-05-03 3 views
0

私の仕事で内部Webサーバーと通信するアプリケーションをビルドしていますが、ログインプロセスがあります。Android Studio SDK 23のMalformedURLException、プレフィックスなしのサイトリダイレクト

問題は、動作する実際のURLを使用するとMalformedURLExceptionが発生することです。そして、私がHTTPを使用する場合:私のアプリ内のアドレスで//を、私はエラーを取得:

com.an[email protected]42c06aa0

私はHTTPを追加する場合:// FirefoxやChromeのようなブラウザのアドレスに移動すると、サイトはhttp://を使わずに自身にリダイレクトされます。私はそれが何とか "http://"部分で動作しないように設計されていると思うが、私はこれを回避する方法がわからない。

私は数時間、HttpUrlConnectionの使用について検索しましたが、私が見つけたのは、URLでプロトコルが必要であることです。

私のコードは今のように見えますが、私はプライバシー上の理由から実際のURLを "MyServerName"、 "MyOrgName"に置き換えました。

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; 

    } 
} 

私の質問はどのように私はこのようなURLを使用しますが、「HTTP://」なしでするか、である、またはどのようにそれは「HTTP://」を使用することができるように、私は、サイトまたはDNSを変更することができ、または私のコードに何か問題がありますか?

可能な限り、私はいくつかの可能性を提示したいと思います。これは問題ではありませんので、一部:

おかげで、 ウェイン

+0

は、サーバが別のページにリダイレクトしていますか? –

+0

'それは何とか" http:// "part"で動作しないように設計されていると思います。 "プロトコル"と呼ばれ、常に指定されています。あなたのケースでは、 'http'か、安全な接続である' https'を使ってパスワードを送る方が好きでしょう。あなたはそれを試しましたか? –

+0

「エラーが発生しました」 - これはエラーではありません。これは 'com.android.okhttp.internal.http.HttpTransport $ FixedLengthInputStream'オブジェクトで呼び出された' toString() 'の出力です。クラッシュしている場合、あなたの質問に完全なスタックトレースを投稿したいかもしれません。 – CommonsWare

答えて

0

サイトが「// HTTP」せずにURLにリダイレクトにもかかわらず、ことが判明しました。

実際の問題は、Webサーバーによって処理されたページをどのように読み取ろうとしていたか、intent.extra値を正しく渡していないことでした。

ここでは動作しているコードですが、デバッグ用のものが入っていますが、うまくいけば他の人が助けてくれることを願っています。ここで

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; 
    } 
} 

は意図エキストラは、前のアクティビティに追加された方法は次のとおりです。クロームでそのページを開くときに

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

リダイレクト応答を処理しましたか?どうやって? –

+0

私はそれをまったく扱わなかった。上のコードは、Webサーバーがあなたをリダイレクトするページを読み取ります。今、私はクッキーと一緒にブルースを持っています...それは新しい質問になるでしょう。 –