您的位置:首页 > 理论基础 > 计算机网络

【Android】【嘿!Java】Android工程、Java工程中通过HttpClient请求网络数据的不同方式

2014-08-23 10:54 676 查看
问题描述

最近,写App时遇到了一个奇怪的问题:博主的App中需要向服务器以GET方式发送网络请求,之前博主没怎么写过这方面的代码,为了方便调试,就建了一个Java工程,用的是较新版本4.3的HttpComponents,调试好后将代码复制到Android里时,出现了如下图所示的报错,并提示“The method setConfig(RequestConfig) is undefined for the type HttpGet”,说明HttpGet没有setConfig()这个方法




为什么博主说奇怪呢,因为在Java工程里用到的有关网络请求的类来自下图这7个包里的,博主虽不知道HttpGet来自哪个包,但可以肯定它也是其中某个包的类。把代码复制到Android工程之前,博主已经将这6个包import进工程里,同一个类在Android工程和Java工程里拥有的方法怎么会不一样呢




原因分析

博主偶然发现了问题的原因,就是当把Android里上述的7个包删掉后,复制过来的代码里有关网络请求的类(包括HttpGet)都没有报错,唯一报错的还是上述用到setConfig()方法的那行代码。这说明Android工程里,有关网络请求的类不是来自博主import进的7个包!博主在网上一搜,Android已经成功集成了HttpClient,所以开发人员在Android项目中可以直接使用HttpClient来想Web站点提交请求以及接受响应。

有人也遇到类似的问题http://bbs.byr.cn/#!article/MobileTerminalAT/11174,这个贴子里楼主说:Android SDK里自带了org.apache.http.client.methods.HttpGet这个类,HttpComponents4.3里也同样有org.apache.http.client.methods.HttpGet这个类,两个类的路径完全一样,但前者没有httpGet.setConfig()这个方法,而后者有。并且Android工程优先引用了Androi
SDK里的类。


这就可以解释为什么同一个类在Android工程和Java工程里拥有的方法不一样,其实这个类来自不同的包,前者是Android SDK中的,后者是HttpComponents4.3里的。

解决办法

Java工程里通过HttpClient 4.3发送网络请求

首先说说在Java工程里以GET方法发送网络请求,主要参考利用HttpClient4访问网页里的代码,关于设置超时时间的部分主要参考HttpClient
4.3超时设置。另一篇文章HttpClient 4.3教程里有对HttpClient 4.3更详细的介绍,稍微复杂一些,有些问题想不明白的可以看看这个。

1. 在Tomcat官网http://hc.apache.org/downloads.cgi下载相关的包,博主下载的是HttpClient 4.3.5,Binary下的4.3.5.zip,其他压缩包具体有什么不同,博主也不是特别清楚,如果有清楚童鞋告诉博主呀




2. 将下载的文件解压缩,lib文件夹里的就是可以import进Java工程的包

3. po代码,这个里面只有GET方式,POST方式如果以后用到,调试好再po上来。

Android工程里通过HttpClient发送网络请求

上面说到Android SDK里没有setConfig方法,那么在Android里到底应该怎么使用HttpClient呢?博主参考了Android HttpClient基本使用方法这篇文章的代码,还是只写了GET方式的,如下

博主的代码里params使用字符串表示的,其实在博主参考的文章里给了更规范的方法,所以还是po一下它的代码。以下两段代码博主没有调试,仅作mark。

GET方式

//先将参数放入List,再对参数进行URL编码
List<BasicNameValuePair> params = new LinkedList<BasicNameValuePair>();
params.add(new BasicNameValuePair("param1", "中国"));
params.add(new BasicNameValuePair("param2", "value2"));

//对参数编码
String param = URLEncodedUtils.format(params, "UTF-8");

//baseUrl
String baseUrl = "http://ubs.free4lab.com/php/method.php";

//将URL与参数拼接
HttpGet getMethod = new HttpGet(baseUrl + "?" + param);

HttpClient httpClient = new DefaultHttpClient();

try {
HttpResponse response = httpClient.execute(getMethod); //发起GET请求

Log.i(TAG, "resCode = " + response.getStatusLine().getStatusCode()); //获取响应码
Log.i(TAG, "result = " + EntityUtils.toString(response.getEntity(), "utf-8"));//获取服务器响应内容
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}


POST方式

//和GET方式一样,先将参数放入List
params = new LinkedList<BasicNameValuePair>();
params.add(new BasicNameValuePair("param1", "Post方法"));
params.add(new BasicNameValuePair("param2", "第二个参数"));

try {
HttpPost postMethod = new HttpPost(baseUrl);
postMethod.setEntity(new UrlEncodedFormEntity(params, "utf-8")); //将参数填入POST Entity中

HttpResponse response = httpClient.execute(postMethod); //执行POST方法
Log.i(TAG, "resCode = " + response.getStatusLine().getStatusCode()); //获取响应码
Log.i(TAG, "result = " + EntityUtils.toString(response.getEntity(), "utf-8")); //获取响应内容

} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}


现在再对比一下Java工程里和Android工程里使用HttpClient代码,发现有很大不同,比如:HttpClient所属的类和new它的方式、设置超时的方式、HttpResponse所属的类……博主写这篇文章权当给自己备用,有疏漏的地方欢迎批评指正。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