免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1755 | 回复: 2
打印 上一主题 下一主题

Android网络编程之Http通信 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-01-19 21:19 |只看该作者 |倒序浏览
Android网络编程之Http通信








Android中提供的HttpURLConnection和HttpClient接口可以用来开发HTTP程序。以下是本人在学习中的总结与归纳。
1. HttpURLConnection接口
    首先需要明确的是,Http通信中的POST和GET请求方式的不同。GET可以获得静态页面,也可以把参数放在URL字符串后面,传递给服务器。而POST方法的参数是放在Http请求中。因此,在编程之前,应当首先明确使用的请求方法,然后再根据所使用的方式选择相应的编程方式。
    HttpURLConnection是继承于URLConnection类,二者都是抽象类。其对象主要通过URL的openConnection方法获得。创建方法如下代码所示:
Java代码
  1. URL url = new URL("http://www.51cto.com/index.jsp?par=123456");     
  2. HttpURLConnection urlConn=(HttpURLConnection)url.openConnection();  

  3.         URL url = new URL("http://www.51cto.com/index.jsp?par=123456");  
  4.         HttpURLConnection urlConn=(HttpURLConnection)url.openConnection();   

  5.     通过以下方法可以对请求的属性进行一些设置,如下所示:
  6. Java代码  
  7. //设置输入和输出流     
  8. urlConn.setDoOutput(true);     
  9. urlConn.setDoInput(true);   
  10. //设置请求方式为POST     
  11. urlConn.setRequestMethod("POST");     
  12. //POST请求不能使用缓存     
  13. urlConn.setUseCaches(false);   
  14. //关闭连接   
  15. urlConn.disConnection();  

  16.         //设置输入和输出流  
  17.         urlConn.setDoOutput(true);  
  18.         urlConn.setDoInput(true);
  19.         //设置请求方式为POST  
  20.         urlConn.setRequestMethod("POST");  
  21.         //POST请求不能使用缓存  
  22.         urlConn.setUseCaches(false);
  23.         //关闭连接
  24.         urlConn.disConnection();
复制代码
HttpURLConnection默认使用GET方式,例如下面代码所示:

Java代码
  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.     //我们在每一行后面加上一个"\n"来换行     
  11.     resultData += inputLine + "\n";   
  12. }   
  13. //关闭InputStreamReader   
  14. in.close();   
  15. //关闭http连接     
  16. urlConn.disconnect();   

  17.         //使用HttpURLConnection打开连接
  18.         HttpURLConnection urlConn = (HttpURLConnection)url.openConnection();
  19.         //得到读取的内容(流)
  20.         InputStreamReader in = new InputStreamReader(urlConn.getInputStream());
  21.         // 为输出创建BufferedReader
  22.         BufferedReader buffer = new BufferedReader(in);  
  23.         String inputLine = null;
  24.         //使用循环来读取获得的数据  
  25.         while (((inputLine = buffer.readLine()) != null))   {
  26.                 //我们在每一行后面加上一个"\n"来换行  
  27.                 resultData += inputLine + "\n";
  28.         }
  29.         //关闭InputStreamReader
  30.         in.close();
  31.         //关闭http连接  
  32.         urlConn.disconnect();
