【问题标题】:Why http post on android fails over 3g?为什么 android 上的 http post 在 3g 上失败了?
【发布时间】:2014-10-14 19:39:25
【问题描述】:

我有一个 android 应用程序向包含一些 NameValuePairs 的服务器发出 HTTP post 请求,它在任何 wifi 网络上都可以正常工作,但是当我在 3g 上使用相同的 http post 时,服务器会收到一个带有空的身体。这是请求的代码

            List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(
                    3);
            nameValuePairs.add(new BasicNameValuePair("Name", params[0]));
            nameValuePairs.add(new BasicNameValuePair("DNI", params[1]));
            nameValuePairs.add(new BasicNameValuePair("Token", params[2]));

            URL url = new URL(URL_SERVER);
            HttpURLConnection conn = (HttpURLConnection) url
                    .openConnection();
            conn.setReadTimeout(30000);
            conn.setConnectTimeout(50000);
            conn.setRequestMethod("POST");
            conn.setDoInput(true);
            conn.setDoOutput(true);

            OutputStream os = conn.getOutputStream();
            BufferedWriter writer = new BufferedWriter(
                    new OutputStreamWriter(os, "UTF-8"));
            writer.write(getQuery(nameValuePairs));
            writer.flush();
            writer.close();
            os.close();

            conn.connect();
            int responseCode = conn.getResponseCode();
            BufferedReader in;
            if (responseCode == 404)
                in = new BufferedReader(new InputStreamReader(
                        conn.getErrorStream()));
            else
                in = new BufferedReader(new InputStreamReader(
                        conn.getInputStream()));
            String inputLine;
            StringBuffer response = new StringBuffer();

            while ((inputLine = in.readLine()) != null) {
                response.append(inputLine);
            }
            in.close();

这里是getQuery方法的代码

private String getQuery(List<NameValuePair> params)
        throws UnsupportedEncodingException {
    StringBuilder result = new StringBuilder();
    boolean first = true;

    for (NameValuePair pair : params) {
        if (first)
            first = false;
        else
            result.append("&");

        result.append(URLEncoder.encode(pair.getName(), "UTF-8"));
        result.append("=");
        result.append(URLEncoder.encode(pair.getValue(), "UTF-8"));
    }

    return result.toString();
}

知道为什么会这样吗?

我有新信息。我制作了一个表格,通过网络浏览器发送 http 帖子。这种形式效果很好,可以在 Windows 手机和 wifi 上通过 3g 完美发送身体。但是,当我尝试使用超过 3g 的 android 手机的 chrome 发送 http 帖子时,它是空的,而且如果我尝试从连接到我的 android 手机热点的一台计算机发送 http 帖子,它会失败。当我尝试使用连接到 wifi 网络的同一台计算机时,完全没有问题。这太奇怪了。想法?

【问题讨论】:

  • 不用了,谢谢。有什么问题吗?

标签: android http post 3g


【解决方案1】:

我的建议是使用 Google 的 Volley 库进行联网。在 Android 网络方面,它几乎是目前最好的选择。真的不应该是3G的问题。如果是,您的问题可能是一个孤立的问题。

这里有一些资源可以看(volley 真的好用):

https://developers.google.com/events/io/sessions/325304728 https://developer.android.com/training/volley/index.html

【讨论】:

    【解决方案2】:

    解决了,问题是服务器没有正确读取有多个tcp数据报的请求,貌似android将tcp数据报拆分为3g

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-18
      • 2012-01-10
      • 1970-01-01
      • 2015-08-07
      • 2018-12-22
      • 1970-01-01
      • 2020-05-01
      相关资源
      最近更新 更多