问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何使用androidhttpclient访问web服务

发布网友 发布时间:2022-04-22 06:01

我来回答

1个回答

热心网友 时间:2023-07-23 13:27

HttpClient 与 HttpURLConnection 共用 SessionId

下面给出访问服务器的截图,向后滑动有http协议那一章,里面与源码,例子来自android学习手册,里面有源码。android学习手册包含9个章节,108个例子,源码文档随便看,例子都是可交互,可运行,源码采用android studio目录结构,高亮显示代码,文档都采用文档结构图显示,可以快速定位。360手机助手中下载,图标上有贝壳:

            HttpClient 与 HttpUrlConnection 是Android 中HTTP操作最常见的访问方式。在一个应用程序中有时候会用到这两种方式,如何能让他们共用Cookie,让客户端访问服务器保持Session进行通信。

针对httpClient 和HttpUrlConnection 获取和发送Cookie,主要是sessionID的共享。

        httpClient获取及发送Session 值:     

[java] view plain copy print?

   

           

     HttpPost httpPost = new HttpPost(url);  

       

          // 将SessionId发给服务器  

     if(null != mSESSIONID){  

        httpPost.setHeader("Cookie", "SESSIONID=" + mSESSIONID);  

    }   

     

     DefaultHttpClient httpClient = new DefaultHttpClient();  

     httpResponse = httpClient.execute(httpPost);  

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

             HttpEntity entity = httpResponse.getEntity();  

   

         CookieStore mCookieStore = httpClient.getCookieStore();  

        List<Cookie> cookies = mCookieStore.getCookies();  

        //这里是读取指定Cookie 的值  

        for (int i = 0; i < cookies.size(); i++) {   

            if ("SESSIONID".equals(cookies.get(i).getName())) {   

               mSESSIONID = cookies.get(i).getValue();  

               break;  

        }   

          

    }  

}  


       
  HttpPost httpPost = new HttpPost(url);

         // 将SessionId发给服务器
  if(null != mSESSIONID){
httpPost.setHeader("Cookie", "SESSIONID=" + mSESSIONID);
}
 
DefaultHttpClient httpClient = new DefaultHttpClient();
httpResponse = httpClient.execute(httpPost);
if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
    HttpEntity entity = httpResponse.getEntity();

CookieStore mCookieStore = httpClient.getCookieStore();
 List<Cookie> cookies = mCookieStore.getCookies();
//这里是读取指定Cookie 的值
for (int i = 0; i < cookies.size(); i++) {
if ("SESSIONID".equals(cookies.get(i).getName())) {
    mSESSIONID = cookies.get(i).getValue();
  break;
}

}
}

在程序中保存上面的sessionId ,或用全局变量,或者SharedPreferences 保存,看这个sessionId 的会话时间及程序业务。  

    HttpUrlConnection 获取及发送Session 值:

[java] view plain copy print?

HttpURLConnection url_con = null;  

URL url = new URL(reqUrl);  

url_con = (HttpURLConnection) url.openConnection();  

//设置session  

if (mSESSIONID!= null) {  

    url_con.setRequestProperty("Cookie","JSESSIONID="+mSESSIONID);  

    }  

...  

String cookieVal =con.getHeaderField("Set-Cookie");  

// 获取session      

if (cookieVal != null) {  

        StringmSESSIONID= cookieVal.substring(0, cookieVal.indexOf(";"));  

}         

HttpURLConnection url_con = null;  

HttpURLConnection url_con = null;
URL url = new URL(reqUrl);
url_con = (HttpURLConnection) url.openConnection();
//设置session
if (mSESSIONID!= null) {
url_con.setRequestProperty("Cookie","JSESSIONID="+mSESSIONID);
}
...
String cookieVal =con.getHeaderField("Set-Cookie");
// 获取session
if (cookieVal != null) {
StringmSESSIONID= cookieVal.substring(0, cookieVal.indexOf(";"));
}      
HttpURLConnection url_con = null;

HttpURLConnection和HttpClient比较(Android):

     

HttpURLConnection和HttpClient 都支持HTTPS协议、IPv6、以流的形式进行上传和下载、配置超时时间、以及连接池等功能。

         

DefaultHttpClient和它的兄弟AndroidHttpClient都是HttpClient具体的实现类,它们都拥有众多的API,而且实现比较稳定,bug数量也很少。但同时也由于HttpClient的API数量过多,使得我们很难在不破坏兼容性的情况下对它进行升级和扩展,所以目前Android团队在提升和优化HttpClient方面的工作态度并不积极。


 
HttpURLConnection是一种多用途、轻量极的HTTP客户端,使用它来进行HTTP操作可以适用于大多数的应用程序。虽然HttpURLConnection的API提供的比较简单,但是同时这也使得我们可以更加容易地去使用和扩展它。不过在Android 2.2版本之前,HttpURLConnection一直存在着一些令人厌烦的bug。比如说对一个可读的InputStream调用close()方法时,就有可能会导致连接池失效了。那么我们通常的解决办法就是直接禁用掉连接池的功能:
 
        在Android 2.3版本中还增加了一些HTTPS方面的改进,现在HttpsURLConnection会使用SNI(Server Name Indication)的方式进行连接,使得多个HTTPS主机可以共享同一个IP地址。除此之外,还增加了一些压缩和会话的机制。如果连接失败,它会自动去尝试重新进行连接。这使得HttpsURLConnection可以在不破坏老版本兼容性的前提下,更加高效地连接最新的服务器。


在Android 4.0版本中,我们又添加了一些响应的缓存机制。当缓存被安装后(调用HttpResponseCache的install()方法),所有的HTTP请求都会满足以下三种情况:

1.所有的缓存响应都由本地存储来提供。因为没有必要去发起任务的网络连接请求,所有的响应都可以立刻获取到。
2.视情况而定的缓存响应必须要有服务器来进行更新检查。比如说客户端发起了一条类似于 “如果/foo.png这张图片发生了改变,就将它发送给我” 这样的请求,服务器需要将更新后的数据进行返回,或者返回一个304 Not Modified状态。如果请求的内容没有发生,客户端就不会下载任何数据。
3.没有缓存的响应都是由服务器直接提供的。这部分响应会在稍后存储到响应缓存中。


由于这个功能是在4.0之后的版本才有的,通常我们就可以使用反射的方式来启动响应缓存功能。下面的示例代码展示了如何在Android 4.0及以后的版本中去启用响应缓存的功能,同时还不会影响到之前的版本:
   

[java] view plain copy print?

private void enableHttpResponseCache() {    

   try {    

       long httpCacheSize = 10 * 1024 * 1024; // 10 MiB    

       File httpCacheDir = new File(getCacheDir(), "http");    

       Class.forName("android.net.http.HttpResponseCache")    

           .getMethod("install", File.class, long.class)    

           .invoke(null, httpCacheDir, httpCacheSize);    

   } catch (Exception httpResponseCacheNotAvailable) {    

   }    

     

private void enableHttpResponseCache() {  
   try {  
       long httpCacheSize = 10 * 1024 * 1024; // 10 MiB  
       File httpCacheDir = new File(getCacheDir(), "http");  
       Class.forName("android.net.http.HttpResponseCache")  
           .getMethod("install", File.class, long.class)  
           .invoke(null, httpCacheDir, httpCacheSize);  
   } catch (Exception httpResponseCacheNotAvailable) {  
   }  
}  

     你也应该同时配置一下你的Web服务器,在HTTP响应上加入缓存的消息头。


哪一种才是最好的?


在Android 2.2版本之前,HttpClient拥有较少的bug,因此使用它是最好的选择。
而在Android 2.3版本及以后,HttpURLConnection则是最佳的选择。它的API简单,体积较小,因而非常适用于Android项目。压缩和缓存机制可以有效地减少网络访问的流量,在提升速度和省电方面也起到了较大的作用。对于新的应用程序应该更加偏向于使用HttpURLConnection。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
本田思域压缩机保多久 本田思域06款空调压力传感器线颜色 两道关于导数的题。(要详细过程、谢谢) 2011廊坊会计从业资格考试座位号是双号可是老师给发的是A卷怎么办 听说今年廊坊会计从业资格证卡单不卡双,是真的吗? 廊坊考出纳证怎么找? ...专业的,未接触过会计相关科目,我想报考会计从业资格证。 请问我自... 身上很痒,手上痒的地方都是有一个小水泡,挠穿了又痛又痒,天气热的时候... 洲星马蹄粉做的糕点口感如何? 洲星马蹄粉做出的糕点如何? 如何使用androidhttpclient访问web服务 在一个项目里面有android端和web端(服务器自建的)... 在一个项目里面有android端和web端(服务器自建的)... android 有没有类似webview的控件? android 有没有类似webview的控件? 医道圣手小说txt全集免费下载 android webview 怎样监听HTML中的按钮并得到按钮... android webview 怎样监听HTML中的按钮并得到按钮... 找一本现代都市的小说。 内容是关于医术类的。 全本都市小说 要主角会医术【中医 】会武术 webview 跟android.webkit.webview有什么区别 webview 跟android.webkit.webview有什么区别 都市异能医生文,类似超级仙医的,不要种马的,单女... 如何在android上支持webgl cdr钢笔工具&nbsp;绘制曲线后&nbsp;怎么直接绘制直线 求好看的都市异能类的小说。百万字以上 但是像 异... web app和android app的区别 coreldraw中钢笔工具怎样在画直线和曲线间切换 android webview怎么刷新网页 求都市小说,要医生类的 Web开发和Android有什么关系? Web开发和Android有什么关系? android开发和javaweb开发技术差异有多大 android开发和javaweb开发技术差异有多大 选择android还是java web? 选择android还是java web? 初级社工考试答案出来了吗 社工面视题及答案 社工初级考试难吗? 社会工作者多选题作答攻略分享 社工证怎么复习 初级社工师考试有多少道题 社会工作师备考需要准备哪些? 初级社工考试难吗?通过率高不高? 怎么写微信推广软文 连续两天梦到自己男朋友跟他前任和好了,把我一个人... 微信互粉加人什么样的软文吸引人 梦到女友和她前男友和好了,还上床了。 有什么不好的 微信免费送东西活动软文怎么写更吸引人? 有木有推... 微信商如何利用写软文招揽顾客,友友?