复制代码
如果需要使用POST方式,则需要setRequestMethod设置。代码如下:
Java代码
  1. String httpUrl = "http://192.168.1.110:8080/httpget.jsp";   
  2.         // 获得的数据   
  3.         String resultData = "";   
  4.         URL url = null;   
  5.         try {   
  6.             // 构造一个URL对象   
  7.             url = new URL(httpUrl);   
  8.         } catch (MalformedURLException e) {   
  9.             Log.e("", "MalformedURLException");   
  10.         }   
  11.         if (url != null) {   
  12.             try {   
  13.                 // 使用HttpURLConnection打开连接   
  14.                 HttpURLConnection urlConn = (HttpURLConnection) url   
  15.                         .openConnection();   
  16.                 // 因为这个是post请求,设立需要设置为true   
  17.                 urlConn.setDoOutput(true);   
  18.                 urlConn.setDoInput(true);   
  19.                 // 设置以POST方式   
  20.                 urlConn.setRequestMethod("POST");   
  21.                 // Post 请求不能使用缓存   
  22.                 urlConn.setUseCaches(false);   
  23.                 urlConn.setInstanceFollowRedirects(true);   
  24.                 // 配置本次连接的Content-type,配置为application/x-www-form-urlencoded的   
  25.                 urlConn.setRequestProperty("Content-Type",   
  26.                         "application/x-www-form-urlencoded");   
  27.                 // 连接,从postUrl.openConnection()至此的配置必须要在connect之前完成,   
  28.                 // 要注意的是connection.getOutputStream会隐含的进行connect。   
  29.                 urlConn.connect();   
  30.                 // DataOutputStream流   
  31.                 DataOutputStream out = new DataOutputStream(   
  32.                         urlConn.getOutputStream());   
  33.                 // 要上传的参数   
  34.                 String content = "par="  
  35.                         + URLEncoder.encode("ABCDEFG", "gb2312");   
  36.                 // 将要上传的内容写入流中   
  37.                 out.writeBytes(content);   
  38.                 // 刷新、关闭   
  39.                 out.flush();   
  40.                 out.close();   
  41.             }   

  42. String httpUrl = "http://192.168.1.110:8080/httpget.jsp";
  43.                 // 获得的数据
  44.                 String resultData = "";
  45.                 URL url = null;
  46.                 try {
  47.                         // 构造一个URL对象
  48.                         url = new URL(httpUrl);
  49.                 } catch (MalformedURLException e) {
  50.                         Log.e("", "MalformedURLException");
  51.                 }
  52.                 if (url != null) {
  53.                         try {
  54.                                 // 使用HttpURLConnection打开连接
  55.                                 HttpURLConnection urlConn = (HttpURLConnection) url
  56.                                                 .openConnection();
  57.                                 // 因为这个是post请求,设立需要设置为true
  58.                                 urlConn.setDoOutput(true);
  59.                                 urlConn.setDoInput(true);
  60.                                 // 设置以POST方式
  61.                                 urlConn.setRequestMethod("POST");
  62.                                 // Post 请求不能使用缓存
  63.                                 urlConn.setUseCaches(false);
  64.                                 urlConn.setInstanceFollowRedirects(true);
  65.                                 // 配置本次连接的Content-type,配置为application/x-www-form-urlencoded的
  66.                                 urlConn.setRequestProperty("Content-Type",
  67.                                                 "application/x-www-form-urlencoded");
  68.                                 // 连接,从postUrl.openConnection()至此的配置必须要在connect之前完成,
  69.                                 // 要注意的是connection.getOutputStream会隐含的进行connect。
  70.                                 urlConn.connect();
  71.                                 // DataOutputStream流
  72.                                 DataOutputStream out = new DataOutputStream(
  73.                                                 urlConn.getOutputStream());
  74.                                 // 要上传的参数
  75.                                 String content = "par="
  76.                                                 + URLEncoder.encode("ABCDEFG", "gb2312");
  77.                                 // 将要上传的内容写入流中
  78.                                 out.writeBytes(content);
  79.                                 // 刷新、关闭
  80.                                 out.flush();
  81.                                 out.close();
  82.                         }
复制代码
2. HttpClient接口
    使用Apache提供的HttpClient接口同样可以进行HTTP操作。
    对于GET和POST请求方法的操作有所不同。GET方法的操作代码示例如下:


Java代码
  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.     String strResult = EntityUtils.toString(httpResponse.getEntity());   
  13.      mTextView.setText(strResult);   
  14. } else {   
  15.      mTextView.setText("请求错误!");   
  16. }  

  17.                 // http地址
  18.                 String httpUrl = "http://192.168.1.110:8080/httpget.jsp?par=HttpClient_android_Get";
  19.                 // HttpGet连接对象
  20.                 HttpGet httpRequest = new HttpGet(httpUrl);
  21.                 // 取得HttpClient对象
  22.                 HttpClient httpclient = new DefaultHttpClient();
  23.                 // 请求HttpClient,取得HttpResponse
  24.                 HttpResponse httpResponse = httpclient.execute(httpRequest);
  25.                 // 请求成功
  26.                 if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
  27.                         // 取得返回的字符串
  28.                         String strResult = EntityUtils.toString(httpResponse.getEntity());
  29.                          mTextView.setText(strResult);
  30.                 } else {
  31.                          mTextView.setText("请求错误!");
  32.                 }
复制代码
使用POST方法进行参数传递时,需要使用NameValuePair来保存要传递的参数。,另外,还需要设置所使用的字符集。代码如下所示:
Java代码
  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.             String strResult = EntityUtils.toString(httpResponse.getEntity());   
  21.              mTextView.setText(strResult);   
  22.         } else {   
  23.              mTextView.setText("请求错误!");   
  24.         }  

  25. // http地址
  26.                 String httpUrl = "http://192.168.1.110:8080/httpget.jsp";
  27.                 // HttpPost连接对象
  28.                 HttpPost httpRequest = new HttpPost(httpUrl);
  29.                 // 使用NameValuePair来保存要传递的Post参数
  30.                 List<NameValuePair> params = new ArrayList<NameValuePair>();
  31.                 // 添加要传递的参数
  32.                 params.add(new BasicNameValuePair("par", "HttpClient_android_Post"));
  33.                 // 设置字符集
  34.                 HttpEntity httpentity = new UrlEncodedFormEntity(params, "gb2312");
  35.                 // 请求httpRequest
  36.                 httpRequest.setEntity(httpentity);
  37.                 // 取得默认的HttpClient
  38.                 HttpClient httpclient = new DefaultHttpClient();
  39.                 // 取得HttpResponse
  40.                 HttpResponse httpResponse = httpclient.execute(httpRequest);
  41.                 // HttpStatus.SC_OK表示连接成功
  42.                 if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
  43.                         // 取得返回的字符串
  44.                         String strResult = EntityUtils.toString(httpResponse.getEntity());
  45.                          mTextView.setText(strResult);
  46.                 } else {
  47.                          mTextView.setText("请求错误!");
  48.                 }
  49.   
复制代码
HttpClient实际上是对Java提供方法的一些封装,在HttpURLConnection中的输入输出流操作,在这个接口中被统一封装成了HttpPost(HttpGet)和HttpResponse,这样,就减少了操作的繁琐性。

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

原文地址:http://52android.blog.51cto.com/2554429/496621

论坛徽章:
0
2 [报告]
发表于 2012-01-19 22:05 |只看该作者
谢谢分享

论坛徽章:
0
3 [报告]
发表于 2012-01-23 23:58 |只看该作者
学习了啊。谢谢分享。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP