【问题标题】:Application suddenly stopped POSTing to DB, returning Status Code 406应用程序突然停止 POST 到 DB,返回状态码 406
【发布时间】:2012-12-04 18:52:24
【问题描述】:

我的应用程序通过几个不同的Asynctask 调用我们的服务器,它两次提取数据,最后通过 POST 发送一个JSONArray

它一直正常工作,但最近停止了,没有进行任何更改。这是我的AsyncTaskPOSTJSONArray,只有必要的信息:

更新的 JAVA

String inString;
JSONObject realjObject;
JSONArray compJArray;
int completeCount = 0;
URL url;
@Override
protected Void doInBackground(JSONArray... jsonArray) {
    if(jsonArray.length > 0) {
        compJArray = jsonArray[0];
    }
    completeCount = compJArray.length();

    //String url_select = "http://www.myDomain.com/db/completedSurvey.php";
    HttpResponse response;

    for (int i = 0; i < completeCount; i++) {
        try {
            realjObject = compJArray.getJSONObject(i);
            Log.i("realjObject", realjObject.toString());
            try {

                url = new URL("http://www.myDomain.com/db/completedSurvey.php");
                HttpPost httpPost = new HttpPost(url.toURI());
                HttpClient httpClient = new DefaultHttpClient();
                httpPost.setEntity(new StringEntity(realjObject.toString(), "UTF-8"));
                httpPost.setHeader(HTTP.DEFAULT_CONTENT_TYPE, "application/json");
                response = (HttpResponse) httpClient.execute(httpPost);

                BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent(), "UTF-8"));
                StringBuilder builder = new StringBuilder();
                for (String line = null; (line = reader.readLine()) != null;) {
                    builder.append(line).append("\n");
                }

                inString = builder.toString();
                Log.w("RESPONSE", inString);

            } catch (UnsupportedEncodingException e1) { Log.e("UnsupportedEncodingException", e1.toString());
            } catch (ClientProtocolException e2) { Log.e("ClientProtocolException", e2.toString());
            } catch (IllegalStateException e3) { Log.e("IllegalStateException", e3.toString());
            } catch (IOException e4) { Log.e("IOException", e4.toString());
            } catch (URISyntaxException e) {Log.e("URISyntaxException", "" + e.getMessage());
            }

        } catch (JSONException e) { Log.e("doInBackground", "JSONException: " + e.getMessage());
        }
    }
    return null;
}

这是我接收代码的方式,PHP-Server 端:

require("../logger/logging.class.php");

$genLog->lwrite("Is Android accessing this url?");
$json = file_get_contents('php://input');

$genLog->lwrite($json);

if ($json) {
    // Parse JSONArray, was working properly
}

如果我通过浏览器访问 url,我的日志写得非常好,但是在运行应用程序时没有写入任何内容。我已经测试了AsyncTask 中的所有输出,一切似乎都正常。


LogCatrealjObject 的输出(在 www.jsonlint.com 上验证)

{
    "Notes": "null",
    "SurveyPhoto": "null",
    "id": 2,
    "siteNotes": "",
    "loc_id": 1,
    "sign_type": "FREESTANDING SIGN",
    "Lighting": 0,
    "AdditionalService": 0,
    "view_id": 2,
    "survey_order": 1
}

编辑

我刚开始认为我的 require("../logger/logging.class.php"); 可能与 $json = file_get_contents('php://input'); 冲突,但我只是注释掉了我所有的日志记录和要求行,它仍然没有做任何事情。

设备已连接互联网并已与此 MySQL 数据库建立连接,否则我将无法提交 JSONArray

测试设备:运行 Android 4.0.1 的三星 Galaxy Tab 10.1 Gen 1

编辑 2

我修复了InputStream 给我一个回复,得到了以下 404 和 406 回复:

12-05 09:31:39.345: W/RESPONSE(19023): <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
12-05 09:31:39.345: W/RESPONSE(19023): <html><head>
12-05 09:31:39.345: W/RESPONSE(19023): <title>406 Not Acceptable</title>
12-05 09:31:39.345: W/RESPONSE(19023): </head><body>
12-05 09:31:39.345: W/RESPONSE(19023): <h1>Not Acceptable</h1>
12-05 09:31:39.345: W/RESPONSE(19023): <p>An appropriate representation of the requested resource /db/completeSurvey.php could not be found on this server.</p>
12-05 09:31:39.345: W/RESPONSE(19023): <p>Additionally, a 404 Not Found
12-05 09:31:39.345: W/RESPONSE(19023): error was encountered while trying to use an ErrorDocument to handle the request.</p>
12-05 09:31:39.345: W/RESPONSE(19023): <hr>
12-05 09:31:39.345: W/RESPONSE(19023): <address>Apache Server at www.myDomain.com Port 80</address>
12-05 09:31:39.345: W/RESPONSE(19023): </body></html>

什么会突然导致这种情况?

EDIT 3 - 我最近采取的故障排除步骤:

  1. 我已经联系了我们的网络主机,他们告诉我他们的一切都很好。 服务器日志 (error_log) 没有显示任何错误
  2. 我稍微更改了上面的 Java 以显示我的响应返回以及更改为使用 URL 类而不是 String 用于 new HttpPost(url.toURI());。 LogCat 显示正确的域,复制并粘贴到浏览器中,工作正常。
  3. 我已将 URL 更改为另一个文件,并将 /db/completeSurvey.php 内容放入新文件中,与上述相同的 404/406 响应。
  4. 我创建了另一个新的 php 文件,只包含一个 fwrite 来记录页面调用,与上述相同的 404/406 响应。
  5. 我定向到我们的根域“http://www.myDomain.com”,与上述相同的 404/406 响应

我开始认为它必须是设备或我的代码。

【问题讨论】:

    标签: php android arrays


    【解决方案1】:

    你想用这条线做什么inString = in.toString();?你在InputStream 上调用toString() 它不会返回响应数据。

    试试下面的代码来读取json:

    BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent(), "UTF-8"));
    StringBuilder builder = new StringBuilder();
    for (String line = null; (line = reader.readLine()) != null;) {
        builder.append(line).append("\n");
    }
    
    inString = builder.toString();
    

    【讨论】:

    • 我现在什么都没有做,最终我会到达一个点,我返回一个成功与否的响应代码。我的AsyncTask 没有从工作变为不工作。这不可能是问题。
    • 可以尝试的另一件事..尝试通过添加浏览器发送的所有标头来复制浏览器...可以通过转到以下 URL reliply.org/tools/requestheaders.php 来检查浏览器标头..只是为了检查可能是服务器允许来自浏览器的请求,但不允许来自应用程序的请求......
    • 试试这个:在 localhost 或 Google App Engine appengine.google.com.. 上托管您的页面,看看您是否可以访问它...如果可行,那么问题可能出在服务器提供商上.. .
    • 我发现这是一个与mod_security 中的规则匹配的脚本,我将它们禁用,现在一切正常。很抱歉把你拖到这里。如果您想更改与我发现的内容相关的答案,那么我将标记为已接受。
    • 我建议您将您的解决方案作为答案发布并接受它,以便其他人将来可以从中受益..
    【解决方案2】:

    我联系了我们的虚拟主机(Surpass Hosting)并给了他们以下信息:

    406 不可接受

    在此服务器上找不到请求资源 /db/completedSurvey.php 的适当表示。

    此外,在尝试使用 ErrorDocument 处理请求时遇到 404 Not Found 错误。

    Apache 服务器位于 www.myDomain.com 端口 80

    起初他们说我需要编写更多的日志记录代码来确定原因是什么,因为这不是他们的目标。

    最终我终于被派到了二级技术支持,那里的人立即给了我答案:


    解决方案:

    超越技术:
    “这是由于脚本匹配 mod_security 中的规则。我只为该文件禁用了此规则。”

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-18
      • 1970-01-01
      • 1970-01-01
      • 2020-07-30
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      • 2021-02-09
      相关资源
      最近更新 更多