Volley和xUtils取cookie的实现

Android开发中肯定少不了http的请求,而http的请求要靠自己来实现其实是比较困难的,毕竟要考虑内存消耗,并发性等等问题,用一些成熟的第三方库其实是一个很好的办法。(但是这并不代表我们就必须要依赖第三方库,这样只会是搬运工,要了解原理,看懂第三方库的源码,以及他们的思想和框架)我平时也用过不少的库,对于http请求,总的来说,如果是小请求,用volley,上传用xUtils,图片请求则使用facebook的fresco,这是我的个人意见。

请求和上传,简单来说对应http中的get和post,那这些请求中,有一个比较关键的东西,就是cookie。对于cookie的作用相信大家都知道,那在volley和xUtils中怎么获得cookie呢?

volley:

首先对于volley,了解过的人都知道,它的请求做的是比较好的,你想要请求什么类型的东西,重写reqeus<T>就可以了。

public class CookieRequest extends Request<Map<String,String>> {

    private Response.Listener<Map<String,String>> mListener;

    public CookieRequest(int method, String url,Response.Listener<Map<String,String>> mListener, Response.ErrorListener listener) {
        super(method, url,listener);
        this.mListener = mListener;
    }

    public CookieRequest(String url, Response.Listener<Map<String,String>> mListener, Response.ErrorListener listener) {
        this(Method.GET, url, mListener, listener);
    }

    @Override
    protected Response<Map<String,String>> parseNetworkResponse(NetworkResponse networkResponse) {
        Map<String,String> mHeaders;
        mHeaders = networkResponse.headers;
        return Response.success(mHeaders, HttpHeaderParser.parseCacheHeaders(networkResponse));
    }

    @Override
    protected void deliverResponse(Map<String,String> map) {
        mListener.onResponse(map);
    }
}
以上这个是请求cookie的request,最重要的是parseNetworkResponse和deliverResponse这两个方法,这里稍微的扯一点源码,volley内部有一个东西叫httpStack,这个是用来完成http请求的核心,具体来说,API9以上使用的是httpUrlConnection,9以下使用的是httpClient,然后呢,在queue.add方法之后volley就回去执行http请求了,把请求的结果封装成一个NetworkResponse,之后调用parseNetworkResponse方法,也就是说volley是让用户自己去解析http数据的,所以通过parseNetworkResponse,能够拿到http请求的结果,当然也包含cookie,具体操作已经写明了。之后呢,http请求的操作肯定是在子线程吧,不然ANR了,那怎么把数据返回到主线程呢?volley内部其实就是用handler的post,把数据post回主线程并且调用deliverResponse方法,所以在delieverResponse方法里调用接口的onResponse,然后在activity中回调到这个函数并处理就可以了。


xUtils:

对于xUtils,我没有研究过源码,所以就简单的说一下操作。

RequestParams params = new RequestParams();
        params.addBodyParameter("data",data);
        System.out.println(params.getCharset().toString());
        http.send(HttpRequest.HttpMethod.POST,URL,params,new RequestCallBack<Object>() {

            @Override
            public void onSuccess(ResponseInfo<Object> objectResponseInfo) {

                try {
                    JSONObject json = new JSONObject(objectResponseInfo.result.toString());
                    String key = json.getString("msg");
                    Snackbar.make(content,key,Snackbar.LENGTH_SHORT)
                            .setAction("click to dismiss", new View.OnClickListener() {
                                @Override
                                public void onClick(View view) {

                                }
                            }).show();

                    DefaultHttpClient dh = (DefaultHttpClient) http.getHttpClient();
                    CookieStore cs = dh.getCookieStore();
                    List<Cookie> cookies = cs.getCookies();
                    System.out.println(cookies.toString());
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }

            @Override
            public void onFailure(HttpException e, String s) {

            }
        });

上传成功以后会回调到onSucess这个方法,通过

DefaultHttpClient dh = (DefaultHttpClient) http.getHttpClient();
CookieStore cs = dh.getCookieStore();
List<Cookie> cookies = cs.getCookies();
这些就可以取出cookie了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值