Square 为广大开发者奉献了OkHttp,Retrofit1.x,Retrofit2.x,运用比较广泛,这三个工具有很多相似之处,初学者可能会有一些使用迷惑。这里来总结一下它们的一些基本使用和一些细微差别。

/**************
Retrofit 基本使用方法 Retrofit 到底是返回什么? void, Observable, Call? *************/
/********************************************Retrofit****************************************************************/
/*** 同步调用的方式 ****/
interface GitHubService {
@GET("/repos/{owner}/{repo}/contributors")
List<Contributor> repoContributors(
@Path("owner") String owner,
@Path("repo") String repo);
} List<Contributor> contributors =
gitHubService.repoContributors("square", "retrofit");
/***** 异步调用的方式 仅限于 Retrofit 1.x !!!!!!! *****/
interface GitHubService {
@GET("/repos/{owner}/{repo}/contributors")
void repoContributors(
@Path("owner") String owner,
@Path("repo") String repo,
Callback<List<Contributor>> cb); // 异步调用添加 CallBack
} service.repoContributors("square", "retrofit", new Callback<List<Contributor>>() {
@Override void success(List<Contributor> contributors, Response response) {
// ...
} @Override void failure(RetrofitError error) {
// ...
}
}); /**** Rxjava 方式 ****/
interface GitHubService {
@GET("/repos/{owner}/{repo}/contributors")
Observable<List<Contributor>> repoContributors(
@Path("owner") String owner,
@Path("repo") String repo);
}
// 调用
gitHubService.repoContributors("square", "retrofit")
.subscribe(new Action1<List<Contributor>>() {
@Override public void call(List<Contributor> contributors) {
// ...
}
}); /*******************************注意以下三个Callback的不同***************************************/ // Retrofit Callback Version 1.9
public interface Callback<T> { /** Successful HTTP response. */
void success(T t, Response response); /**
* Unsuccessful HTTP response due to network failure, non-2XX status code, or unexpected
* exception.
*/
void failure(RetrofitError error);
}
// Retrofit Callback Version 2.0 !!!!!!!!!
public interface Callback<T> {
/** Successful HTTP response. */
void onResponse(Response<T> response, Retrofit retrofit); /** Invoked when a network or unexpected exception occurred during the HTTP request. */
void onFailure(Throwable t);
}
// OkHttp
public interface Callback {
  void onFailure(Request request, IOException e);   void onResponse(Response response) throws IOException; // 注意参数不同
} /*********************************回顾一下Okhttp的调用方式********************************************/ //1. 创建
OkHttpClient : OkHttpClient client = new OkHttpClient();
//2. 创建
Request : Request request = new Request.Builder()
.url("https://api.github.com/repos/square/okhttp/issues")
.header("User-Agent", "OkHttp Headers.java")
.addHeader("Accept", "application/json; q=0.5")
.addHeader("Accept", "application/vnd.github.v3+json")
.build(); //3. 使用 client 执行请求(两种方式):
//第一种,同步执行
Response response = client.newCall(request).execute();
// 第二种,异步执行方式
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Request request, Throwable throwable) {
// 复写该方法 }
@Override public void onResponse(Response response) throws IOException {
// 复写该方法
}
} /***********************************Retrofit 1.0 不能获得 Header 或者整个 Body*****************************************/
/**********2.x 引入 Call , 每个Call只能调用一次,可以使用Clone方法来生成一次调用多次,使用Call既可以同步也可以异步*********/ interface GitHubService {
@GET("/repos/{owner}/{repo}/contributors")
Call<List<Contributor>> repoContributors(
@Path("owner") String owner,
@Path("repo") String repo);
} Call<List<Contributor>> call =
gitHubService.repoContributors("square", "retrofit"); response = call.execute(); /*************** 同步的方式调用,注意这里返回了 Response 后面会提到 ********************/ // This will throw IllegalStateException: 每个Call只能执行一次
response = call.execute(); Call<List<Contributor>> call2 = call.clone(); // 调用Clone之后又可以执行
// This will not throw:
response = call2.execute(); /************************ 异步的方式调用 *********************************/ Call<List<Contributor>> call =
gitHubService.repoContributors("square", "retrofit"); call.enqueue(new Callback<List<Contributor>>() {
@Override void onResponse(/* ... */) {
// ...
} @Override void onFailure(Throwable t) {
// ...
}
}); /****************************引入 Response,获取返回的RawData,包括:response code, response message, headers**********************************/ class Response<T> {
int code();
String message();
Headers headers(); boolean isSuccess();
T body();
ResponseBody errorBody();
com.squareup.okhttp.Response raw();
} interface GitHubService {
@GET("/repos/{owner}/{repo}/contributors")
Call<List<Contributor>> repoContributors(
@Path("owner") String owner,
@Path("repo") String repo);
} Call<List<Contributor>> call =
gitHubService.repoContributors("square", "retrofit");
Response<List<Contributor>> response = call.execute(); /*********************************** Dynamic URL *****************************************/ interface GitHubService {
@GET("/repos/{owner}/{repo}/contributors")
Call<List<Contributor>> repoContributors(
@Path("owner") String owner,
@Path("repo") String repo); @GET
Call<List<Contributor>> repoContributorsPaginate(
@Url String url);// 直接填入 URL 而不是在GET中替换字段的方式
} /*************************************根据返回值实现重载*****************************************************/
interface SomeService {
@GET("/some/proto/endpoint")
Call<SomeProtoResponse> someProtoEndpoint(); // SomeProtoResponse @GET("/some/json/endpoint")
Call<SomeJsonResponse> someJsonEndpoint(); // SomeJsonResponse
} interface GitHubService {
@GET("/repos/{owner}/{repo}/contributors")
Call<List<Contributor>> repoContributors(..); @GET("/repos/{owner}/{repo}/contributors")
Observable<List<Contributor>> repoContributors2(..); @GET("/repos/{owner}/{repo}/contributors")
Future<List<Contributor>> repoContributors3(..); // 可以返回 Future
} /******************************************Retrofit 1.x Interceptor,添加头部信息的时候经常用到Interceptor*************************************************************/
RestAdapter.Builder builder = new RestAdapter.Builder().setRequestInterceptor(new RequestInterceptor() {
@Override
public void intercept(RequestFacade request) {
request.addHeader("Accept", "application/json;versions=1");
}
}); /******************************************Retrofit 2.x Interceptor**************************************************/ OkHttpClient client = new OkHttpClient();
client.interceptors().add(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request original = chain.request(); Request request = original.newBuilder()
.header("Accept", "application/json")
.header("Authorization", "auth-token")
.method(original.method(), original.body())
.build(); Response response = chain.proceed(request);
return response; }
} Retrofit retrofit = Retrofit.Builder()
.baseUrl("https://your.api.url/v2/")
.client(client).build(); /***************************************异步实例*********************************************/
public interface APIService { @GET("/users/{user}/repos")
Call<List<Repo>> listRepos(@Path("user") String user); @GET("/users/{user}/repos")
Call<String> listReposStr(@Path("user") String user);
//错误,不能这样使用异步
// @GET("/users/{user}/repos")
// void listRepos(@Path("user") String user, Callback<List<Repo>> callback);
} private void prepareServiceAPI() {
//For logging
HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
logging.setLevel(HttpLoggingInterceptor.Level.BODY); OkHttpClient client = new OkHttpClient();
client.interceptors().add(new MyInterceptor());
client.interceptors().add(logging);
// setUp Retrofit
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://api.github.com")
//.addConverterFactory(new ToStringConverterFactory())
.addConverterFactory(GsonConverterFactory.create())
.client(client)
.build(); service = retrofit.create(APIService.class);
}
// 异步调用
public void execute() {
Call<List<Repo>> call = service.listRepos("pasha656");
call.enqueue(new Callback<List<Repo>>() {
@Override
public void onResponse(Response<List<Repo>> response, Retrofit retrofit) { if (response.isSuccess()) {
if (!response.body().isEmpty()) {
StringBuilder sb = new StringBuilder();
for (Repo r : response.body()) {
sb.append(r.getId()).append(" ").append(r.getName()).append(" \n");
}
activity.setText(sb.toString());
}
} else {
APIError error = ErrorUtils.parseError(response, retrofit);
Log.d("Pasha", "No succsess message "+error.getMessage());
} if (response.errorBody() != null) {
try {
Log.d("Pasha", "Error "+response.errorBody().string());
} catch (IOException e) {
e.printStackTrace();
}
}
} @Override
public void onFailure(Throwable t) {
Log.d("Pasha", "onFailure "+t.getMessage());
}
});
}

  

