Android网络编程之Http通信

Android中提供的HttpURLConnection和HttpClient接口可以用来开发HTTP程序。以下是本人在学习中的总结与归纳。
1.
HttpURLConnection接口

   
首先需要明确的是,Http通信中的POST和GET请求方式的不同。GET可以获得静态页面,也可以把参数放在URL字符串后面,传递给服务器。而POST方法的参数是放在Http请求中。因此,在编程之前,应当首先明确使用的请求方法,然后再根据所使用的方式选择相应的编程方式。
   
HttpURLConnection是继承于URLConnection类,二者都是抽象类。其对象主要通过URL的openConnection方法获得。创建方法如下代码所示:




  1. URL url = new URL("http://www.51cto.com/index.jsp?par=123456");

  2. HttpURLConnection urlConn=(HttpURLConnection)url.openConnection();

通过以下方法可以对请求的属性进行一些设置,如下所示:




  1. //设置输入和输出流

  2. urlConn.setDoOutput(true);

  3. urlConn.setDoInput(true);

  4. //设置请求方式为POST

  5. urlConn.setRequestMethod("POST");

  6. //POST请求不能使用缓存

  7. urlConn.setUseCaches(false);

  8. //关闭连接

  9. urlConn.disConnection();

HttpURLConnection默认使用GET方式,例如下面代码所示:




  1. //使用HttpURLConnection打开连接

  2. HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();

  3. //得到读取的内容(流)

  4. InputStreamReader in = new InputStreamReader(urlConn.getInputStream());

  5. // 为输出创建BufferedReader

  6. BufferedReader buffer = new BufferedReader(in);

  7. String inputLine = null;

  8. //使用循环来读取获得的数据

  9. while (((inputLine = buffer.readLine()) != null))

  10. {

  11. //我们在每一行后面加上一个"\n"来换行

  12. resultData += inputLine + "\n";

  13. }

  14. //关闭InputStreamReader

  15. in.close();

  16. //关闭http连接

  17. urlConn.disconnect();

如果需要使用POST方式,则需要setRequestMethod设置。代码如下:




  1. String httpUrl = "http://192.168.1.110:8080/httpget.jsp";

  2. //获得的数据

  3. String resultData = "";

  4. URL url = null;

  5. try

  6. {

  7. //构造一个URL对象

  8. url = new URL(httpUrl);

  9. }

  10. catch (MalformedURLException e)

  11. {

  12. Log.e(DEBUG_TAG, "MalformedURLException");

  13. }

  14. if (url != null)

  15. {

  16. try

  17. {

  18. // 使用HttpURLConnection打开连接

  19. HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();

  20. //因为这个是post请求,设立需要设置为true

  21. urlConn.setDoOutput(true);

  22. urlConn.setDoInput(true);

  23. // 设置以POST方式

  24. urlConn.setRequestMethod("POST");

  25. // Post 请求不能使用缓存

  26. urlConn.setUseCaches(false);

  27. urlConn.setInstanceFollowRedirects(true);

  28. // 配置本次连接的Content-type,配置为application/x-www-form-urlencoded的

  29. urlConn.setRequestProperty("Content-Type","application/x-www-form-urlencoded");

  30. // 连接,从postUrl.openConnection()至此的配置必须要在connect之前完成,

  31. // 要注意的是connection.getOutputStream会隐含的进行connect。

  32. urlConn.connect();

  33. //DataOutputStream流

  34. DataOutputStream out = new DataOutputStream(urlConn.getOutputStream());

  35. //要上传的参数

  36. String content = "par=" + URLEncoder.encode("ABCDEFG", "gb2312");

  37. //将要上传的内容写入流中

  38. out.writeBytes(content);

  39. //刷新、关闭

  40. out.flush();

  41. out.close();



2.
HttpClient接口
   
使用Apache提供的HttpClient接口同样可以进行HTTP操作。
   
对于GET和POST请求方法的操作有所不同。GET方法的操作代码示例如下:




  1. // http地址

  2. String httpUrl = "http://192.168.1.110:8080/httpget.jsp?par=HttpClient_android_Get";

  3. //HttpGet连接对象

  4. HttpGet httpRequest = new HttpGet(httpUrl);

  5. //取得HttpClient对象

  6. HttpClient httpclient = new DefaultHttpClient();

  7. //请求HttpClient,取得HttpResponse

  8. HttpResponse httpResponse = httpclient.execute(httpRequest);

  9. //请求成功

  10. if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK)

  11. {

  12. //取得返回的字符串

  13. String strResult = EntityUtils.toString(httpResponse.getEntity());

  14. mTextView.setText(strResult);

  15. }

  16. else

  17. {

  18. mTextView.setText("请求错误!");

  19. }

  20. }

