2017-08-26 147 views
0

我正在製作一個應用程序,用於在數據庫中存儲一些數據,然後檢索它。 在服務器端,我正在使用PHP,而在客戶端,我有這個文件獲取輸入並將其傳遞給PHP文件。從服務器接收響應錯誤?

new AsyncTask<String, String, String>() { 

       JSONParser jsonParser = new JSONParser(); 
       private ProgressBar pBar; 
       private String url_post_pet = "http://192.168.0.13/Android/post_pet.php"; 

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

       /** 
       * Before starting background thread Show Progress Dialog 
       */ 
       @Override 
       protected void onPreExecute() { 
        super.onPreExecute(); 
        //pBar = new ProgressBar(); 
        //pBar.setIndeterminate(false); 
        //pBar.setVisibility(View.VISIBLE); 
       } 

       @Override 
       protected String doInBackground(String... args) { 
        // Building Parameters 
        HashMap<String, String> params = new HashMap<>(); 
        params.put("name", a); 
        params.put("breed", BREED); 
        params.put("type", TYPE); 
        params.put("images", "Whatever"); 
        params.put("description", c); 
        params.put("coords", b); 

        // getting JSON Object 
        // Note that create product url accepts POST method 
        JSONObject json = jsonParser.makeHttpRequest(url_post_pet, 
          "POST", params); 
        // check log cat for 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(getApplicationContext(), MainActivity.class); 
          startActivity(i); 

          // closing this screen 
          finish(); 
         } else { 
          // failed to create product 
         } 
        } catch (JSONException e) { 
         System.out.println("exception" + e); 
         e.printStackTrace(); 
        } 
        System.out.println("nul"); 
        return null; 
       } 

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

     } 
    }); 
} 

而且,我這有JSONParser:

public class JSONParser { 

String charset = "UTF-8"; 
HttpURLConnection conn; 
DataOutputStream wr; 
StringBuilder result; 
URL urlObj; 
JSONObject jObj = null; 
StringBuilder sbParams; 
String paramsString; 

public JSONObject makeHttpRequest(String url, String method, 
            HashMap<String, String> params) { 

    sbParams = new StringBuilder(); 
    int i = 0; 
    for (String key : params.keySet()) { 
     try { 
      if (i != 0){ 
       sbParams.append("&"); 
      } 
      sbParams.append(key).append("=") 
        .append(URLEncoder.encode(params.get(key), charset)); 

     } catch (UnsupportedEncodingException e) { 
      e.printStackTrace(); 
     } 
     i++; 
    } 

    if (method.equals("POST")) { 
     // request method is POST 
     try { 
      urlObj = new URL(url); 
      conn = (HttpURLConnection) urlObj.openConnection(); 
      conn.setDoOutput(true); 
      conn.setRequestMethod("POST"); 
      conn.setRequestProperty("Accept-Charset", charset); 
      conn.setReadTimeout(10000); 
      conn.setConnectTimeout(15000); 
      conn.connect(); 

      paramsString = sbParams.toString(); 

      wr = new DataOutputStream(conn.getOutputStream()); 
      wr.writeBytes(paramsString); 
      wr.flush(); 
      wr.close(); 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
    else if(method.equals("GET")){ 
     // request method is GET 

     if (sbParams.length() != 0) { 
      url += "?" + sbParams.toString(); 
     } 

     try { 
      urlObj = new URL(url); 
      conn = (HttpURLConnection) urlObj.openConnection(); 
      conn.setDoOutput(false); 
      conn.setRequestMethod("GET"); 
      conn.setRequestProperty("Accept-Charset", charset); 
      conn.setConnectTimeout(15000); 
      conn.connect(); 

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

    } 

    try { 
     //Receive the response from the server 
     InputStream in = new BufferedInputStream(conn.getInputStream()); 
     BufferedReader reader = new BufferedReader(new InputStreamReader(in)); 
     result = new StringBuilder(); 
     String line; 
     while ((line = reader.readLine()) != null) { 
      result.append(line); 
     } 

     Log.d("JSON Parser", "result: " + result.toString()); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    conn.disconnect(); 

    // try parse the string to a JSON object 
    try { 
     System.out.println(jObj); 
     jObj = new JSONObject(result.toString()); 
    } catch (JSONException e) { 
     Log.e("JSON Parser", "Error parsing data " + e.toString()); 
    } 

    // return JSON Object 
    return jObj; 
} 

這是錯誤我得到我每次提交數據:

08-26 12:51: 08/2365089-5156/chtecnologies.myapplication D/JSON解析器:result:08-26 12:51:08.239 5089-5156/chtecnologies.myapplication E/JSON解析器:解析數據時出錯org.json.JSONException:字符0處的輸入結束 08-26 12:51:08.793 5089-5096/chtecnologie s.myapplication W/art:暫停所有線程花費:190.496ms 08-26 12:51:09.245 5089-5096/chtecnologies.myapplication W/art:暫停所有線程花費:137.277ms 08-26 12:51:09.267 5089-5156/chtecnologies.myapplication E/AndroidRuntime:致命異常:AsyncTask#1 進程:chtecnologies.myapplication,PID:5089 java.lang.RuntimeException:執行doInBackground()時發生錯誤() at android.os.AsyncTask $ 3 .done(AsyncTask.java:304) 在java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355) 在java.util.concurrent.FutureTask.setException(FutureTask.java:222) 在java.util中.concurrent.FutureTask.ru n(FutureTask.java:242) at android.os.AsyncTask $ SerialExecutor $ 1.run(AsyncTask.java:231) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) at java.util .concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:587) at java.lang.Thread.run(Thread.java:818) 引起:java.lang.NullPointerException:試圖調用虛擬方法java.lang .String org.json.JSONObject.toString()'空對象引用 at chtecnologies.myapplication.PostPet $ 4 $ 1.doInBackground(PostPet.java:154) at chtecnologies.myapplication.PostPet $ 4 $ 1.doInBackground(PostPet.java :118) at android.os.AsyncTask $ 2.call(AsyncTask.java:292) at java.util.concurrent.FutureTask.run(FutureTask.java:237) at android.os.AsyncTask $ SerialExecutor $ 1.run(AsyncTask.java :231) 在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 在java.util.concurrent.ThreadPoolExecutor中$ Worker.run(ThreadPoolExecutor.java:587) 在java.lang.Thread.run (Thread.java:818)

數據成功進入數據庫,但似乎JSONParser中存在問題,比不能得到PHP文件的結果。

你能告訴我JSONParser文件或其他地方有什麼問題嗎?這是我第一次在我的應用中實現服務器,我希望你能幫助我!謝謝

回答

1

你發送數據的方式看起來很腥。如果你想在發送POST數據使用HttpURLConnection

String postParam = "name=" + a + "&breed=" + BREED + "&type=" + "&images=" + 
         Whatever + "&description=" + c + "&coords=" + b; 

try{ 
       URL url = new URL(url); 
       HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 

       connection.setRequestMethod("POST"); 
       connection.setDoOutput(true); 
       connection.setDoInput(true); 
       connection.setRequestProperty("Content-type", "application/x-www-form-urlencoded"); 

       OutputStream os = connection.getOutputStream(); 
       os.write(postParam.getBytes()); 
       os.flush(); 
       os.close(); 

       // Fetching the response code 
       responseCode = connection.getResponseCode(); 
       Log.d(TAG, "POST Response Code: " + responseCode); 
} catch(Exception e) { 
       e.printStackTrace(); 
} 

connection.setRequestMethod - 要與GET/POST

connection.setDoOutput(真)發送您的數據集的方法 - 以讓你送輸出

connection.setDoInput(真) - 讓你發送數據(如果有的話)

後接收輸入

希望這能解決您的問題!

相關問題