Android Volley 之自定义Request(1)

this.name = name;

}

public int getAge()

{

return age;

}

public void setAge(int age)

{

this.age = age;

}

@Override

public String toString()

{

return “User [name=” + name + “, age=” + age + “]”;

}

}

2、自定义的Request

package com.zhy.velloydemo;

import java.io.UnsupportedEncodingException;

import java.util.HashMap;

import java.util.Map;

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.Response.ErrorListener;

import com.android.volley.Response.Listener;

import com.android.volley.toolbox.HttpHeaderParser;

import com.google.gson.Gson;

import com.google.gson.JsonSyntaxException;

public class JsonRequestWithAuth extends Request

{

private final Gson gson = new Gson();

private final Class clazz;

private final Listener listener;

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

/**

  • 设置访问自己服务器时必须传递的参数,密钥等

*/

static

{

mHeader.put(“APP-Key”, “LBS-AAA”);

mHeader.put(“APP-Secret”, “ad12msa234das232in”);

}

/**

  • @param url

  • @param clazz

  •        我们最终的转化类型
    
  • @param headers

  •        请求附带的头信息
    
  • @param listener

  • @param appendHeader

  •        附加头数据
    
  • @param errorListener

*/

public JsonRequestWithAuth(String url, Class clazz, Listener listener, Map<String, String> appendHeader,

ErrorListener errorListener)

{

super(Method.GET, url, errorListener);

this.clazz = clazz;

this.listener = listener;

mHeader.putAll(appendHeader);

}

@Override

public Map<String, String> getHeaders() throws AuthFailureError

{

// 默认返回 return Collections.emptyMap();

return mHeader;

}

@Override

protected void deliverResponse(T response)

{

listener.onResponse(response);

}

@Override

protected Response parseNetworkResponse(NetworkResponse response)

{

try

{

/**

  • 得到返回的数据

*/

String jsonStr = new String(response.data, HttpHeaderParser.parseCharset(response.headers));

/**

  • 转化成对象

*/

return Response.success(gson.fromJson(jsonStr, clazz), HttpHeaderParser.parseCacheHeaders(response));

} catch (UnsupportedEncodingException e)

{

return Response.error(new ParseError(e));

} catch (JsonSyntaxException e)

{

return Response.error(new ParseError(e));

}

}

}

这里说一下,我在Header中放置了APP-key等数据,也就是说只要我们这个请求发的都会有这几个值,大家开发app时肯定有很多请求参数是需要每次都发往服务器校验的,可以在这里设置。

3、服务器代码:

package com.zhy.servelt;

import java.io.IOException;

import java.io.PrintWriter;

import javax.servlet.ServletException;

import javax.servlet.ServletOutputStream;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

public class TestServlet extends HttpServlet

{

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException

{

this.doPost(request, response);

}

public void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException

{

request.setCharacterEncoding(“utf-8”);

String appKey = request.getHeader(“APP-Key”);

String appSecret = request.getHeader(“APP-Secret”);

String username = request.getHeader(“username”);

String password = request.getHeader(“password”);

if (“admin”.equals(username) && “123”.equals(password))

{

response.setContentType(“text/plain;charset=utf-8”);

PrintWriter out = response.getWriter();

out.print(“{“name”:“鸿洋”,“age”:32}”);

out.flush();

}

}

}

4、测试代码:

Map<String, String> appendHeader = new HashMap<String, String>();

appendHeader.put(“username”, “admin”);

appendHeader.put(“password”, “123”);

String url = “http://172.27.35.1:8080/webTest/TestServlet”;

JsonRequestWithAuth userRequest = new JsonRequestWithAuth(url, User.class, new Listener()

{

@Override

public void onResponse(User response)

{

Log.e(“TAG”, response.toString());

}

}, appendHeader, null);

newRequestQueue.add(userRequest);

可以看到我们使用自定义请求实现了我们上述的需求,这里还要说一下,这个例子有两个目的:

1、自定义Request其实很简单,如果不需要Header直接不用复写getHeader那个方法。

2、我们可以利用Header传递一些固定的参数,这比对安全比较高的系统,每次拼一堆xml去服务器,代码能简洁很多,当然了,注意信息安全。

最后补充一下:

哥们问这句什么意思:HttpHeaderParser.parseCharset(response.headers)其实就是获取我们的返回流的编码,也就是我上面服务器设置的utf-8

对于请求的Header和响应Header理解,随便打开个网站,使用浏览器的工具查看一下,每个请求都会包含这两个Header数据。

面试复习笔记

这份资料我从春招开始,就会将各博客、论坛。网站上等优质的Android开发中高级面试题收集起来,然后全网寻找最优的解答方案。每一道面试题都是百分百的大厂面经真题+最优解答。包知识脉络 + 诸多细节。
节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。

《960页Android开发笔记》

《1307页Android开发面试宝典》

包含了腾讯、百度、小米、阿里、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目。熟悉本文中列出的知识点会大大增加通过前两轮技术面试的几率。

《507页Android开发相关源码解析》

只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。

真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

《507页Android开发相关源码解析》**

只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。

真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。

[外链图片转存中…(img-8Pp4IgtJ-1714298988928)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值