网上有各种各样的网络框架,然后因为之前项目中一直是用的volley,项目比较庞大也不好整体替换,就一直延用下来了。最近产品有个新需求,需要做终端的遥控器,看了下api文档发现需要用http basic认证以及xml的请求。
在之前,其实我也没有很细致的研究过。之前用的最多的就是volley基于session的get、post、put、以及delete请求。其中post分string与json的格式。网上找了下,有用原生写的http basic认证的demo,但是没有找到volley的,既然原生能实现,那么框架肯定也是能实现的,一般来说框架只会让我们更方便而不会说阻止某些功能的实现。
我使用了postman,在postman上找到了http basic认证的方式。
postman工具可以将请求转化成我们常用的一些语法,工具里只找到了okhttp,并没有找到volley的。
htttp basic是将需要认证的信息放在头部并以Base64方式编译,而volley本身提供了getHeaders()方法用来自定义信息,我之前将认证信息放在头部没成功应该是没有以Base64编译。那是不是我将这个加上去就行了呢?
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
HashMap<String, String> headers = new HashMap<String, String>();
headers.put("Username", "sss");
headers.put("Password", "sss");
headers.put("Content-Type","application/json; charset=UTF-8");
headers.put("Authorization", "Basic YWRtaW46YWRtaW4=");
return headers;
}
果不其然可以了。
既然认证方式已经成功,那么接下去就是请求方式了,volley中有StringRequest,也有JsonRequest,但是没找到说有XmlRequest啊,网上也米有相关案例,难道说volley不支持?我还是觉得既然原生可以做到,那么框架没理由不能做,目前不行肯定是由于方法还没找对。既然网上找不到,那就只能去源码里找了。请求类相关的东西都是在源码的request类中,里面全都是与请求相关的方法,只要重载这些方法就可以自定义信息。
首先看到的就是我们最常用的getHeaders()
其次就是我们用StringRequest时的getParams()方法
但是这些肯定都不是我们需要的,原生post xml,是需要将xml信息转化为byte数组的形式上传,那么我们要找的方法肯定返回的事byte数组。
原生:
查找了下,发现有2个方法:
public byte[] getBody() throws AuthFailureError {
Map<String, String> params = this.getParams();
return params != null && params.size() > 0 ? this.encodeParameters(params, this.getParamsEncoding()) : null;
}
/** @deprecated */
public byte[] getPostBody() throws AuthFailureError {
Map<String, String> postParams = this.getPostParams();
return postParams != null && postParams.size() > 0 ? this.encodeParameters(postParams, this.getPostParamsEncoding()) : null;
}
这2个方法应该都是可以的,本质上其实都是获取body,这里我用的事getBody方法。
方法也有了,但是仍然失败了,那么是什么原因呢?暂时没有头绪,就继续往下看。
后面看到一个方法
这个方法是用来指定body类型的,对比下postman中的code,应该就是这边错了。
重写这个方法后,果然都可以了,至此本次需求的第一步就打开了。
PS:在写之前,我觉得我又学到了东西,所以想着记录下来,这样万一有需要的小伙伴看到的话也能有点用。在写的时候,其实还是有些迷迷糊糊的,所以有些东西也是边写边查了资料。
在查资料的过程中,我发现其实我还是没有很理解源码,比如说getBody()、getPostBody()这俩方法有什么区别,StringRequest()与JsonRequest()传参的方式到底有什么异同。这也是我平时用框架的时候都是直接拿来用而并没有去究其实现原理造成的。在postman上,string、json、xml等格式的上传都是一个下拉框中切换,那么说明其实本质上这些传参数的方式都是一样的。这个如果用原生的来写,那么当几种方式的请求写出来后就能比较直观的看出区别。而我目前都是直接用框架实现,所以才会云里雾里。
在写完这个心得体会的时候,我就感觉到我前面记录的一些东西可能有很大的不足或者说理解有错误,但是我还是写下来了,毕竟不足也是进步的一部分,而且后续的理解更深后也可以再写一篇来更正。