簡體   English   中英

從服務器接收響應時出錯?

[英]Error receiving response from the server?

我正在制作一個將一些數據存儲在數據庫中,然后將其檢索的應用程序。 在服務器端,我正在使用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.236 5089-5156 / chtecnologies.myapplication D / JSON解析器:結果:08-26 12:51:08.239 5089-5156 / chtecnologies.myapplication E / JSON解析器:解析數據org.json.JSONException時出錯:輸入結束於08-26 12:51:08.793 5089-5096 / chtecnologies.myapplication W的字符0:藝術:暫停所有線程占用: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:在java.util.concurrent.FutureTask的java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)的android.os.AsyncTask $ 3.done(AsyncTask.java:304)上執行doInBackground()時發生錯誤。 setException(FutureTask.java:222)在java.util.concurrent.FutureTask.run(FutureTask.java:242)在android.os.AsyncTask $ SerialExecutor $ 1.run(AsyncTask.java:231)在java.util.concurr ent.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:嘗試在chtecnologies.myapplication.PostPet $ 4 $ 1.doInBackground(PostPet.java:154)的chtecnologies.myapplication.PostPet上對空對象引用調用虛擬方法'java.lang.String org.json.JSONObject.toString()' .myapplication.PostPet $ 4 $ 1.doInBackground(PostPet.java:118)在android.os.AsyncTask $ 2.call(AsyncTask.java:292)在java.util.concurrent.FutureTask.run(FutureTask.java:237)在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)在java.lang.Thread.run(Thread.java:818)

數據已成功進入數據庫,但是JSONParser中似乎有一個問題,即無法獲得PHP文件的結果。

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

您發送數據的方式看起來很糟糕。 如果要在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(true) -讓您發送輸出

connection.setDoInput(true) -讓您在發送數據后接收輸入(如果有)

希望這能解決您的問題!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM