Volley自动获取以及存储Cookie

Volley 添加Cookie和获取服务器返回的一条或多条Cookie 之前项目里请求网络的代码都是采用原生的语句,如HttpURLConnection或者HttpClient,这种方式请求灵活度高,但是访问网络的速度慢,特别是在网络不好的情况下情况更糟, 而Volley是google官方极力推崇的一款网络请求框架,具体好处自不用多说.且因为它的继承性,在灵活度上也比原生的请求代码好一些,我们可以继承父类Request来实现我们自己的xxxRequest. 当采用 阅读详情

Volley是Google开发的一款android网络框架,非常适合小数据大并发的访问服务器,但Volley中没有提供Cookie方面的管理,幸好它是开源框架,下面就跟大家分享一下具体的修改流程:
提示:Http请求分为request和response,两者都有头信息,而Cookie的信息就是在头信息中进行传递,所以可以锁定,需要修改的地方在头信息相关的地方。

第一步:

通过查看源码发现,com.android.volley.toolbox.HurlStack.java文件中存在方法performRequest,在方法的下半部分是获取到了响应头的相关信息,所以在遍历响应头

for (Entry<String, List<String>> header : connection.getHeaderFields().entrySet()) {
            if (header.getKey() != null) {

在这段代码的下面添加以下代码:

// 将Cookie全部获取
if ("Set-Cookie".equals(header.getKey())) {
    StringBuilder mCookieStr = new StringBuilder();
    for (int i = 0; i < header.getValue().size(); i++) {
        if (i == header.getValue().size() - 1) {
            mCookieStr.append(header.getValue().get(i));
        } else {
            mCookieStr.append(header.getValue().get(i)
                    + "*end*");
        }
    }

    Header h = new BasicHeader(header.getKey(),
            mCookieStr.toString());
    response.addHeader(h);
} else {
    Header h = new BasicHeader(header.getKey(), header
            .getValue().get(0));
    response.addHeader(h);
}

说明:代码中默认只显示一条Set-Cookie响应头,显然这样不是我们想要的,因为Set-Cookie可能会存在多条数据,所以我们需要把所有的Set-Cookie拼接起来

第二步:

添加了Cookie信息到响应头中,那么接着就要进行获取,然后判断后进行存储。继续查看源码,找到com.android.volley.toolbox.BasicNetwork.java文件中的performRequest方法,在

httpResponse = mHttpStack.performRequest(request, headers);

这段代码下面添加

// Save Cookies @author Hunter
try {
    SaveCookies(httpResponse);
} catch (DateParseException e) {
    e.printStackTrace();
}

这个SaveCookies的方法是处理Cookie并存储的,代码如下:

    /**
     * @author Hunter
     * 用于保存Cookie的方法
     * @param httpResponse
     * @throws DateParseException 
     */
public void SaveCookies(HttpResponse httpResponse) throws DateParseException {
    Header[] headers = httpResponse.getHeaders("Set-Cookie");
    Cookie cookieBean = new Cookie();
    /** Cookie存储池 */
    List<Cookie> mCookieContiner = new ArrayList<Cookie>();

    if (headers == null || headers.length == 0)
        return;

    // 遍历Set-Cookie中的所有value
    for (int i = 0; i < headers.length; i++) {
        // 将每个value中以字符串"*end*"分割
        String cookie = headers[i].getValue();
        String[] cookievalues = cookie.split("\\*end\\*");
        // 遍历每个分割的数据得到多条cookie
        for (int j = 0; j < cookievalues.length; j++) {
            // 分割每个cookie得到各个属性
            String[] cookiePair = cookievalues[j].split(";");
            cookieBean = new Cookie();
            // 遍历每个属性 将对应的值插入
            for (int k = 0; k < cookiePair.length; k++) {
                String[] keyPair = cookiePair[k].split("=");
                String key = keyPair[0].trim();
                String value = keyPair.length > 1 ? keyPair[1].trim() : "";
                if("expires".equals(key)){
                    Date parseDate = DateUtils.parseDate(value);
                    cookieBean.setExpires(parseDate);
                }else if("domain".equals(key)){
                    cookieBean.setDomain(value);
                }else if("path".equals(key)){
                    cookieBean.setPath(value);
                }else{
                    cookieBean.setKey(key);
                    cookieBean.setValue(value);
                }
            }
            // 存储每个cookie到cookie存储池中
            mCookieContiner.add(cookieBean);
            MyApplication.setCookies(mCookieContiner);
        }
    }

    MyCookieDao cookieDao = MyCookieDao.getInstance(MyApplication.getInstance());
    cookieDao.saveCookieLists(mCookieContiner);
}

上面的方法用到了第三方数据库框架GreenDao,其中Cookie实体类的代码是:

package com.example.android;

// THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT. Enable "keep" sections if you want to edit. 
/**
 * Entity mapped to table COOKIE.
 */
public class Cookie {

    private Long id;
    /** Not-null value. */
    private String key;
    private String value;
    private String domain;
    private String path;
    private java.util.Date expires;

    public Cookie() {
    }

    public Cookie(Long id) {
        this.id = id;
    }

    public Cookie(Long id, String key, String value, String domain,
            String path, java.util.Date expires) {
        this.id = id;
        this.key = key;
        this.value = value;
        this.domain = domain;
        this.path = path;
        this.expires = expires;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    /** Not-null value. */
    public String getKey() {
        return key;
    }

    /**
     * Not-null value; ensure this value is available before it is saved to the
     * database.
     */
    public void setKey(String key) {
        this.key = key;
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

    public String getDomain() {
        return domain;
    }

    public void setDomain(String domain) {
        this.domain = domain;
    }

    public String getPath() {
        return path;
    }

    public void setPath(String path) {
        this.path = path;
    }

    public java.util.Date getExpires() {
        return expires;
    }

    public void setExpires(java.util.Date expires) {
        this.expires = expires;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Cookie other = (Cookie) obj;
        if (key == null || other.key == null) {
            return false;
        } else if (!key.equals(other.key))
            return false;
        return true;
    }

}

该方法是自动生成的,不会使用的朋友可以去查找GreenDao的相关资料。

第三步:

完成后自定义一个MyCookieDao,用于操作Cookie的存储与删除等,代码如下:

package com.example.android.dao;

import java.util.List;

import org.apache.http.client.methods.HttpUriRequest;

import com.example.android.Cookie;
import com.example.android.CookieDao;
import com.example.android.DaoSession;
import com.example.android.Note;
import com.example.android.NoteDao;
import com.example.android.app.MyApplication;
import com.example.android.utils.CommonUtils;
import com.example.android.utils.LogUtils;

import android.content.Context;

/**
 * 测试数据库操作类,用于操作sqlite
 * 
 * @author Ht
 * 
 */
public class MyCookieDao {
    private static MyCookieDao mInstance;
    private DaoSession mDaoSession;

    private CookieDao cookieDao;

    private MyCookieDao() {
    }

    public static MyCookieDao getInstance(Context context) {
        if (mInstance == null) {
            mInstance = new MyCookieDao();
            mInstance.mDaoSession = MyApplication.getDaoSession(context);
            mInstance.cookieDao = mInstance.mDaoSession.getCookieDao();
        }

        return mInstance;
    }

    /**
     * 增加或修改某条数据
     * 
     * @param note
     */
    public void saveCookie(Cookie cookie) {
        cookieDao.insertOrReplace(cookie);
    }

    /**
     * 批量添加数据(开启线程)
     * 
     * @param list
     */
    public void saveCookieLists(final List<Cookie> list) {
        if (list == null || list.isEmpty()) {
            return;
        }
        cookieDao.getSession().runInTx(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < list.size(); i++) {
                    Cookie cookie = list.get(i);
                    // 查询要插入的数据是否已存在
                    Cookie cacheCookie = queryCookie("where KEY=?",
                            cookie.getKey());
                    // 没有有效期的Cookie无需存储
                    if (cookie.getExpires() != null) {
                        // 已存在的Cookie直接更新
                        if (cacheCookie != null) {
                            cookie.setId(cacheCookie.getId());
                        }

                        cookieDao.insertOrReplace(cookie);
                    }
                }
            }
        });
    }

    /**
     * 删除指定id的数据
     * 
     * @param id
     */
    public void deleteCookie(long id) {
        cookieDao.deleteByKey(id);
    }

    /**
     * 删除指定的数据
     * 
     * @param note
     */
    public void deleteCookie(Cookie cookie) {
        cookieDao.delete(cookie);
    }

    /**
     * 删除全部数据
     */
    public void deleteAllCookie() {
        cookieDao.getSession().runInTx(new Runnable() {

            @Override
            public void run() {
                cookieDao.deleteAll();
            }
        });
    }

    /**
     * 查找指定数据
     * 
     * @param id
     * @return
     */
    public Cookie loadCookie(long id) {
        return cookieDao.load(id);
    }

    /**
     * 查找全部数据
     * 
     * @return
     */
    public List<Cookie> loadAllCookie() {
        return cookieDao.loadAll();
    }

    /**
     * 获取当前Cookie
     * 
     * @return
     */
    public String getCookiesHeader(String url) {
        List<Cookie> cookies = loadAllCookie();
        StringBuilder cookieStr = new StringBuilder();
        for (int i = 0; i < cookies.size(); i++) {
            // 验证Cookie的有效性
            if (CommonUtils.checkCookie(url, cookies.get(i))) {
                // 验证通过,拼接Cookie
                if (i == cookies.size() - 1) {
                    cookieStr.append(cookies.get(i).getKey() + "="
                            + cookies.get(i).getValue());
                } else {
                    cookieStr.append(cookies.get(i).getKey() + "="
                            + cookies.get(i).getValue() + ";");
                }
            } else {
                // 验证不通过,删除无效Cookie
                deleteCookie(cookies.get(i));
            }
        }
        LogUtils.e("从数据库中取出了cookie:" + cookieStr.toString());
        return cookieStr.toString();
    }

    /**
     * 根据条件查找多条数据
     * 
     * @param where
     * @param params
     * @return
     */
    public List<Cookie> queryCookies(String where, String... params) {
        return cookieDao.queryRaw(where, params);
    }

    /**
     * 根据条件查找单条数据
     * 
     * @param where
     * @param params
     * @return
     */
    public Cookie queryCookie(String where, String... params) {
        List<Cookie> queryRaw = cookieDao.queryRaw(where, params);
        if (queryRaw != null && queryRaw.size() > 0)
            return queryRaw.get(0);
        return null;
    }

}

第四步:

由于操作数据库所消耗的资源相对来说是比较大的,所以将Cookie数据临时存储在内存当中,获取数据时,如果内存中存在Cookie数据,那么就直接取出来,如果不存在才会对数据库进行读取获取数据,所以这里需要用到了自定义的Application

package com.example.android.app;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.client.methods.HttpUriRequest;

import android.app.Application;
import android.content.Context;

import com.example.android.Cookie;
import com.example.android.DaoMaster;
import com.example.android.DaoMaster.OpenHelper;
import com.example.android.DaoSession;
import com.example.android.dao.MyCookieDao;
import com.example.android.exception.CatchHandler;
import com.example.android.utils.CommonUtils;
import com.example.android.utils.LogUtils;
import com.nostra13.universalimageloader.cache.disc.impl.UnlimitedDiscCache;
import com.nostra13.universalimageloader.cache.disc.naming.HashCodeFileNameGenerator;
import com.nostra13.universalimageloader.cache.memory.impl.LruMemoryCache;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
import com.nostra13.universalimageloader.core.assist.QueueProcessingType;
import com.nostra13.universalimageloader.utils.StorageUtils;

/**
 * 自定义应用入口
 * 
 * @author Ht
 * 
 */
public class MyApplication extends Application {
    private static DaoMaster daoMaster;
    private static DaoSession daoSession;
    private static Context mInstance;
    private static List<Cookie> cookies = new ArrayList<Cookie>();

    @Override
    public void onCreate() {
        super.onCreate();
        mInstance = this;

        // initCatchHandler();
        initImageLoader();

    }

    /**
     * 初始化App异常处理器
     */
    private void initCatchHandler() {
        CatchHandler catchHandler = CatchHandler.getInstance();
        catchHandler.init(getApplicationContext());
        catchHandler.setParam(1, "Package", "Application Name", "Server Url",
                "Dialog Msg", 0);
    }

    /**
     * 初始化imageloader
     */
    private void initImageLoader() {
        File cacheDir = StorageUtils.getOwnCacheDirectory(
                getApplicationContext(), "imageloader/Cache");

        DisplayImageOptions defaultOptions = new DisplayImageOptions.Builder()
                .cacheInMemory(true) // 加载图片时会在内存中加载缓存
                .cacheOnDisk(true) // 加载图片时会在磁盘中加载缓存
                .build();

        ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(
                this)
                .memoryCacheExtraOptions(480, 800)
                // default = device screen dimensions
                .diskCacheExtraOptions(480, 800, null)
                .threadPoolSize(3)
                // default
                .threadPriority(Thread.NORM_PRIORITY - 2)
                // default
                .tasksProcessingOrder(QueueProcessingType.FIFO)
                // default
                .denyCacheImageMultipleSizesInMemory()
                .memoryCache(new LruMemoryCache(2 * 1024 * 1024))
                .memoryCacheSize(2 * 1024 * 1024).memoryCacheSizePercentage(13)
                // default
                .diskCache(new UnlimitedDiscCache(cacheDir))
                // default
                .diskCacheSize(50 * 1024 * 1024).diskCacheFileCount(100)
                .diskCacheFileNameGenerator(new HashCodeFileNameGenerator()) // default
                .defaultDisplayImageOptions(defaultOptions) // default
                .writeDebugLogs().build();
        ImageLoader.getInstance().init(config);
    }

    /**
     * 取得DaoMaster
     * 
     * @param context
     * @return
     */
    public static DaoMaster getDaoMaster(Context context) {
        if (daoMaster == null) {
            OpenHelper helper = new DaoMaster.DevOpenHelper(context,
                    Constants.DB_NAME, null);
            daoMaster = new DaoMaster(helper.getWritableDatabase());
        }
        return daoMaster;
    }

    /**
     * 取得DaoSession
     * 
     * @param context
     * @return
     */
    public static DaoSession getDaoSession(Context context) {
        if (daoSession == null) {
            if (daoMaster == null) {
                daoMaster = getDaoMaster(context);
            }
            daoSession = daoMaster.newSession();
        }
        return daoSession;
    }

    /**
     * 设置Cookie
     * 
     * @param cookies
     */
    public static void setCookies(List<Cookie> cookies) {
        // 如果当前不存在cookie记录则直接创建
        if (MyApplication.cookies == null || MyApplication.cookies.size() == 0) {
            MyApplication.cookies.addAll(cookies);
        } else {
            // 如果已存在则遍历,替换已有的,添加没有的
            for (Cookie cookie : cookies) {
                // 修改标记,true为有修改,false为未修改
                boolean flag = false;
                if(MyApplication.cookies.contains(cookie)){
                    for (Cookie c : MyApplication.cookies) {
                        // 复写了equals方法,匹配Cookie中key相同的数据
                        if (cookie.equals(c)) {
                            // 将已有(key相同)数据替换成新数据
                            c.setValue(cookie.getValue());
                            c.setDomain(cookie.getDomain());
                            c.setExpires(cookie.getExpires());
                            c.setPath(cookie.getValue());
                            // 改变修改标记
                            flag = true;
                        }
                    }
                }

                // 未修改则新增数据
                if (!flag) {
                    MyApplication.cookies.add(cookie);
                }
            }
        }

    }

    /**
     * 获取当前Cookie
     * 
     * @return
     */
    public static String getCookiesHeader(String url) {
        List<Cookie> cookies;
        MyCookieDao myCookieDao = null;
        // 如果当前内存中存在cookie信息则直接取出,否则从数据库中读取
        if (MyApplication.cookies != null && MyApplication.cookies.size() > 0) {
            cookies = MyApplication.cookies;
            // 请求路径
            StringBuilder cookieStr = new StringBuilder();
            for (int i = 0; i < cookies.size(); i++) {
                // 验证Cookie的有效性
                if (CommonUtils.checkCookie(url, cookies.get(i))) {
                    // 验证通过,拼接Cookie
                    if (i == cookies.size() - 1) {
                        cookieStr.append(cookies.get(i).getKey() + "="
                                + cookies.get(i).getValue());
                    } else {
                        cookieStr.append(cookies.get(i).getKey() + "="
                                + cookies.get(i).getValue() + ";");
                    }
                }
            }

            LogUtils.e("从内存中取出了cookie:" + cookieStr.toString());
            return cookieStr.toString();
        }

        myCookieDao = MyCookieDao.getInstance(MyApplication.getInstance());
        return myCookieDao.getCookiesHeader(url);
    }

    public static Context getInstance() {
        return mInstance;
    }
}

第五步:

Cookie存在有效期,有效域名等等属性,所以,我们需要定义一个工具类,用于验证Cookie的有效性。

/**
* 验证cookie的有效性
* 
* @param url
* @param domain
* @return
*/
public static boolean checkCookie(String url, Cookie cookie) {
    String rex = "\\*" + cookie.getDomain() + "\\*";
    // 验证domain的有效性
    if (!TextUtils.isEmpty(cookie.getDomain())) {
        if (!url.matches(rex)) {
            LogUtils.i("domain失效了");
            return false;
        }
    }

    // 验证生命周期的有效性
    Date expires = cookie.getExpires();
    if (expires == null) {
        LogUtils.i(cookie.getKey() + "有效期是空");
        return true;
    }

    LogUtils.i(cookie.getKey() + "有效期:" + expires.after(new Date()));
    return expires.after(new Date());
}

第六步:

关于Cookie的存储和修改已经完成了,那么接下来就需要在请求的时候带在请求头中发送给服务器了。修改com.android.volley.Request.java文件中的getHeaders方法

// 从Application中取出当前的cookie信息
Map<String, String> cookie = new HashMap<String, String>();
String cookiesHeader = MyApplication.getCookiesHeader(getUrl());
cookie.put("Cookie", cookiesHeader);
return cookie;

到这里就已经大功告成了,添加完成后Volley会自动存储Cookie信息,验证Cookie的有效期,当超过有效期时会自动删除过期Cookie。

您有什么建议,可以通过Email:hunter_android@163.com和作者Hunter交流 如果想要关注更多关于Android开发中的一些经验分享,请访问http://blog.youkuaiyun.com/ht_android

85-Halcon-- gen_cam_par_area_scan_division 函数功能(生成面阵相机镜头参数) Halcon的gen_cam_par_area_scan_division算子用于生成面阵相机的镜头参数,支持除法畸变模型。该算子输出包含9个参数的元组,包括焦距(Focus)、畸变系数(Kappa)、像素尺寸(Sx,Sy)、主点坐标(Cx,Cy)和图像尺寸。文中详细解析了各参数含义、数学原理(包括畸变矫正公式和坐标转换),并提供了三个工业应用案例:高精度芯片尺寸测量、机器人焊接引导和大视野汽车表面检测。最后给出了完整的相机标定流程,涵盖参数生成、畸变校正和标定配置步骤,适用于工业视觉系统的精确标定需求。 阅读详情

相关推荐

基于LORA的双机通信的智能农业系统

通过LoRa模块与主机进行通信,监测环境中的温度、湿度、土壤湿度和光照强度等参数,并根据预设的自动控制逻辑或者手动指令控制继电器开关,从而调节风扇、加热器、水泵、喷雾器和灯光等设备,为植物提供适宜的生长环境。使用的Lora是大夏龙雀的感觉这个是我使用过的Lora里面最好用的,因为不用设置频道就可以直接透明传输,使用起来得心应手。就像两个单片机直接串口通信一样,缺点是异步串行,不能同时进行接收和发送。继电器灯亮模拟打开对应的风扇、水泵、灯、喷雾、加热。1.使用温度传感器测当前环境的温湿度。

ssjsjss的博客 1739

Android Volley使用(一)Volley的基本用法

Volley使用介绍

Errol's Blog 3万+

VS2022配置Qt6

VS2022配置QT教程

Life is a struggle ! 6361

Android Volley使用解析

Volley简介 在2013年Google I/O大会上推出了一个新的网络通信框架Volley。Volley既可以访问网络取得数据,也可以加载图片,并且在性能方面也进行了大幅度的调整。 特点: 自动调度网络请求 支持多个并发的网络连接 支持请求优先级 可以取消单个或一系列请求 易于定制,如自定义请求方式 调试和跟踪工具 使用场景: 非常适合去进行数据量不大,但通信频繁的网络操作 不适合大数据......

假装你是大灰狼的专栏 2029

基于STM32和K210的自动驾驶小车设计

自动驾驶技术正在迅速发展,成为了汽车行业和智能交通领域的热点之一。随着科技的发展,STM32和K210这两款芯片为自动驾驶小车提供了优秀的硬件支持。本文我们将学习如何使用STM32和K210打造一个简单的自动驾驶小车。提示:以下是本篇文章正文内容,下面案例可供参考通过这篇文章,掌握了如何使用STM32和K210构建一个简单的自动驾驶小车。通过了解基本的电路设计,并编写了STM32和K210的代码。通过这个例子,可以更好地理解如何在嵌入式系统中使用STM32和K210,以及如何实现自动驾驶小车的简单功能。

Kyle_Chan_zMH的博客 2219

贝加莱Automation Studio 4.10安装保姆级教程:从官网下载到解决.Net 3.5报错

本文提供贝加莱Automation Studio 4.10的详细安装教程,涵盖从官网下载到解决.Net 3.5报错的全过程。特别针对工业自动化开发环境中常见的.Net Framework 3.5安装问题,提供多种经过验证的解决方案,包括控制面板安装、DISM命令离线安装和手动下载安装包等方法,帮助工程师顺利完成PLC开发环境的搭建。

weixin_30955617的博客 714

volley 获取cookie总结

StringRequest local12 = new StringRequest(Method.POST, url, this, this) { @Override protected Response parseNetworkResponse( NetworkResponse response) { // TODO Auto-generated m

1万+

ESP32-S3 SPI接口实战:从引脚分配到高速通信配置

本文详细解析了ESP32-S3的SPI接口配置与高速通信优化技巧,从引脚分配到软件配置,再到DMA传输和时钟优化,帮助开发者快速掌握SPI通信技术。特别针对ESP32-S3的SPI2接口进行了实战演示,包括硬件连接和常见问题排查,适用于各类嵌入式开发项目。

weixin_29189373的博客 679

Android Volley框架解析

2013年Google I/O大会上推出了一个新的网络通信框架——Volley。Volley可是说是把AsyncHttpClient和Universal-Image-Loader的优点集于了一身,既可以像AsyncHttpClient一样非常简单地进行HTTP通信,也可以像Universal-Image-Loader一样轻松加载网络上的图片。除了简单易用之外,Volley在性能方面也进行了大幅度的调

Watson的博客 3385

Matlab实战:从零搭建弹道导弹六自由度仿真模型(附完整代码)

本文详细介绍了如何使用Matlab从零搭建弹道导弹六自由度仿真模型,涵盖仿真环境配置、核心运动方程实现、气动力建模及仿真结果分析。通过完整代码示例,帮助读者掌握弹道导弹六自由度仿真的关键技术,适用于航空航天工程和复杂系统建模领域。

x8y9z0的博客 947

中国30米分辨率城市建成区数据集 (1972-2023年)

全国城市建成区空间分布数据(1972-2023年),利用Google Earth Engine平台,基于Landsat系列遥感影像提取了1972–2023年城市不透水面,后经过不透水面聚集密度计算方法计算了不透水面聚集密度,通过阈值划分提取了城市建成区,并设置了建成区面积阈值,去除了噪点,获取了全国城市建成区空间分布数据集。该提取能准确刻画城市形态,提取精度高,保持了建成区的完整性。数据集包括41期数据,1972年,1978年,1985-2023年逐年,分辨率为30米,有栅格和矢量两种格式。

地球资源数据云的官方博客 5825

Volley封装,一行代码搞定http请求(重点介绍cookie、https、自定义requst请求)

Google 于 2013 I/O上,发布了Volley。Volley是Android平台上的网络通信库,能使网络通信更快,更简单,更健壮。Volley适合数据量不大但是通信频繁的场景。本篇文章将主要介绍volley的基本用法,以及经过封装修改后,实现一行代码搞定StringRequst、JsonObjectRequest、自定义Request的http请求,同时将介绍Volley如何对Cookie以及https的支持。

ganklun的专栏 3568

Python 爬虫实战:就业市场趋势数据抓取与行业洞察

在当今竞争激烈的就业市场中,了解行业趋势和就业形势对于求职者、学生以及人力资源专业人士来说至关重要。通过获取和分析就业市场数据,我们可以深入了解不同行业的招聘需求、薪资水平、技能要求等关键信息,从而为职业规划和人才发展提供有力支持。

yansideyucsdn的博客 1406

android cookie管理,Android中Cookie获取、保存以及同步

1.先看一下Chrome中的Cookie信息访问首页信息时:1.第一次调用的Header信息2.再次请求时Header信息第一次请求时,服务器会在Response Header中带过来一个Set-Cookie,内容为JSESSIONID=C3E668A891BA4E1C160C91A7EBEAA540.h2;再次请求时,浏览器会在Requst Header中的Cookie将JSESSIONID带上...

weixin_29216957的博客 2444

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Android中Cookie的持久化(包含Volley的Cookie持久化)

Android网络请求中Cookie的持久化以下有两种方法 第一种方法是针对Volley来实现的,这种方法比较简单,但是对于有多重类型的Request必须都要按照这种方式来处理,耦合度比较高。 第二种方法只要设置一次,之后所有的请求都会携带cookie。建议采用第二种方法 第一种方式:通过自定义Request对象来处理Request对象是一个抽象类,其中有两个抽象方法。 abstract prote

初心 5309

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Volley使用技巧-----更好的封装(cookie的使用)

Volley使用技巧—–更好的封装(cookie的使用)题外话上一篇讲到如何自定义Request以便更方便的使用Volley,这篇即将分享的是如何更好用进行封装,使volley使用起来更加的方便,简单,顺便带上了关于cookie的处理方法.正题回顾上一篇博客中提到使用volley最初步骤,即创建一个请求队列:mQueue = new Volley.RequestQueue(getApplicatio

凹凸曼哒小乖兽 3995

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

android - Volley框架请求获取Cookie和带Cookie请求链接和带参数Params

说明: Volley框架适合进行小数据、多频发的网络操作,以及图片的加载,然而有个缺点:对于大数据量的网络操作,比如说下载文件等,Volley的表现就会非常糟糕。 今天我就给大家带来volley框架获取cookie和带cookie的请求教程。 Android端模拟浏览器访问的思路: 1、通过框架获取第一次登陆成功访问返回的Cookie 2、用SharedPreferences保存C

Beluga_白鲸 2035

一次搞定!整理 volley 和 retrofit2 如何发送 cookie id 数据的

用volley 就是觉得可以简单不用序列化数据,用retrofit2 就是整合了.接口,数据的序列化.适合大点的项目管理 用retrofit2 写了一个新闻数据库的一个App ,要将以前用 volley写的 用户管理, 转到 retrofit2 ,新闻模块 就要求 retrofit2 发送 cookie 中保存的,session id 数据 Andorid app 中保存,cookie 的方式就是 用本地存储 sp,方式, 数据库网关用 node.js 做的web 服务器 ,开启sesson 支持实现 用

375

Android的Volley框架实现获取cookie并同步到Webview的实现

Android的Volley框架实现获取cookie并同步到Webview的实现

五道口 1282

Volley请求Cookie超时/Token认证失效的处理

一般App端请求应该用Token做认证吧,并且Token时间设置较长时间。这样本地不存储用户信息,保证安全。 但是由于网页版已有代码限制,这里用了Cookie做认证,网页端设了30分钟超时,不可能在App上30分钟后让用户重新登录。没用Volley之前,是用自己封装的HttpURLConnection,当Cookie超时时,可以读到401的状态吗,然后用保存在本地的用户名和密码(本地加密处理过,但

kyleada的专栏 2444

Android中Volley发送带有Cookie信息的请求

说明:通过Volley请求取到Cookie信息,并放到全局请求队列中发送出去,可以发送携带Cookie请求,服务器端可从Session中获取到。可以用来实现面再次登录或者请求被登录拦截器拦截导致请求失败。

五道口 1064

Volley获取和发送sessionid保持用户登录状态

重写parseNetworkResponse方法获取session: RequestQueue mQueue = Volley.newRequestQueue(getApplicationContext());; StringRequest stringRequest = new StringRequest(Request.Method.POST,url, new Respon

cheng9981的博客 755

Android Cookie实现webview的同步登陆(主要是避免webview的再次登录)解决

cookie的避免重复登录问题

萌萌的博客 4619

android volley 上传图片 和参数,Volley -- 使用volley上传图片

/*实现思路1.将要上传的图片转为 Bitmap 类型2.将Bitmap类型的图片编译成 Base64 的字节流3.通过 Volley 的post方法上传上去*/// 实现第一步 将存储卡中的文件转为Bitmap 类型FileInputStream fis = new FileInputStream("图片的路径");Bitmap bitmap = BitmapFactory.decodeStre...

weixin_35387118的博客 317

关于Android的post,get、cookie网络获取的一些坑

关于Android的post,get、cookie网络获取的一些坑 这篇文章主要整理下关于我这几天的开发心得,还有这几天开发过程出现的bug以及修复过程,同时分享给大家,这是我的第二篇博客,写得较杂,请见谅 这几天做一个关于Android获取网络资源(查询教务系统成绩)的小项目,获取的是我们学校官网的教务系统,用的是正方教务系统,可惜里面有验证码。地址:http://jwc.gdcxxy.net

默默无闻 6762
上一篇: 关于开源项目ButterKnife的使用心得
下一篇: 关于第三方开源库GreenDao的使用心得
ht_android
博客等级 码龄12年 33粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值