使用POST方法进行参数传递时,需要使用NameValuePair来保存要传递的参数。,另外,还需要设置所使用的字符集。代码如下所示:




  1. // http地址

  2. String httpUrl = "http://192.168.1.110:8080/httpget.jsp";

  3. //HttpPost连接对象

  4. HttpPost httpRequest = new HttpPost(httpUrl);

  5. //使用NameValuePair来保存要传递的Post参数

  6. List<NameValuePair> params = new ArrayList<NameValuePair>();

  7. //添加要传递的参数

  8. params.add(new BasicNameValuePair("par", "HttpClient_android_Post"));

  9. //设置字符集

  10. HttpEntity httpentity = new UrlEncodedFormEntity(params, "gb2312");

  11. //请求httpRequest

  12. httpRequest.setEntity(httpentity);

  13. //取得默认的HttpClient

  14. HttpClient httpclient = new DefaultHttpClient();

  15. //取得HttpResponse

  16. HttpResponse httpResponse = httpclient.execute(httpRequest);

  17. //HttpStatus.SC_OK表示连接成功

  18. if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK)

  19. {

  20. //取得返回的字符串

  21. String strResult = EntityUtils.toString(httpResponse.getEntity());

  22. mTextView.setText(strResult);

  23. }

  24. else

  25. {

  26. mTextView.setText("请求错误!");

  27. }

  28. }

HttpClient实际上是对Java提供方法的一些封装,在HttpURLConnection中的输入输出流操作,在这个接口中被统一封装成了HttpPost(HttpGet)和HttpResponse,这样,就减少了操作的繁琐性。

另外,在使用POST方式进行传输时,需要进行字符编码。

http://52android.blog.51cto.com/2554429/496621

时间: 2025-01-09 17:39:47

Android网络编程之Http通信的相关文章

Android网络编程之Socket通信

Socket(套接字)是一种通信机制,可以实现单机或跨网络进行通信,其创建需要明确的区分C(客户端)/S(服务器端),支持多个客户端连接到同一个服务器.有两种传输模式: 1).面向连接的传输:基于TCP协议,可靠性高,但效率低: 2).面向无连接的传输:基于UDP协议,可靠性低,但效率高: Android中,直接采用Socket通信应该是我们遇到的最低级的网络运用.尽管已经作了很大程度的抽象,但是纯粹的Socket通信,仍然给开发者留下很多细节需要处理,尤其在服务器端,开发者需要处理多线程以及数

Java网络编程之Socket通信(二)

之前在前面已经介绍了Socket通信的一些基本原理,以及如何让客户端与服务器端建立通信,和实现通信的一些基本步骤(包括首先使得服务器端与客户端建立连接,建立连接之后,服务器端开始侦听客户端的请求,侦听到客户端的请求之后,通过输入输出流处理相关信息实现通信,最后通信完毕结束通信等一系列流程). 但是之前只是单个客户端与服务器进行通信,而我们实际应用中单个客户端的情况几乎不存在,都是多个客户端同时与服务器进行交互(这里同时交互就会出现并发性的问题,对于并发性的问题暂时还不是很懂,只知道有这个概念),

