使用HttpClient的HTTP Post请求需要2秒,为什么?
更新: 找到自己的答案,请参见下面:-)
嗨,使用HttpClient的HTTP Post请求需要2秒,为什么?
我'当前译码的Android应用程序,在使用HTTP POST和的AsyncTask后台提交的东西。我为此使用org.apache.http.client包。我根据我的代码this example。
基本上,我的代码看起来是这样的:
public void postData() {
// Create a new HttpClient and Post Header
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://192.168.1.137:8880/form");
try {
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
nameValuePairs.add(new BasicNameValuePair("id", "12345"));
nameValuePairs.add(new BasicNameValuePair("stringdata", "AndDev is Cool!"));
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
// Execute HTTP Post Request
HttpResponse response = httpclient.execute(httppost);
} catch (ClientProtocolException e) {
Log.e(TAG,e.toString());
} catch (IOException e) {
Log.e(TAG,e.toString());
}
}
的问题是httpclient.execute(..)线大约需要1.5至3秒,我不明白为什么。使用HTTP Get请求一个页面需要大约80毫秒左右,所以这个问题似乎并不是网络延迟本身。
该问题似乎并未出现在服务器端,我也尝试将数据发布到http://www.disney.com/,结果相似。在本地向我的服务器发送数据时,Firebug显示1毫秒的响应时间。
这发生在模拟器和我的Nexus One(都与Android 2.2)。
如果你想看完整的代码,我已经把它放在GitHub。
这只是一个虚拟程序,通过按下按钮在后台使用AsyncTask执行HTTP Post。这是我的第一个Android应用程序,也是我第一个很长时间的Java代码。并incidentially,也是我在*上的第一个问题;-)
httpclient.execute(httppost)需要这么长时间的任何想法?
好吧,我自己解决了这个问题,还有一些调查。我所要做的就是添加一个设置HTTP版本1.1的参数,如下所示:
HttpParams params = new BasicHttpParams();
params.setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
HttpClient httpclient = new DefaultHttpClient(params);
我从和书呆子和一些试验和错误发现这多亏了非常好的HttpHelper Class。
如果我没有记错,HTTP 1.0会为每个请求打开一个新的TCP连接。这是否解释了大的延迟?
HTTP POST请求现在需要在WLAN上50到150 ms之间,而在3G上需要300到500 ms之间的时间。
稍微简单一些(但相当于):HttpProtocolParams.setVersion(params,HttpVersion.HTTP_1_1); – 2011-04-05 14:15:43
而不是版本解决方法 - 为什么这个工作呢? - 我建议更直接的解决方案,'httppost.getParams()。setBooleanParameter(CoreProtocolPNames.USE_EXPECT_CONTINUE,false);' – 2011-06-09 12:29:04
伙计 - 我在随机搜索这个主题之间的测试为我的应用程序,因为它是如此之慢 - 这种变化使它尖叫。谢谢。 – bsautner 2013-01-14 21:17:40
我不是在android上,但是我在httpclient 4.0.1的windows平台上面对完全相同的问题,经过相当多的头部划伤之后,我找到了解决方案。
HttpParams params = new BasicHttpParams();
//this how tiny it might seems, is actually absoluty needed. otherwise http client lags for 2sec.
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
HttpClient httpClient = new DefaultHttpClient(params);
HttpResponse httpResponse;
HttpPost httpPost = new HttpPost("http://"+server+":"+port+"/");
StringEntity entity = new StringEntity(content, "utf-8");
entity.setContentType("text/plain; charset=utf-8");
httpPost.setEntity(entity);
httpResponse=httpClient.execute(httpPost);
String response = IOUtils.toString(httpResponse.getEntity().getContent(),encoding);
httpResponse.getEntity().consumeContent();
httpClient.getConnectionManager().shutdown();
return(response);
我不知道为什么使用HTTP1.1版本设置参数解决了问题。但它的确如此。 也更怪,如果执行HTTP Get请求,症状不会显示。无论如何,我希望这有助于一些在那里!
h
我遇到了这个完全相同的问题,除了更糟。它甚至可能需要20秒钟才能完成一个'HttpPost'。我尝试了你的修复,但它似乎没有帮助。 – theblang 2014-03-13 22:00:56