Android Volley框架定制JsonRequest添加Cookie

TT_123456789 2020-08-14 18:36:03 1744

原文链接:点击这里
发现问题
Volley是Android平台上的网络通信库,能使网络通信更快,更简单,更健壮。
Volley本身是不支持cookie,但是既想使用volley又想在对服务器发起http请求时加上cookie,并从服务器给的响应中读取cookie。怎么办呢?
其实很简单,Volley提供了非常强的扩展机制,使得我们可以很轻松地定制出任意类型的Request。

定制JsonObjectGetRequest
该定制Request可用于Get一条JSON格式的数据,同时能向服务器发起http请求时加上cookie。

import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Map;

import org.apache.http.protocol.HTTP;
import org.json.JSONException;
import org.json.JSONObject;

import android.util.Log;

import com.android.volley.AuthFailureError;
import com.android.volley.NetworkResponse;
import com.android.volley.ParseError;
import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.toolbox.HttpHeaderParser;

/*

  • Volley Get类型 可以发送Cookie
  • */
    public class JsonObjectGetRequest extends Request {

    private Response.Listener mListener;

    // 保存cookie
    public String cookieFromResponse;

    private Map<String, String> sendHeader = new HashMap<String, String>();

    public JsonObjectGetRequest(String url,
    Response.Listener listener,
    Response.ErrorListener errorListener) {

    super(Request.Method.GET, url, errorListener);
    mListener = listener;

    }

    @Override
    protected Response parseNetworkResponse(NetworkResponse response) {

    try {
        // 防止中文乱码
        @SuppressWarnings("deprecation")
        String jsonString = new String(response.data, HTTP.UTF_8);
    
        // 将cookie字符串添加到jsonObject中,该jsonObject会被deliverResponse递交,调用请求时则能在onResponse中得到
        JSONObject jsonObject = new JSONObject(jsonString);
    
        Log.w("json", "jsonObject " + jsonObject.toString());
    
        return Response.success(jsonObject,
                HttpHeaderParser.parseCacheHeaders(response));
    
    } catch (UnsupportedEncodingException e) {
        return Response.error(new ParseError(e));
    } catch (JSONException je) {
        return Response.error(new ParseError(je));
    }

    }

    @Override
    protected void deliverResponse(JSONObject response) {
    mListener.onResponse(response);
    }

    @Override
    public Map<String, String> getHeaders() throws AuthFailureError {
    return sendHeader;
    }

    public void setSendCookie(String cookie) {
    sendHeader.put("Cookie", cookie);
    }
    }

使用方法