android网络编程之pull解析xml

android网络编程之pull解析xml 除了前面介绍过的SAX以及DOM方法,还可以通过Pull对xml文档进行一个解析.Pull解析器的解析方式与SAX非常相似.它提供了类似的事件,使用parser.next()可以进入下一元素并触发相应事件,事件将作为数值代码被发送,因此可以使用一个switch对感兴趣的事件进行选择,然后进行相应的处理,调用parser.nextText()方法可以获取下一个Text类型元素的值. pull解析器特点: *结构简单:一个接口.一个例外.一个工厂就组成了P

Android网络编程之http发送/请求服务

最近在学习Android网络编程的知识,以下是今晚学习的一些心得.与大家共同分享. 在实际的应用开发中很多时候需要app向服务器请求数据,那么app如何发送请求呢?下面的代码就是其中的一种情况,使用HttpURLConnection向服务器发送请求的数据,然后处理服务器返回的数据. 下面的代码只是客户端的一个简答测试代码.还需要在pc上安装一个 tomcat服务器 ,然后将demo中的jsp文件部署到tomcat上,具体的方法百度一下便知. package com.lee.nethttp; im

Android网络编程之Apache接口

一,通过Apache接口访问网络所必须的类 HttpClient 概述 ---HttpClient 是 Apache Jakarta Common 下的子项目,可以用来提供高效的.最新的.功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议.(摘自百度百科) 成员变量 构造方法 ---DefaultHttpClient() 普通方法 ---execute()//发送请求,需要一个表示请求方法的对象作为参数,返回一个封装了响应信息的HttpResponse对

android网络编程之HttpUrlConnection的讲解--实现文件断点下载

1.没有实现服务器端,下载地址为网上的一个下载链接. 2.网络开发不要忘记在配置文件中添加访问网络的权限 <uses-permission android:name="android.permission.INTERNET"/> 3.网络请求.处理不能在主线程中进行,一定要在子线程中进行.因为网络请求一般有1~3秒左右的延时,在主线程中进行造成主线程的停顿,对用户体验来说是致命的.(主线程应该只进行UI绘制,像网络请求.资源下载.各种耗时操作都应该放到子线程中). 4.断点

Java网络编程之TCP通信

一.概述 Socket类是Java运行clientTCP操作的基础类,这个类本身使用代码通过主机操作系统的本地TCP栈进行通信. Socket类的方法会建立和销毁连接,设置各种Socket选项. ServerSocket类是Java执行server端操作的基础类,该类执行于server,监听入站TCP连接.每一个socketserver监听server的某个port.当远程主机的client尝试连接此port时.server就被唤醒.并返回一个表示两台主机之间socket的正常Socket对象.

android网络编程之HttpUrlConnection的讲解--GET请求

1.服务器后台使用Servlet开发,这里不再介绍. 2.网络开发不要忘记在配置文件中添加访问网络的权限 <uses-permission android:name="android.permission.INTERNET"/> 3.网络请求.处理不能在主线程中进行,一定要在子线程中进行.因为网络请求一般有1~3秒左右的延时,在主线程中进行造成主线程的停顿,对用户体验来说是致命的.(主线程应该只进行UI绘制,像网络请求.资源下载.各种耗时操作都应该放到子线程中). 4. p

android网络编程之HttpUrlConnection的讲解--上传大文件

1.服务器后台使用Servlet开发,这里不再介绍. 2.网络开发不要忘记在配置文件中添加访问网络的权限 <uses-permission android:name="android.permission.INTERNET"/> 3.网络请求.处理不能在主线程中进行,一定要在子线程中进行.因为网络请求一般有1~3秒左右的延时,在主线程中进行造成主线程的停顿,对用户体验来说是致命的.(主线程应该只进行UI绘制,像网络请求.资源下载.各种耗时操作都应该放到子线程中). 4.传输