2017-07-08 150 views
0

我有一臺服務器設置爲接受電子郵件&密碼憑據,我希望我的應用程序使用HttpURLconnection登錄。連接部分似乎沒問題,因爲響應一直是200,但我在實際發送數據時遇到了麻煩。我將json對轉換爲字符串並通過DataOutputStream發送。我通過InputStream讀取響應。使用httpulrconnection登錄網站

即使電子郵件&密碼錯誤,我認爲我沒有正確發送數據,但我的主要問題是我用InputStream讀取的響應始終是相同的(登錄頁面的html)。

你可以在我的代碼來看看:

import android.content.Context; 
import android.content.SharedPreferences; 
import android.os.AsyncTask; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.util.JsonWriter; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.app.ProgressDialog; 
import java.io.DataOutputStream; 
import java.net.MalformedURLException; 
import android.net.Uri; 
import android.widget.Toast; 
import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import android.content.Intent; 
import org.json.JSONObject; 
import org.json.JSONStringer; 
import java.io.BufferedOutputStream; 
import java.io.IOException; 
import java.io.OutputStream; 
import java.io.OutputStreamWriter; 
import java.net.HttpURLConnection; 
import java.net.URL; 

public class MainActivity extends AppCompatActivity { 

private EditText user; 
private EditText pswrd; 
private Button login; 
private String email; 
private String password; 
private String HOST; 
private String DEFAULT_IPADDRESS; 
private String PREFERENCES_IPADDRESSSERVER; 
private String PREFERENCES_TOKEN; 
private Context ctx; 
public static final int CONNECTION_TIMEOUT = 10000; 
public static final int READ_TIMEOUT = 15000; 
private String sRequest; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 


    user = (EditText) findViewById(R.id.Email); 
    pswrd = (EditText) findViewById(R.id.Password); 
    login = (Button) findViewById(R.id.button); 



    login.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      email = user.getText().toString(); 
      password = pswrd.getText().toString(); 
      try { 
       //HttpURLConnection example = serverLogin(email, password); 
       new AsyncLogin().execute(email, password); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 


     } 
    }); 


} 

private class AsyncLogin extends AsyncTask<String, String, String> { 
    ProgressDialog pdLoading = new ProgressDialog(MainActivity.this); 
    HttpURLConnection conn; 
    URL url = null; 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 

     //this method will be running on UI thread 
     pdLoading.setMessage("\tLoading..."); 
     pdLoading.setCancelable(false); 
     pdLoading.show(); 

    } 

    @Override 
    protected String doInBackground(String... params) { 
     try { 

      // Enter URL address 
      url = new URL("http://81.169.151.83/users/sign_in"); 

     } catch (MalformedURLException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
      return "exception"; 
     } 
     try { 
      // Setup HttpURLConnection class to send and receive data 
      conn = (HttpURLConnection) url.openConnection(); 
      conn.setReadTimeout(READ_TIMEOUT); 
      conn.setConnectTimeout(CONNECTION_TIMEOUT); 
      conn.setRequestProperty("Content-Type", "application/json; charset=UTF-8"); 
      conn.setRequestMethod("POST"); 

      // setDoInput and setDoOutput method depict handling of both send and receive 
      conn.setDoInput(true); 
      conn.setDoOutput(true); 

      JSONObject request = new JSONObject(); 
      try { 
       request.put("email", params[0]); 
       request.put("password", params[1]); 

      } catch (org.json.JSONException e) { 
       e.printStackTrace(); 
      } 
      sRequest = request.toString(); 




      // Open connection for sending data 
      conn.connect(); 
      DataOutputStream wr = new DataOutputStream(conn.getOutputStream()); 
      wr.writeBytes(sRequest); 
      wr.flush(); 
      wr.close(); 


     } catch (IOException e1) { 
      // TODO Auto-generated catch block 
      e1.printStackTrace(); 
      return "exception"; 
     } 

     try { 

      int response_code = conn.getResponseCode(); 

      // Check if successful connection made 
      if (response_code == HttpURLConnection.HTTP_OK) { 


       // Read data sent from server 
       InputStream input = conn.getInputStream(); 
       BufferedReader reader = new BufferedReader(new InputStreamReader(input)); 
       StringBuilder result = new StringBuilder(); 
       String line; 

       while ((line = reader.readLine()) != null) { 
        result.append(line); 
       } 

       // Pass data to onPostExecute method 
       return (result.toString()); 

      } else { 

       return ("unsuccessful"); 
      } 

     } catch (IOException e) { 
      e.printStackTrace(); 
      return "exception"; 
     } finally { 
      conn.disconnect(); 
     } 


    } 

    @Override 
    protected void onPostExecute(String result) { 

     //this method will be running on UI thread 

     pdLoading.dismiss(); 

     if (result.equalsIgnoreCase("true")) { 
      /* Here launching another activity when login successful. If you persist login state 
      use sharedPreferences of Android. and logout button to clear sharedPreferences. 
      */ 
      Toast.makeText(MainActivity.this, "GREAT SUCCESS", Toast.LENGTH_LONG).show(); 
     /* Intent intent = new Intent(MainActivity.this,SuccessActivity.class); 
      startActivity(intent); 
      MainActivity.this.finish();*/ 

     } else if (result.equalsIgnoreCase("false")) { 

      // If username and password does not match display a error message 
      Toast.makeText(MainActivity.this, "Invalid email or password", Toast.LENGTH_LONG).show(); 

     } else if (result.equalsIgnoreCase("exception") || result.equalsIgnoreCase("unsuccessful")) { 

      Toast.makeText(MainActivity.this, "OOPs! Something went wrong. Connection Problem.", Toast.LENGTH_LONG).show(); 

     } 
    } 

} 

感謝

回答

0

我建議你嘗試OKHTTP,看看他們的recipes,它是簡單了很多做GET/POST中請求Android系統。

在附註中,我已檢出您的網站http://81.169.151.83/users/sign_in,用於登錄表單的參數是用戶[email]和用戶[password]。不是上面添加的電子郵件和密碼。還有其他幾個表單字段,如authenticity_token,可能是原因。

+0

嗨,謝謝你的回答。我會開始研究OKHTTP。另外,我是不是正確構建params字符串? –

+0

我不這麼認爲。您可以使用瀏覽器的開發人員工具,嘗試執行POST登錄請求並查看發送的參數。您還可以查看登錄表單中的表單字段。 – licitdev

+0

使用chrome的開發人員工具,用戶[email]和用戶[password]至少與我的憑證相符。將代碼從電子郵件和密碼更改爲用戶[]對現在返回401.可能是因爲令牌?你能給我一些關於這方面的指示嗎? –