JsonObjectGetRequest get = new JsonObjectGetRequest(Url.api,
new Response.Listener() {
@Override
public void onResponse(JSONObject jsonObject) {
try {
//TODO 响应操作
} catch (JSONException e) {
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
//TODO 响应操作
Log.e("HTTP_get", error.getMessage(), error);
}
});

// 向服务器发起post请求时加上cookie字段
get.setSendCookie(customer.getCookie());

mQueue.add(get);

定制JsonObjectPostRequest
该定制Request可用于Post一条JSON格式的数据,同时能向服务器发起http请求时加上cookie,并从服务器给的响应中读取cookie。

import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Map;

import org.apache.http.protocol.HTTP;
import org.json.JSONException;
import org.json.JSONObject;

import com.android.volley.AuthFailureError;
import com.android.volley.NetworkResponse;
import com.android.volley.ParseError;
import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.toolbox.HttpHeaderParser;

import android.util.Log;

/**

  • Volley Post类型 可以接受和发送Cookie
    */
    public class JsonObjectPostRequest extends Request {

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

    // 保存cookie
    public String cookieFromResponse;

    private Map<String, String> sendHeader = new HashMap<String, String>();

    public JsonObjectPostRequest(String url,
    Response.Listener listener,
    Response.ErrorListener errorListener, Map<String, String> map) {
    super(Request.Method.POST, url, errorListener);
    mListener = listener;
    mMap = map;
    }

    // 当http请求是post时,则需要该使用该函数设置往里面添加的键值对
    @Override
    protected Map<String, String> getParams() throws AuthFailureError {
    return mMap;
    }

    // 重写方法,处理cookie
    @Override
    protected Response parseNetworkResponse(NetworkResponse response) {
    try {

        // 防止中文乱码
        @SuppressWarnings("deprecation")
        String jsonString = new String(response.data, HTTP.UTF_8);
    
        // 将cookie字符串添加到jsonObject中,该jsonObject会被deliverResponse递交,调用请求时则能在onResponse中得到
        JSONObject jsonObject = new JSONObject(jsonString);
    
        // 获取cookie字段
        sendHeader = response.headers;
    
        // 如果因为一些原因没有返回cookie的判断
        if (sendHeader.get("Set-Cookie") != null) {
            cookieFromResponse = sendHeader.get("Set-Cookie");
            cookieFromResponse = cookieFromResponse.replace("\n", ";");
            Log.w("cookie", cookieFromResponse);
            jsonObject.put("Cookie", cookieFromResponse);
        }
    
        Log.w("json", "jsonObject " + jsonObject.toString());
    
        return Response.success(jsonObject,
                HttpHeaderParser.parseCacheHeaders(response));
    
    } catch (UnsupportedEncodingException e) {
        return Response.error(new ParseError(e));
    } catch (JSONException je) {
        return Response.error(new ParseError(je));
    }

    }

    @Override
    protected void deliverResponse(JSONObject response) {
    mListener.onResponse(response);
    }

    @Override
    public Map<String, String> getHeaders() throws AuthFailureError {
    return sendHeader;
    }

    public void setSendCookie(String cookie) {
    sendHeader.put("Cookie", cookie);
    }
    }

使用方法

//json格式的数据
HashMap<String, String> urlParams = new HashMap<String, String>();
urlParams.put("phone", user.getText().toString());
urlParams.put("password", psw.getText().toString());

JsonObjectPostRequest post = new JsonObjectPostRequest(Url.api,
new Response.Listener() {
@Override
public void onResponse(JSONObject jsonObject) {
try {
//TODO 响应操作
//保存Cookie
customer.setCookie(jsonObject.getString("Cookie"));
} catch (JSONException e) {
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
//TODO 响应操作
Log.e("HTTP_login", error.getMessage(), error);
}
}, urlParams);

//判断是否有Cookie
if (!user.getCookie().equals("")) {
// 向服务器发起post请求时加上cookie字段
post.setSendCookie(user.getCookie());
}

mQueue.add(post);

声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
红包 点赞 收藏 评论 打赏
评论
0个
内容存在敏感词
手气红包
    易百纳技术社区暂无数据
相关专栏
置顶时间设置
结束时间
删除原因
  • 广告/SPAM
  • 恶意灌水
  • 违规内容
  • 文不对题
  • 重复发帖
打赏作者
易百纳技术社区
TT_123456789
您的支持将鼓励我继续创作!
打赏金额:
¥1易百纳技术社区
¥5易百纳技术社区
¥10易百纳技术社区
¥50易百纳技术社区
¥100易百纳技术社区
支付方式:
微信支付
支付宝支付
易百纳技术社区微信支付
易百纳技术社区
打赏成功!

感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~

举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

审核成功

发布时间设置
发布时间:
是否关联周任务-专栏模块

审核失败

失败原因
备注
拼手气红包 红包规则
祝福语
恭喜发财,大吉大利!
红包金额
红包最小金额不能低于5元
红包数量
红包数量范围10~50个
余额支付
当前余额:
可前往问答、专栏板块获取收益 去获取
取 消 确 定

小包子的红包

恭喜发财,大吉大利

已领取20/40,共1.6元 红包规则

    易百纳技术社区