Retrofit实现
其实Retrofit框架就是对OkHttp的封装和改进、升级
核心实现:动态代理
基本API讲解以及源码分析
API文档地址
需要设置数据转换器
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://api.github.com")
.addConverterFactory(GsonConverterFactory.create())
.build();
GitHubService service = retrofit.create(GitHubService.class);
否则会报错
[Could not locate ResponseBody xxx Tried: * retrofit.BuiltInConverters]
其他数据类型转换器
Gson: com.squareup.retrofit2:converter-gson
Jackson: com.squareup.retrofit2:converter-jackson
Moshi: com.squareup.retrofit2:converter-moshi
Protobuf: com.squareup.retrofit2:converter-protobuf
Wire: com.squareup.retrofit2:converter-wire
Simple XML: com.squareup.retrofit2:converter-simplexml
Scalars (primitives, boxed, and String): com.squareup.retrofit2:converter-scalars
@POST:代表当前的方法是POST请求
@POST("Login"):接口名
@Field:Post请求参数
@Field(“username”):请求参数名称(服务器接口参数名称)
@Get:代表get请求
@Path:给get情求拼接URL
get请求参数拼接方式
第一种:
@GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId);
FieldMap
第二种: @Query方式
@GET("user/login?platform=android&city_id=101&type=pwd&channel=baiduxi")
public Call<String> loginGet(@Query("mobile") String username,@Query("password") String password);
拼接之后的URL: user/login?platform=android&city_id=101&type=pwd&channel=baiduxi&mobile=XXX&password=XXXX
形如?t=1&p=2&size=3的url链接不能用@PATH注解 否则会报错
java.lang.IllegalArgumentException: URL query string "t={type}&p={page}&size={count}" must not have replace block. For dynamic query parameters use @Query.异常原因
注意:@Path和 @Query也能混合使用
@GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId, @QueryMap Map<String, String> options);
针对多个参数 可使用Map集合
POST:@FieldMap
GET :@QueryMap
@FormUrlEncoded
@POST("user/login?platform=android&city_id=101&type=pwd&channel=baiduxi&version=3.2.0&os_version=6.0.1&device_id=866622020797175")
public Call<String> login(@FieldMap Map<String,String> paramsMap);
@GET("user/login?platform=android&city_id=101&type=pwd&channel=baiduxi&version=3.2.0&os_version=6.0.1&device_id=866622020797175")
public Call<String> loginGet(@QueryMap Map<String,String> pramsMap);
登录例子:
定义接口类
public interface LoginService {
// http://api.cloud.test.haocaisong.cn/v2.0/user/login?platform=android&password=xh130727&city_id=101&device_id=866622020797175&mobile=18810388728&version=3.2.0&os_version=6.0.1®id=LOSkRfxLoPXO4SPah9%2BGqwpvt%2BedJ4wymROb29RE7z4%3D&type=pwd&channel=baiduxi
@FormUrlEncoded
@POST("user/login?platform=android&city_id=101&type=pwd&channel=baiduxi&version=3.2.0&os_version=6.0.1&device_id=866622020797175")
public Call<String> login(@Field("mobile") String username, @Field("password")String password);
@FormUrlEncoded
@POST("user/login?platform=android&city_id=101&type=pwd&channel=baiduxi&version=3.2.0&os_version=6.0.1&device_id=866622020797175")
public Call<String> login(@FieldMap Map<String,String> paramsMap);
@GET("user/login?platform=android&city_id=101&type=pwd&channel=baiduxi&version=3.2.0&os_version=6.0.1&device_id=866622020797175")
public Call<String> loginGet(@Query("mobile") String username,@Query("password") String password);
@GET("user/login?platform=android&city_id=101&type=pwd&channel=baiduxi&version=3.2.0&os_version=6.0.1&device_id=866622020797175")
public Call<String> loginGet(@QueryMap Map<String,String> pramsMap);
}
//Get请求
public class SimpleRetrofitLoginGet {
private static String URL_SERVER = "http://api.cloud.test.haocaisong.cn/v2.0/";
public static void loginSync(String username, String password, SimpleSystemLogin.OnHttpResultListener onHttpResultListener) {
Map<String, String> paramMap = new HashMap<String, String>();
paramMap.put("mobile", username);
paramMap.put("password", password);
HttpTask httpTask = new HttpTask(paramMap, onHttpResultListener);
httpTask.execute();
}
static class HttpTask extends AsyncTask<Void, Void, Object> {
private Map<String, String> paramMap;
private SimpleSystemLogin.OnHttpResultListener onHttpResultListener;
public HttpTask( Map<String, String> paramMap,
SimpleSystemLogin.OnHttpResultListener onHttpResultListener) {
this.paramMap = paramMap;
this.onHttpResultListener = onHttpResultListener;
}
@Override
protected Object doInBackground(Void... params) {
LoginService loginService = getLoginService();
Call<String> callLogin = loginService.loginGet(paramMap);
try {
Response<String> response = callLogin.execute();
return response.body();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Object result) {
if (this.onHttpResultListener != null) {
this.onHttpResultListener.onHttpResult(result);
}
}
}
@NonNull
private static OkHttpClient getOkHttpClient() {
HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor();
httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
return new OkHttpClient.Builder().addInterceptor(httpLoggingInterceptor).build();
}
/**
* 异步:采用Retrofit框架自带的
* @param username
* @param password
* @param onHttpResultListener
*/
public static void loginAsync(String username, String password, final SimpleSystemLogin.OnHttpResultListener onHttpResultListener){
LoginService loginService = getLoginService();
Call<String> callLogin = loginService.loginGet(username,password);
try {
callLogin.enqueue(new Callback<String>() {
@Override
public void onResponse(Call<String> call, Response<String> response) {
onHttpResultListener.onHttpResult(response.body());
}
@Override
public void onFailure(Call<String> call, Throwable t) {
onHttpResultListener.onHttpResult("登录失败!");
}
});
}catch (Exception e){
e.printStackTrace();
}
}
private static LoginService getLoginService() {
OkHttpClient okHttpClient = getOkHttpClient();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(URL_SERVER)
.addConverterFactory(ScalarsConverterFactory.create())
.client(okHttpClient)
.build();
return retrofit.create(LoginService.class);
}
}
//POST请求
public class SimpleRetrofitLoginPost {
private static String URL_SERVER = "http://api.cloud.test.haocaisong.cn/v2.0/";
public static void loginSync(String username, String password, SimpleSystemLogin.OnHttpResultListener onHttpResultListener) {
Map<String, String> paramMap = new HashMap<String, String>();
paramMap.put("mobile", username);
paramMap.put("password", password);
HttpTask httpTask = new HttpTask(paramMap, onHttpResultListener);
httpTask.execute();
}
static class HttpTask extends AsyncTask<Void, Void, Object> {
private Map<String, String> paramMap;
private SimpleSystemLogin.OnHttpResultListener onHttpResultListener;
public HttpTask( Map<String, String> paramMap,
SimpleSystemLogin.OnHttpResultListener onHttpResultListener) {
this.paramMap = paramMap;
this.onHttpResultListener = onHttpResultListener;
}
@Override
protected Object doInBackground(Void... params) {
LoginService loginService = getLoginService();
Call<String> callLogin = loginService.login(paramMap);
try {
Response<String> response = callLogin.execute();
return response.body();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Object result) {
if (this.onHttpResultListener != null) {
this.onHttpResultListener.onHttpResult(result);
}
}
}
/**
* 异步:采用Retrofit框架自带的
* @param username
* @param password
* @param onHttpResultListener
*/
public static void loginAsync(String username, String password, final SimpleSystemLogin.OnHttpResultListener onHttpResultListener){
LoginService loginService = getLoginService();
Call<String> callLogin = loginService.login(username,password);
try {
callLogin.enqueue(new Callback<String>() {
@Override
public void onResponse(Call<String> call, Response<String> response) {
onHttpResultListener.onHttpResult(response.body());
}
@Override
public void onFailure(Call<String> call, Throwable t) {
onHttpResultListener.onHttpResult("登录失败!");
}
});
}catch (Exception e){
e.printStackTrace();
}
}
@NonNull
private static OkHttpClient getOkHttpClient() {
HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor();
httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
return new OkHttpClient.Builder().addInterceptor(httpLoggingInterceptor).build();
}
private static LoginService getLoginService() {
OkHttpClient okHttpClient = getOkHttpClient();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(URL_SERVER)
.addConverterFactory(ScalarsConverterFactory.create())
.client(okHttpClient)
.build();
return retrofit.create(LoginService.class);
}
}
Retrofit源码解析
public <T> T create