我有一个Android应用程序向包含一些NameValuePairs的服务器发出HTTP发布请求,并且它可以在任何wifi网络上正常工作,但是当我使用相同的http帖子超过3g时,服务器获取一个http请求空虚的身体。这是请求的代码
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网络的同一台计算机时,没有任何问题。这太奇怪了。想法?
答案 0 :(得分:0)
我的建议是使用Google的Volley库进行联网。在Android上进行网络连接时,它几乎是目前最好的选择。这真的不应该是3G问题。如果是,您的问题可能是孤立的。
在这里你可以看一些资源(凌空很容易使用):
https://developers.google.com/events/io/sessions/325304728 https://developer.android.com/training/volley/index.html
答案 1 :(得分:0)
解决了,问题是服务器没有正确读取有多个tcp数据报的请求,看起来像android拆分tcp数据报超过3g