OkHttp,Retrofit 1.x - 2.x 基本使用的更多相关文章

  1. Android开发okhttp,retrofit,android-async-http,volley?

    okhttp, retrofit,android-async-http,volley这四个框架适用的场合?优缺点?各位大大,请给一些建议.我准备开发一个新的APP 如果是标准的RESTful API, ...

  2. 一行代码实现Okhttp,Retrofit,Glide下载上传进度监听

    https://mp.weixin.qq.com/s/bopDUFMB7EiK-MhLc3KDXQ essyan 鸿洋 2017-06-29 本文作者 本文由jessyan投稿. jessyan的博客 ...

  3. Android OkHttp + Retrofit 断点续传

    本文链接 前面我们已经知道如何使用OkHttp+Retrofit下载文件. 下载文件时,可能会遇到一些意外情况,比如网络错误或是用户暂停了下载. 再次启动下载,如果又要从头开始,会白白浪费前面下载好的 ...

  4. Android 框架学习之 第一天 okhttp & Retrofit

    最近面试,一直被问道新技术新框架,这块是短板,慢慢补吧. 关于框架的学习,分几个步骤 I.框架的使用 II.框架主流使用的版本和Android对应的版本 III.框架的衍生使用比如okhttp就会有R ...

  5. Android OkHttp + Retrofit 取消请求的方法

    本文链接 前言 在某一个界面,用户发起了一个网络请求,因为某种原因用户在网络请求完成前离开了当前界面,比较好的做法是取消这个网络请求.对于OkHttp来说,具体是调用Call的cancel方法. 如何 ...

  6. Android OkHttp + Retrofit 下载文件与进度监听

    本文链接 下载文件是一个比较常见的需求.给定一个url,我们可以使用URLConnection下载文件. 使用OkHttp也可以通过流来下载文件. 给OkHttp中添加拦截器,即可实现下载进度的监听功 ...

  7. Android 使用Okhttp/Retrofit持久化cookie的简便方式

    首先cookie是什么就不多说了,还是不知道的话推荐看看这篇文章 Cookie/Session机制详解 深入解析Cookie技术 为什么要持久化cookie也不多说了,你能看到这篇文章代表你有这个需求 ...

  8. 高仿Android网易云音乐OkHttp+Retrofit+RxJava+Glide+MVC+MVVM

    简介 这是一个使用Java(以后还会推出Kotlin版本)语言,从0开发一个Android平台,接近企业级的项目(我的云音乐),包含了基础内容,高级内容,项目封装,项目重构等知识:主要是使用系统功能, ...

  9. [Android] 转-RxJava+MVP+Retrofit+Dagger2+Okhttp大杂烩

    原文url: http://blog.iliyun.net/2016/11/20/%E6%A1%86%E6%9E%B6%E5%B0%81%E8%A3%85/ 这几年来android的网络请求技术层出不 ...

