2016-06-09 117 views
0

我有一个类的静态函数来发出一个POST请求到Web服务器。到目前为止,它正在为我所做的每个请求工作,但是我添加了一个新的.php文件,它在新脚本的函数调用中引发了FileNotFound异常。我通过浏览器和邮差测试它,并且脚本正常工作。android-Java抛出我FileNotFound异常HttpURLConnection

类/功能:

public class WebServices { 
public static final String CONNECTION_URL = "http://192.168.1.101/klikniobrok/"; 
public static final String LOGIN = "login.php"; 
public static final String REGISTER = "register.php"; 
public static final String RESTAURANTS = "restaurant.php"; 
public static final String MENU = "menu.php"; 
public static final String MENU_ENTRIES = "menuentries.php"; 
public static final String EMPLOYEE_LOGIN = "employeelogin.php"; 
public static final String GET_TABLE = "table.php"; 
public static final String ADD_ORDER = "insertorder.php"; 
public static final String RETRIEVE_ACTIVE_ORDERS = "activeorders.php"; 
public static final String COMPLETE_ORDER = "completeorder.php"; 

public static JSONObject makeHttpPostRequest(List<Pair<String, String>> params, String action) { 
    JSONObject requestResponse; 
    try { 
     StringBuilder postData = new StringBuilder(); 
     if(params != null) { 
      for (int i = 0; i < params.size(); i++) { 
       if (postData.length() != 0) { 
        postData.append("&"); 
       } 
       postData.append(URLEncoder.encode(params.get(i).first, "UTF-8")); 
       postData.append("="); 
       postData.append(URLEncoder.encode(params.get(i).second, "UTF-8")); 
      } 
     } 
     byte[] postDataBytes = postData.toString().getBytes("UTF-8"); 
     URL connUrl = new URL(CONNECTION_URL + action); 
     HttpURLConnection connection = (HttpURLConnection) connUrl.openConnection(); 
     connection.setRequestMethod(HttpMethods.POST); 
     connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 
     connection.setRequestProperty("Content-Length", String.valueOf(postDataBytes.length)); 
     connection.setDoOutput(true); 
     connection.setDoInput(true); 
     if(postDataBytes.length > 0) { 
      connection.getOutputStream().write(postDataBytes); 
     } 
     BufferedReader requestInputReader = new BufferedReader(new InputStreamReader(connection.getInputStream(), 
       "UTF-8")); 
     StringBuilder requestInput = new StringBuilder(); 
     for(String line = requestInputReader.readLine(); line != null; line = requestInputReader.readLine()) { 
      requestInput.append(line).append("\n"); 
     } 
     requestInputReader.close(); 
     connection.disconnect(); 
     requestResponse = new JSONObject(requestInput.toString()); 
    } catch (MalformedURLException e) { 
     e.printStackTrace(); 
     requestResponse = null; 
    } catch (IOException e) { 
     e.printStackTrace(); 
     requestResponse = null; 
    } catch (JSONException e) { 
     e.printStackTrace(); 
     requestResponse = null; 
    } 
    return requestResponse; 
} 

和异常:

06-10 00:09:52.606 12561-13302/mk.klikniobrok.klikniobrok W/System.err: java.io.FileNotFoundException: http://192.168.1.101/klikniobrok/completeorder.php 
06-10 00:09:52.606 12561-13302/mk.klikniobrok.klikniobrok W/System.err:  at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:258) 
06-10 00:09:52.606 12561-13302/mk.klikniobrok.klikniobrok W/System.err:  at mk.klikniobrok.klikniobrok.WebServices.makeHttpPostRequest(WebServices.java:59) 
06-10 00:09:52.606 12561-13302/mk.klikniobrok.klikniobrok W/System.err:  at mk.klikniobrok.klikniobrok.helpers.CompleteOrder.doInBackground(OrderProcessor.java:37) 
06-10 00:09:52.606 12561-13302/mk.klikniobrok.klikniobrok W/System.err:  at mk.klikniobrok.klikniobrok.helpers.CompleteOrder.doInBackground(OrderProcessor.java:31) 
06-10 00:09:52.606 12561-13302/mk.klikniobrok.klikniobrok W/System.err:  at android.os.AsyncTask$2.call(AsyncTask.java:295) 
06-10 00:09:52.606 12561-13302/mk.klikniobrok.klikniobrok W/System.err:  at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
06-10 00:09:52.606 12561-13302/mk.klikniobrok.klikniobrok W/System.err:  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234) 
06-10 00:09:52.606 12561-13302/mk.klikniobrok.klikniobrok W/System.err:  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) 
06-10 00:09:52.606 12561-13302/mk.klikniobrok.klikniobrok W/System.err:  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) 
06-10 00:09:52.607 12561-13302/mk.klikniobrok.klikniobrok W/System.err:  at java.lang.Thread.run(Thread.java:818) 
06-10 00:09:52.608 12561-12561/mk.klikniobrok.klikniobrok W/System.err: java.lang.NullPointerException: Attempt to invoke virtual method 'int org.json.JSONObject.getInt(java.lang.String)' on a null object reference 
06-10 00:09:52.608 12561-12561/mk.klikniobrok.klikniobrok W/System.err:  at mk.klikniobrok.klikniobrok.helpers.OrderProcessor.setOrderCompeted(OrderProcessor.java:164) 
06-10 00:09:52.608 12561-12561/mk.klikniobrok.klikniobrok W/System.err:  at mk.klikniobrok.klikniobrok.ActiveOrdersActivity$2.onClick(ActiveOrdersActivity.java:103) 
06-10 00:09:52.608 12561-12561/mk.klikniobrok.klikniobrok W/System.err:  at android.view.View.performClick(View.java:5226) 
06-10 00:09:52.608 12561-12561/mk.klikniobrok.klikniobrok W/System.err:  at android.view.View$PerformClick.run(View.java:21266) 
06-10 00:09:52.608 12561-12561/mk.klikniobrok.klikniobrok W/System.err:  at android.os.Handler.handleCallback(Handler.java:739) 
06-10 00:09:52.608 12561-12561/mk.klikniobrok.klikniobrok W/System.err:  at android.os.Handler.dispatchMessage(Handler.java:95) 
06-10 00:09:52.608 12561-12561/mk.klikniobrok.klikniobrok W/System.err:  at android.os.Looper.loop(Looper.java:168) 
06-10 00:09:52.608 12561-12561/mk.klikniobrok.klikniobrok W/System.err:  at android.app.ActivityThread.main(ActivityThread.java:5781) 
06-10 00:09:52.608 12561-12561/mk.klikniobrok.klikniobrok W/System.err:  at java.lang.reflect.Method.invoke(Native Method) 
06-10 00:09:52.608 12561-12561/mk.klikniobrok.klikniobrok W/System.err:  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:797) 
06-10 00:09:52.608 12561-12561/mk.klikniobrok.klikniobrok W/System.err:  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:687) 

后续空指针异常是第一个结果。

到函数的调用:

class CompleteOrder extends AsyncTask<Pair<String, String>, Void, JSONObject> { 
    @Override 
    protected JSONObject doInBackground(Pair<String, String>... params) { 
     return WebServices.makeHttpPostRequest(Arrays.asList(params), WebServices.COMPLETE_ORDER); 
    } 

    @Override 
    protected void onPostExecute(JSONObject response) { 
     // other logic here 
    } 
} 

正如我所说,用于张贴到其他脚本时,功能适用于其他“动作”,即。例如,我可以在单击调用该方法的按钮之前登录。这是为什么发生?

回答

1

FileNotFoundException发生是因为服务器给了你一个404 Not Found响应。

您需要查看服务器和/或服务器端日志返回的URL和/或“错误页面”文档,找出服务器为什么这样做。

正如我所说,用于张贴到其他脚本

显然... 东西是不同的,当该功能适用​​于其他“动作”,即。

+0

准确地说,如果您调用'getInputStream()',则404映射到'FileNotFoundException'。如果您先调用getResponseCode(),您将获得404,并且您可以通过getErrorStream()读取错误页面。 – EJP

+0

按照您的建议检查服务器日志,发现错误。仍然习惯于PHP,我一直忘记可以在服务器日志中找到执行错误。 –