2014-09-28 64 views
-1

我需要什麼:通過HTTPS得到JSON結果連接如何使用HTTPS在Android中,共享IP主機

我有:具有有效的SSL證書共享服務器

我想:能夠建立即HTTPS連接,我不能,因爲當我chaneg我的代碼與網上的例子,我發現,它永遠不會奏效......

詳情:

我一直在尋找了幾天的解決方案,但我發現許多不同的事情,並已經嘗試了很多不同的東西我的代碼中的組合,並沒有任何工作。 :(

我習慣於在PHP,MySQL,CSS,HTML中開發,但直到最近我纔開始使用Android(java),我從來沒有開發過任何東西(甚至不是「Hello world!」)

我想要一個簡單的應用程序,我僱了一個人在自由職業者(外觀極好印度的傢伙,其實......我覺得自己很幸運在這一個)。

所以,我最近買了一個SSL/TLS證書爲我的網站,它位於共享服務器上,我想在我的APP上更改我的代碼,以便能夠通過HTTPS進行連接,並與我在PHP中開發的web服務進行安全連接。

所有內容都與HTTP請求完美結合,但是當我嘗試了一些我在網上找到的不同HTTPS建議時,沒有任何工作。 :(

永遠無法企關於這個結論笑

這裏是一些30不同的畫面我一個代碼:

package com.appname.othername; 

import java.util.ArrayList; 

import org.apache.http.NameValuePair; 
import org.apache.http.message.BasicNameValuePair; 
import org.json.JSONException; 
import org.json.JSONObject; 

import com.actionbarsherlock.app.SherlockFragment; 
import com.andreabaccega.widget.FormEditText; 
import com.appname.R; 
import com.appname.R.id; 
import com.appname.R.layout; 
import com.appname.Visiter.NewJobRequestFragment.SenderTask; 
import com.appname.utility.ConnectionDetector; 
import com.appname.utility.JsonHandler; 
import com.appname.utility.ServiceHandler; 

import android.app.AlertDialog; 
import android.app.ProgressDialog; 
import android.content.DialogInterface; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.text.Editable; 
import android.text.TextWatcher; 
import android.util.Log; 
import android.view.KeyEvent; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.View.OnKeyListener; 
import android.view.ViewGroup; 
import android.widget.Button; 
import android.widget.Toast; 

public class CallmeFragment extends SherlockFragment { 

    public static final String serverURL = "http://WEBSITE.COM/WEBSERVICE_FILE.PHP"; 
    public static final String TAG_RESULT = "result"; 
    public static final String TAG_ERROR_STATUS = "error"; 
    public static final String TAG_ERROR_MSG = "message"; 
    private FormEditText firstname; 
    private FormEditText email; 
    private FormEditText phone; 

    private ProgressDialog progressDialog; 
    private ArrayList<NameValuePair> nameValuePair; 
    public String httpresponce; 
    public JSONObject result; 
    public String error_status; 
    public String error_msg; 
    private boolean isInternetPresent; 
    private ConnectionDetector cd; 

    public CallmeFragment(){} 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     progressDialog = new ProgressDialog(getActivity()); 
     progressDialog.setMessage("Please wait..."); 
     progressDialog.setCancelable(false); 

     cd = new ConnectionDetector(getActivity()); 
     super.onActivityCreated(savedInstanceState); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 

     View rootView = inflater.inflate(R.layout.fragment_callme, container, false); 
     firstname = (FormEditText)rootView.findViewById(R.id.editText1); 
     email = (FormEditText)rootView.findViewById(R.id.editText2); 
     phone = (FormEditText)rootView.findViewById(R.id.editText3); 
     phone.addTextChangedListener(new TextWatcher() { 

      @Override 
      public void beforeTextChanged(CharSequence s, int start, int count, 
        int after) { 
       // TODO Auto-generated method stub 

      } 

      @Override 
      public void onTextChanged(CharSequence s, int start, int before, 
        int count) { 
       final int length = phone.getText().length(); 
       phone.setOnKeyListener(new OnKeyListener() { 
         @Override 
         public boolean onKey(View v, int keyCode, KeyEvent event) { 

          if (length ==3 || length ==7 && keyCode != KeyEvent.KEYCODE_DEL) 
          { 
           phone.setText(phone.getText() + " "); 
           phone.setSelection(phone.getText().length()); 
          } 
          return false; 
         } 
        }); 
       // TODO Auto-generated method stub 

      } 

      @Override 
      public void afterTextChanged(Editable s) { 
       // TODO Auto-generated method stub 

      } 

     }); 
     Button submit_button = (Button)rootView.findViewById(R.id.button1); 
     submit_button.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       ValidateForms(); 
       // TODO Auto-generated method stub 

      } 
     }); 
     return rootView; 
    } 

    protected void ValidateForms() { 
     // TODO Auto-generated method stub 
     FormEditText[] allFields = {firstname,email,phone}; 


     boolean allValid = true; 
     for (FormEditText field: allFields) { 
      allValid = field.testValidity() && allValid; 
     } 

     if (allValid) { 
      SendMail(); 
     } else { 
      // EditText are going to appear with an exclamation mark and an explicative message. 
     } 
    } 

    private void SendMail() { 
     nameValuePair = new ArrayList<NameValuePair>(8); 
      nameValuePair.add(new BasicNameValuePair("name",firstname.getText().toString())); 
      nameValuePair.add(new BasicNameValuePair("contact",phone.getText().toString())); 
      nameValuePair.add(new BasicNameValuePair("email",email.getText().toString())); 
      isInternetPresent = cd.isConnectingToInternet(); 
      if (isInternetPresent) { 
        new SenderTask().execute(); 
      } 
      else 
      { 
       Toast.makeText(getActivity(),"Internet connection failed", Toast.LENGTH_SHORT).show(); 
      } 
    } 
    class SenderTask extends AsyncTask<String, Void, Void> { 

     @Override 
     protected void onPreExecute() { 
      progressDialog.show(); 
      super.onPreExecute(); 
     } 

     @Override 
     protected Void doInBackground(String... params) { 
    ServiceHandler sh = new ServiceHandler(); 

      // Making a request to url and getting response 
       httpresponce = sh.makeServiceCall(serverURL , JsonHandler.POST,nameValuePair); 
       if (httpresponce != null) { 
        try { 
         JSONObject jsonObj = new JSONObject(httpresponce); 

         // Getting JSON Array node 
         result = jsonObj.getJSONObject(TAG_RESULT); 
          error_status = result.getString(TAG_ERROR_STATUS); 
         error_msg = result.getString(TAG_ERROR_MSG); 

        } catch (JSONException e) { 
         e.printStackTrace(); 

        } 

        } 
      Log.i("Responce", "= "+httpresponce); 
      return null; 
     } 

     @Override 
     protected void onPostExecute(Void result) { 
      progressDialog.dismiss(); 
      showAlert(); 
      super.onPostExecute(result); 
     } 
    } 
    public void showAlert() { 
     // TODO Auto-generated method stub 
     AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(
       getActivity()); 

      // set title 
      alertDialogBuilder.setTitle("Message"); 

      // set dialog message 
      alertDialogBuilder 
       .setMessage(error_msg) 
       .setCancelable(true) 
       .setPositiveButton("OK", new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int id) { 
       //do things 
      } 
     }); // create alert dialog 
       AlertDialog alertDialog = alertDialogBuilder.create(); 

       // show it 
       alertDialog.show(); 
    } 

} 

編輯:

這裏是給後錯誤一些嘗試改變東西:

10-05 22:40:21.673: W/System.err(10007): javax.net.ssl.SSLException: hostname in certificate didn't match: <maif.pt> != <www.infor5.pt> OR <www.infor5.pt> OR <infor5.pt> 
10-05 22:40:21.673: W/System.err(10007): at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:185) 
10-05 22:40:21.673: W/System.err(10007): at org.apache.http.conn.ssl.BrowserCompatHostnameVerifier.verify(BrowserCompatHostnameVerifier.java:54) 
10-05 22:40:21.673: W/System.err(10007): at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:114) 
10-05 22:40:21.673: W/System.err(10007): at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:95) 
10-05 22:40:21.673: W/System.err(10007): at org.apache.http.conn.ssl.SSLSocketFactory.createSocket(SSLSocketFactory.java:388) 
10-05 22:40:21.673: W/System.err(10007): at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:214) 
10-05 22:40:21.673: W/System.err(10007): at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:167) 
10-05 22:40:21.673: W/System.err(10007): at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:125) 
10-05 22:40:21.673: W/System.err(10007): at org.apache.http.impl.client.DefaultRequestDirector.executeOriginal(DefaultRequestDirector.java:1227) 
10-05 22:40:21.673: W/System.err(10007): at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:677) 
10-05 22:40:21.673: W/System.err(10007): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:567) 
10-05 22:40:21.683: W/System.err(10007): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:491) 
10-05 22:40:21.683: W/System.err(10007): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:469) 
10-05 22:40:21.683: W/System.err(10007): at com.maif.utility.ServiceHandler.makeServiceCall(ServiceHandler.java:83) 
10-05 22:40:21.683: W/System.err(10007): at com.maif.Visiter.jobrequests.JobsListLoader.loadInBackground(JobsListLoader.java:86) 
10-05 22:40:21.683: W/System.err(10007): at com.maif.Visiter.jobrequests.JobsListLoader.loadInBackground(JobsListLoader.java:1) 
10-05 22:40:21.683: W/System.err(10007): at android.support.v4.content.AsyncTaskLoader.onLoadInBackground(AsyncTaskLoader.java:242) 
10-05 22:40:21.683: W/System.err(10007): at android.support.v4.content.AsyncTaskLoader$LoadTask.doInBackground(AsyncTaskLoader.java:51) 
10-05 22:40:21.683: W/System.err(10007): at android.support.v4.content.AsyncTaskLoader$LoadTask.doInBackground(AsyncTaskLoader.java:40) 
10-05 22:40:21.683: W/System.err(10007): at android.support.v4.content.ModernAsyncTask$2.call(ModernAsyncTask.java:123) 
10-05 22:40:21.683: W/System.err(10007): at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
10-05 22:40:21.683: W/System.err(10007): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
10-05 22:40:21.683: W/System.err(10007): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
10-05 22:40:21.683: W/System.err(10007): at java.lang.Thread.run(Thread.java:841) 
+1

