2015-03-31 53 views
-1

當我嘗試通過註冊用戶向數據庫添加一些數據時,我的應用程序出現問題,問題是如果php腳本中有任何錯誤或者它沒有返回json我收到錯誤和活動強制停止,而如果php中沒有錯誤並正確返回json,則所有函數都正常工作,所以我想檢查服務器的響應以知道它是否有效,所以我可以避免錯誤,下面是我的代碼:如何檢查服務器響應是否是json?

import android.app.Activity; 
import android.app.ProgressDialog; 
import android.content.Intent; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.Toast; 
import org.apache.http.NameValuePair; 
import org.apache.http.message.BasicNameValuePair; 
import org.json.JSONException; 
import org.json.JSONObject; 
import java.util.ArrayList; 
import java.util.List; 

public class Register extends Activity { 

    Button back; 
    Button register; 
    EditText iname; 
    EditText iemail; 
    EditText ireEmail; 
    EditText ipassword; 
    EditText irePassword; 
    EditText iid; 
    EditText iphone; 
    EditText iaddress1; 
    EditText iaddress2; 


    // Progress Dialog 
    private ProgressDialog pDialog; 

    JSONParser jsonParser = new JSONParser(); 

    // url to create new product 
    private static String url_register = "http://192.168.0.103/perfectdelivery/register.php"; 

    // JSON Node names 
    private static final String TAG_SUCCESS = "success"; 

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

     iname = (EditText) findViewById(R.id.editText1); 
     iemail = (EditText) findViewById(R.id.editText2); 
     ireEmail = (EditText) findViewById(R.id.editText3); 
     ipassword = (EditText) findViewById(R.id.editText4); 
     irePassword = (EditText) findViewById(R.id.editText5); 
     iid = (EditText) findViewById(R.id.editText6); 
     iphone = (EditText) findViewById(R.id.editText7); 
     iaddress1 = (EditText) findViewById(R.id.editText8); 
     iaddress2 = (EditText) findViewById(R.id.editText9); 

     back = (Button) findViewById(R.id.button1); 
     register = (Button) findViewById(R.id.button2); 

     back.setOnClickListener(myhandler1); 
     register.setOnClickListener(myhandler2); 
    } 

    View.OnClickListener myhandler1 = new View.OnClickListener() { 
     public void onClick(View v) { 
      Intent intent = new Intent(Register.this, MainPage.class); 
      startActivity(intent); 
     } 
    }; 

    View.OnClickListener myhandler2 = new View.OnClickListener() { 
     public void onClick(View v) { 
      new NewAccount().execute(); 
     } 
    }; 

    /** 
    * Background Async Task to Create new product 
    */ 
    class NewAccount extends AsyncTask<String, String, String> { 

     /** 
     * Before starting background thread Show Progress Dialog 
     */ 
     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      pDialog = new ProgressDialog(Register.this); 
      pDialog.setMessage("Registering..."); 
      pDialog.setIndeterminate(false); 
      pDialog.setCancelable(true); 
      pDialog.show(); 
     } 

     /** 
     * Creating product 
     */ 
     protected String doInBackground(String... args) { 
      String name = iname.getText().toString(); 
      String email = iemail.getText().toString(); 
      String reEmail = ireEmail.getText().toString(); 
      String password = ipassword.getText().toString(); 
      String rePassword = irePassword.getText().toString(); 
      String id = iid.getText().toString(); 
      String phone = iphone.getText().toString(); 
      String address1 = iaddress1.getText().toString(); 
      String address2 = iaddress2.getText().toString(); 



      // Building Parameters 
      List<NameValuePair> params = new ArrayList<NameValuePair>(); 
      params.add(new BasicNameValuePair("name", name)); 
      params.add(new BasicNameValuePair("email", email)); 
      params.add(new BasicNameValuePair("password", password)); 
      params.add(new BasicNameValuePair("id", id)); 
      params.add(new BasicNameValuePair("phone", phone)); 
      params.add(new BasicNameValuePair("address1", address1)); 
      params.add(new BasicNameValuePair("address2", address2)); 

      // getting JSON Object 
      // Note that create product url accepts POST method 
      JSONObject json = jsonParser.makeHttpRequest(url_register, 
        "POST", params); 

      if(json != null) { 

       // check log cat fro response 
       Log.d("Create Response", json.toString()); 

       // check for success tag 
       try { 
        int success = json.getInt(TAG_SUCCESS); 

        if (success == 1) { 
         // successfully created product 
         Intent i = new Intent(Register.this, MainPage.class); 
         startActivity(i); 

         // closing this screen 
         finish(); 
        } else { 
         // failed to create product 
        } 
       } catch (JSONException e) { 
        e.printStackTrace(); 
       } 
      } 

      else{ 

       Toast.makeText(getApplicationContext(), "An error occurred, please try again", Toast.LENGTH_LONG).show(); 
      } 

      return null; 
     } 

     /** 
     * After completing background task Dismiss the progress dialog 
     * * 
     */ 
     protected void onPostExecute(String file_url) { 
      // dismiss the dialog once done 
      pDialog.dismiss(); 
     } 

    } 
} 
+0

在try catch中解析它。如果有錯誤,它會通過塊和錯誤在json中.. chears .. !! – 2015-03-31 09:43:28

+1

假設服務器正確設置了「Content-Type」頭字段,您可能會在嘗試處理響應正文之前檢查該字段。如果返回json,則該值應該是'application/json'。如果返回錯誤(大概不是json),它可能是例如'text/html'或'text/plain'。你應該能夠從你正在使用的任何http客戶/連接的響應對象中獲取頭文件。 – 2015-03-31 09:47:11

+0

@MH。你能寫一個示例代碼PLZ – Mohammad 2015-03-31 09:51:28

回答

2

按照先前的評論:正確假定服務器設置Content-Type頭字段的響應,你可能試圖處理響應體之前檢查了點。

也就是說,如果返回json,則標頭值應爲application/json。如果返回錯誤(大概不是json格式,否則你的問題將是一個爭議點),它可能是例如text/htmltext/plain。只要服務器響應包含「成功」和「錯誤」的不同內容類型值,它究竟是什麼並不重要。

檢查Content-Type頭看起來有點像這樣:

HttpResponse response = ... 
Header contentTypeHeader = response.getFirstHeader("Content-Type"); 
if ("application/json".equals(contentTypeHeader.getValue()) { 
    // server returned json 
} else { 
    // server returned something else, potentially an error 
} 

由你來實現實際的行爲和處理null值等

0

,當你在onPostExecute(得到了輸入反應)只是嘗試通過在JSONObject的構造函數中傳遞該響應來將該字符串轉換爲json對象。看到下面的代碼

try { 
    JSONObject json = new JSONObject("your_output"); 
} catch (JSONException e) { 
    // your output is not in json format 
    e.printStackTrace(); 
} 

所以,如果你的輸出是JSON格式的對象創建成功。否則它會拋出異常。

相關問題