随机推荐

  1. Ajax的同步与异步

    原文地址:http://www.cnblogs.com/Joetao/articles/3525007.html <%@ Page Language="C#" AutoEve ...

  2. Webstorm 2016内置web服务器配置

    运行three.js的官方的例子.本来想用IIS来运行,运行不了.所以用webstorm,用鼠标右键的方式,来运行,如下图 但是有一天,我把IIS配置好了,可以在IIS中运行了(只是把build文件夹 ...

  3. 备库Seconds_Behind_Master的计算

    背景 在mysql主备环境下,主备同步过程如下,主库更新产生binlog, 备库io线程拉取主库binlog生成relay log.备库sql线程执行relay log从而保持和主库同步. 理论上主库 ...

  4. vc编译 zlib 1.2.8

    最近用到gzip关的算法,于是想起了zlib这个库,于是将其下载下来编译. 首先,在官网上下载源码包:http://zlib.net/zlib-1.2.8.tar.gz 解压之后,打开vc 命令工具: ...

  5. RCP: JDT 根据org.eclipse.jdt.core.IJavaElement对象获取org.eclipse.jdt.core.dom.ASTNode对象

    JDT中有两套Java文件模型映射. 其核心类\接口分别为: org.eclipse.jdt.core.IJavaElement和org.eclipse.jdt.core.dom.ASTNode IJ ...

  6. 【腾讯Bugly干货分享】微信读书iOS性能优化

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/578c93ca9644bd524bfcabe8 “8小时内拼工作,8小时外拼成长 ...

  7. InnoSetup 如何获取安装程序的路径?

    两个常量可以使用: {srcexe} 安装程序执行文件的路径.      {src} 安装程序所在路径. path := ExpandConstant('{srcexe}');

  8. 站在移动互联时代的十字路口上_deviceone

    最近总能看到类似“App已死,服务永生”.“App必死,web永生” .“App已死,微信建站已生”这样的文章.不晓得这些网络写手到底是想代表某些公司的立场.还是想要表达怎么样的一个情结,文章中语气都 ...

  9. 一种另类的解决URL中文乱码问题--对中文进行加密、解密处理

    情景:在资源调度中,首先用户需要选择工作目标,然后跟据选择的工作目标不同而选择不同的账号和代理ip.处理过程如下:点击选择账号,在js中获取工作目标对工作目标进行两次编码(encodeURI(enco ...

  10. 正式工作的前奏——一个Java程序员的实习总结(1)

    不知不觉,到深圳实习已经三个礼拜了.跟在暑假的三个半月实习不一样,这次收获更多,感受更好,算是摆脱了那次实习给我带来的阴影(这个会放到以后才说). 在知乎上,有这么一个问题,你现在最想跟刚工作时的你说 ...