**你有什麼問題?**它會爆炸嗎? – SLaks 2014-09-28 14:33:35

+0

@ SLacks你說得對,我的標題是「用戶」而不是「使用」。但無論如何,在我的解釋中,我清楚地提到了我在尋找的內容:「我想在我的APP上更改我的代碼,以便能夠通過HTTPS進行連接,並與我在PHP中開發的Web服務建立安全連接」意味着,每當我嘗試獲得JSON響應時,我都希望通過HTTPS而不是HTTP建立連接。 – Pedro 2014-09-28 14:37:02

+0

你嘗試了什麼?你得到了什麼錯誤? – SLaks 2014-09-28 14:37:57

回答

0

您需要設置您的HTTP客戶端使用SNI(或者,也可以獲得專用IP地址)。

具體內容因安卓版本而異。
請參閱this blog post

+0

我已經知道這個解決方案,但即使如此,我也感謝您的回覆。問題是,這並不能幫助我,因爲我的APP支持Android 2.3(薑餅)及以上版本,並且該博客上解釋的解決方案適用於Android 4.2+ :( – Pedro 2014-10-05 22:06:49

+0

)您確定嗎?http://stackoverflow.com/a/589 5320/34397如果是這樣,你需要一個專用的IP地址。 – SLaks 2014-10-05 23:10:05

+0

那麼,在這種情況下,我絕對需要一個專用的IP地址! :( 謝謝。 – Pedro 2014-10-06 00:18:39