现在市面上比较火热的Android网络框架,就我知道的,volley,okhttp,retrofit+rxjava,当然rxjava不算是网络框架,只是配合retofit使用更为方便,volley是我使用得比较多的一个网络框架,但是用他来做轻量的数据请求自是没问题,但是在下载和上传文件上,似乎就会暴露一些问题,啥问题我也不知道,因为我只是菜鸟,这些东西也是一个自己的理解,如果有错误的地方,勿喷。
下面就进入正题,本来我是想使用retrofit,但是我又想一口吃成胖子,对于rxjava的学习上堵住,所以转战okhttp,以下则是我对okhttp的一些理解和使用:
因为我用的是Android Studio,所以首先依赖
compile'com.squareup.okhttp3:okhttp:3.4.2'
,依赖完以后就可以使用了,首先:
private OkHttpClient okHttpClient;
private Request request;
private Call call;
因为不管是get请求,post请求,还是上传下载文件,都需要这三个,总不能一个文件就新建一个对象吧,然后我在构造函数中实例化了
public Http OkHttp() {
okHttpClient=new OkHttpClient();
}
,get请求如下:
public Call getOkhttp() {
request=new Request.Builder()
.url(url)
.build();
call=okHttpClient.newCall(request);
return call;
}
我是把call直接返回出来,这样我用着舒服些, 正规写法如下:
public void getOkhttp() {
request=newRequest.Builder()
.url(url)
.build();
call=okHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call,IOException e) {
//这里面试请求错误调用
}
@Override
public void onResponse(Call call,Response response) throws IOException{
//这是是请求成功返回的
//得到返回信息则是 response.body().string()
}
});
}
,post请求如下:
public Call postOkhttp(RequestBody requestBody) {
request=new Request.Builder()
.url(url)
.post(requestBody)
.build();
call=okHttpClient.newCall(request);
return call;
}
键值对我是将其提取出来,定义如下:
RequestBody requestBody=new FormBody.Builder()
.add("key","valuse")
.build();
add方法则是往里面加入请求体,使用还是很简单的,
上传文件如下:
public Call FileOkhttp(String filename,String key) {
File file=new File(Environment.getExternalStorageDirectory(), filename);
RequestBody fileBody=RequestBody.create(MediaType.parse("application/octet-stream"),file);
RequestBody requestBody=new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addPart(Headers.of("Content-Disposition","form-data; name=\"username\""),
RequestBody.create(null, key))//上传文件名
.addPart(Headers.of("Content-Disposition","form-data; name=\"mFile\"; filename =\"wjd.mp4\""),fileBody)
.build();
request=new Request.Builder()
.url(url)
.post(requestBody)
.build();
call=okHttpClient.newCall(request);
return call;
}