引入
compile 'com.lzy.net:okgo:3.0.4'
初始化
//没有特殊需要的话,最简单的初始化就可以了
OkGO.getInstance()
.init(application)
//定制
//设置全局请求头,不支持中文,不允许有中文字符
HttpHeaders headers = new HttpHeaders()
headers.put("commonHeaderKey1", "commonHeaderValue1")
headers.put("commonHeaderKey2", "commonHeaderValue2")
//设置全局请求参数,支持中文
HttpParams params = new HttpParams()
params.put("commonParamsKey1", "commonParamsValue1")
params.put("commonParamsKey2", "这里支持中文参数")
//使用OkGo的拦截器
OkHttpClient.Builder builder = new OkHttpClient.Builder()
HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor("meee")
//日志的打印范围
loggingInterceptor.setPrintLevel(HttpLoggingInterceptor.Level.BODY)
//在logcat中的颜色
loggingInterceptor.setColorLevel(Level.INFO)
//默认是Debug日志类型
builder.addInterceptor(loggingInterceptor)
//设置请求超时时间,默认60秒
builder.readTimeout(OkGo.DEFAULT_MILLISECONDS, TimeUnit.MILLISECONDS)
builder.writeTimeout(OkGo.DEFAULT_MILLISECONDS, TimeUnit.MILLISECONDS)
builder.connectTimeout(OkGo.DEFAULT_MILLISECONDS, TimeUnit.MILLISECONDS)
//okhttp默认不保存cookes/session信息,需要自己的设置
//builder.cookieJar(new CookieJarImpl(new SPCookieStore(this)))
// builder.cookieJar(new CookieJarImpl(new DBCookieStore(this)))
builder.cookieJar(new CookieJarImpl(new MemoryCookieStore()))
OkGo.getInstance()
.init(this)
.setOkHttpClient(builder.build())//不设置则使用默认
.setCacheMode(CacheMode.NO_CACHE)//设置缓存模式
.setCacheTime(CacheEntity.CACHE_NEVER_EXPIRE)//设置缓存时间,默认永不过期
.setRetryCount(3)
// .addCommonHeaders(headers)
// .addCommonParams(params)
基本使用
get请求
OkGo.get("url")
.tag(this)
.params("adKind","1")
.cacheKey("cachekey")
.cacheMode(CacheMode.NO_CACHE)
.execute(new StringCallback() {
@Override
public void onSuccess(Response response) {
}
@Override
public void onError(Response response) {
}
});
Post请求
OkGo.>post(Urls.URL_METHOD)
.tag(this)
.headers("header1", "headerValue1")
.params("param1", "paramValue1")
.params("param2", "paramValue2")
.params("param3", "paramValue3")
.isMultipart(true)
.execute(new DialogCallback>(this) {
@Override
public void onSuccess(Response> response) {
handleResponse(response);
}
@Override
public void onError(Response> response) {
handleError(response);
}
});
下载图片
OkGo.get(url)
.execute(new BitmapCallback() {
@Override
public void onSuccess(Response response) {
Log.d("meee", getClass() + ":\n" + "onSuccess:" + response.body().getHeight());
iv.setImageBitmap(response.body());
}
});
下载文件
OkGo.get("http://url.9xiazaiqi.com/down/苍之纪元-电脑版@295_21797.exe")
.execute(new FileCallback() {
@Override
public void onSuccess(Response response) {
Log.d("meee",getClass()+":\n"+"test:"+(response.body().length()/1024)+"KB");
}
@Override
public void downloadProgress(Progress progress) {
Log.d("meee",getClass()+":\n"+"progress:"+progress.fraction);
}
});
上传String文本
一般此种用法用于与服务器约定的数据格式,当使用该方法时,params中的参数设置是无效的,所有参数均需要通过需要上传的文本中指定,此外,额外指定的header参数仍然保持有效。
默认会携带以下请求头
Content-Type: text/plain;charset=utf-8
如果你对请求头有自己的要求,可以使用这个重载的形式,传入自定义的content-type
基本断点续传
上传文件
上传文件支持文件与参数一起同时上传,也支持一个key上传多个文件,以下方式可以任选
特别要注意的是
1). 很多人会说需要在上传文件到时候,要把Content-Type修改掉,变成multipart/form-data,就像下面这样的。其实在使用OkGo的时候,只要你添加了文件,这里的的Content-Type不需要你手动设置,OkGo自动添加该请求头,同时,OkGo也不允许你修改该请求头。
Content-Type: multipart/form-data; boundary=f6b76bad-0345-4337-b7d8-b362cb1f9949
2). 如果没有文件,那么OkGo将自动使用以下请求头,同样OkGo也不允许你修改该请求头。
Content-Type: application/x-www-form-urlencoded
3). 如果你的服务器希望你在没有文件的时候依然使用multipart/form-data请求,那么可以使用.isMultipart(true)这个方法强制修改,一般来说是不需要强制的。
取消请求
@Override
protected void onDestroy() {
super.onDestroy();
OkGo.getInstance().cancelTag(this);
OkGo.getInstance().cancelAll();
OkGo.cancelAll(new OkHttpClient());
OkGo.cancelTag(new OkHttpClient(),"且指定tag");
}
同步请求
//NetworkOnMainThreadException
//方式一:
try {
okhttp3.Response response = OkGo.get(url)
.params("adKind", "1")
.execute()
Log.d("meee",getClass()+":\n"+"test:"+response.body().string())
} catch (IOException e) {
e.printStackTrace()
}
//方式二,也许可以转换成Rxjava的Obser
Call call = OkGo.get(url)
.params("adKind", "1")
.converter(new StringConvert())
.adapt()
try {
Response execute = call.execute()
Log.d("meee",getClass()+":\n"+"execute:"+execute.body())
} catch (Exception e) {
e.printStackTrace()
Log.d("meee",getClass()+":\n"+"Exception:")
}
}
Cookies管理
cookie是有作用域的,他绑定的是url对应的host,比如你的请求两个接口,一个是 www.domain1.com 一个是 www.domain2.com 那么这个时候,domain1所具有的cookie是不会自动在domain2中携带的,如果一定要让他们两个都可以用,那么需要手动设置,方法请看下面的cookie交互。
查看okgo管理的cookie中,某个url所对应的全部cookie
CookieStore cookieStore = OkGo.getInstance().getCookieJar().getCookieStore()
HttpUrl httpUrl = HttpUrl.parse("http://server.jeasonlzy.com/OkHttpUtils/method/")
List cookies = cookieStore.getCookie(httpUrl)
showToast(httpUrl.host() + "对应的cookie如下:" + cookies.toString())
查看okgo管理的所有cookie
CookieStore cookieStore = OkGo.getInstance().getCookieJar().getCookieStore()
List allCookie = cookieStore.getAllCookie()
showToast("所有cookie如下:" + allCookie.toString())
手动向okgo管理的cookie中,添加一些自己的cookie,那么以后满足条件时,okgo就会带上这些cookie
HttpUrl httpUrl = HttpUrl.parse("http://server.jeasonlzy.com/OkHttpUtils/method/")
Cookie.Builder builder = new Cookie.Builder()
Cookie cookie = builder.name("myCookieKey1").value("myCookieValue1").domain(httpUrl.host()).build()
CookieStore cookieStore = OkGo.getInstance().getCookieJar().getCookieStore()
cookieStore.saveCookie(httpUrl, cookie)
手动把okgo管理的cookie移除
HttpUrl httpUrl = HttpUrl.parse("http://server.jeasonlzy.com/OkHttpUtils/method/")
CookieStore cookieStore = OkGo.getInstance().getCookieJar().getCookieStore()
cookieStore.removeCookie(httpUrl)
支持Rxjava2
内部使用了
compile 'io.reactivex.rxjava2:rxjava:2.1.0'
但还是需要添加
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
用于切换线程
OkGo.<String>get("url")
.tag(this)
.params("adKind", "1")
.converter(new StringConvert())
.adapt(new ObservableResponse<String>())
.compose(ThreadSwitch.<Response<String>>switchSchedulers())
.subscribe(new Consumer<Response<String>>() {
@Override
public void accept(@NonNull Response<String> stringResponse) throws Exception {
Log.d("meee",getClass()+":\n"+"stringResponse:"+stringResponse.body());
}
});
作者的convert还是太复杂了,咱们还是用普通的用Gson好了
//解析父类泛型的真实类型(有局限性,继承后就无法解析到)
Type genType = getClass().getGenericSuperclass();
type = ((ParameterizedType) genType).getActualTypeArguments()[0];
compile 'com.google.code.gson:gson:2.8.2'
public class JsonConvert implements Converter {
Class clazz;
private static Gson mGson;
public static Gson getGson(){
if (mGson==null){
synchronized (JsonConvert.class){
if (mGson==null){
mGson=new Gson();
}
}
}
return mGson;
}
public JsonConvert(Class clazz) {
this.clazz = clazz;
}
@Override
public T convertResponse(Response response) throws Throwable {
Gson gson =getGson();
JsonReader jsonReader = new JsonReader(response.body().charStream());
T t = gson.fromJson(jsonReader, clazz);
return t;
}
}
OkGo.get("url")
.tag(this)
.params("adKind", "1")
.converter(new JsonConvert(JsonBean.class))
.adapt(new ObservableResponse())
.compose(ThreadSwitch.>switchSchedulers())
.map(new Function, JsonBean>() {
@Override
public JsonBean apply(@NonNull Response jsonBeanResponse) throws Exception {
return jsonBeanResponse.body();
}
})
.subscribe(new Consumer() {
@Override
public void accept(@NonNull JsonBean jsonBean) throws Exception {
Log.d("meee",getClass()+":\n"+"jsonBean:"+jsonBean);
}
});
上传和下载的功能拓展
compile 'com.lzy.net:okserver:2.0.5'
https:
https: