【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方式
POST方式
现在再对比一下Java工程里和Android工程里使用HttpClient代码,发现有很大不同,比如:HttpClient所属的类和new它的方式、设置超时的方式、HttpResponse所属的类……博主写这篇文章权当给自己备用,有疏漏的地方欢迎批评指正。
最近,写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所属的类……博主写这篇文章权当给自己备用,有疏漏的地方欢迎批评指正。
相关文章推荐
- Android_网络请求数据之HttpClient方式(核心代码)
- Android-网络请求数据使用apache httpclient v4
- java后台接收android客户端通过http方式发送的数据
- android通过httpClient请求获取JSON数据并且解析
- Android之网络----使用HttpClient发送HTTP请求(通过get方法获取数据)
- android通过httpClient请求获取JSON数据并且解析
- Android系列之网络(一)----使用HttpClient发送HTTP请求(通过get方法获取数据)
- Android网络编程之Http请求服务器数据(POST方式)
- Java基础知识强化之网络编程笔记18:Android网络通信之 使用HttpClient的Post / Get 方式读取网络数据(基于HTTP通信技术)
- Java基础知识强化之网络编程笔记17:Android网络通信之 使用Http的Post方式读取网络数据(基于HTTP通信技术)
- Android系列之网络(三)----使用HttpClient发送HTTP请求(分别通过GET和POST方法发送数据)
- Android网络编程之Http请求服务器数据(GET方式)
- android通过httpClient请求获取JSON数据并且解析
- Android系列之网络(一)----使用HttpClient发送HTTP请求(通过get方法获取数据)
- android通过httpClient请求获取JSON数据并且解析
- Android系列之网络(一)----使用HttpClient发送HTTP请求(通过get方法获取数据)
- Android系列之网络(一)----使用HttpClient发送HTTP请求(通过get方法获取数据)
- android通过httpClient请求获取JSON数据并且解析
- android通过httpClient请求获取JSON数据并且解析
- Android系列之网络(三)----使用HttpClient发送HTTP请求(分别通过GET和POST方法发送数据)