>>分享Android开发相关的技术 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 21009 个阅读者 刷新本主题
 * 贴子主题:  Android网络编程之Http通信 回复文章 点赞(0)  收藏  
作者:flybird    发表时间:2020-01-07 09:22:21     消息  查看  搜索  好友  邮件  复制  引用

      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.                        //我们在每一行后面加上一个"
    "来换行  
  12.                       resultData += inputLine +  "
    " ;  
  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方式进行传输时,需要进行字符编码。



----------------------------
原文链接:https://blog.51cto.com/52android/496621



[这个贴子最后由 flybird 在 2020-01-07 20:22:53 重新编辑]
  Java面向对象编程-->第一个Java程序
  JavaWeb开发-->Servlet技术详解(Ⅱ)
  JSP与Hibernate开发-->Java应用分层架构及软件模型
  Java网络编程-->用Spring整合CXF发布Web服务
  精通Spring-->Vue CLI脚手架工具
  Vue3开发-->通过Axios访问服务器
  android 自动化测试之MonkeyRunner学习
  Android开发实践:用脚本编译Android工程
  Android的Service和广播的讲解
  Android ListView滑动加载
  Android JSON网络数据交换
  Android线程处理简述
  在Window中下载Android源代码的步骤
  Android那些事儿之LBS定位
  Android开发实践:用脚本编译Android工程
  浅析Android的通知系统
  安卓隐藏标题栏方法
  Android性能优化之视图篇(渲染机制)_移动开发_Applicaton的...
  Android端使用OpenGL ES加载OBJ文件数据
  Android 架构
  uniapp安卓ios百度人脸识别、活体检测、人脸采集APP原生插件
  更多...
 IPIP: 已设置保密
树形列表:   
1页 0条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


中文版权所有: JavaThinker技术网站 Copyright 2016-2026 沪ICP备16029593号-2
荟萃Java程序员智慧的结晶,分享交流Java前沿技术。  联系我们
如有技术文章涉及侵权,请与本站管理员联系。