Retrofit Best Practice
dependencies
compile 'com.zhy:okhttputils:2.6.2'
compile 'com.squareup.retrofit2:retrofit:2.0.0'
compile 'com.squareup.retrofit2:converter-gson:2.0.0'
encapsulation
u can also init it in your application
public class HttpManager {
/**
* Holds the Singleton global instance of HttpManager.
*/
private static final HttpManager sInstance = new HttpManager();
/*
* baseUrl must end in /
*/
private static final String BASE_URL = "http://www.vincyan.com/dema/mobile/";
private Retrofit mRetrofit;
private HttpManager() {
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.connectTimeout(10000L, TimeUnit.MILLISECONDS)
.readTimeout(10000L, TimeUnit.MILLISECONDS)
.addInterceptor(new LoggerInterceptor("HttpTag"))
//default no cookie。CookieJar.NO_COOKIES
//persistent cookie
.cookieJar(new CookieJarImpl(new PersistentCookieStore(applicationContext)))
//memery cookie
// .cookieJar(new CookieJarImpl(new MemoryCookieStore()))
.build();
mRetrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create(new Gson()))
.client(okHttpClient)
.build();
}
public static HttpManager getInstance() {
return sInstance;
}
public <T> T createService(Class<T> clazz) {
return mRetrofit.create(clazz);
}
}
ApiService
public interface ApiService {
/*
标准的post请求:
1、@FormUrlEncoded
表示表单数据(post参数),Each key-value pair is annotated with @Field
containing the name and the object providing the value.
否则会报异常IllegalArgumentException: @Field parameters can only be used with form encoding
2、@Field 表示key-value
3、@POST post请求
*/
//登录
@FormUrlEncoded
@POST("index.php?act=login")
Call<User> login(@Field("username") String username, @Field("password") String password, @Field("client") String client);
//购物车数量
@FormUrlEncoded
@POST("index.php?act=member_cart&op=cart_count")
Call<Cart> cartCount(@Field("key") String key);
//关键字搜索,普通get
@GET("index.php?act=index&op=search_key_list")
Call<Search> search();
//分页红包,带参get
//等价于:index.php?act=member_redpacket&op=redpacket_list&key=4bf2ec6ff96824dd792ac079fb90422f&curpage=1&page=1000
@GET("index.php?act=member_redpacket&op=redpacket_list")
Call<Redpacket> redpacket(@Query("key") String key, @Query("curpage") String curpage, @Query("page") String page);
//或使用Map表单
@GET("index.php?act=member_redpacket&op=redpacket_list")
Call<Redpacket> redpacket(@QueryMap Map<String, String> params);
//Java版本第三方登录方式qq/weixin/weibo
@GET("/loginconnect/umeng/{type}")
Call<User> third(@Path("type") String type,@QueryMap Map<String, String> params);
}
Just
ApiService apiService = HttpManager.getInstance().createService(ApiService.class);
//post登录
apiService.login("lv1234", "333333", "android").enqueue(new Callback<User>() {
@Override
public void onResponse(Call<User> call, Response<User> response) {
Log.d(TAG, "onResponse: 登录: " + response.body());
}
@Override
public void onFailure(Call<User> call, Throwable t) {
Log.e(TAG, "onFailure() returned: " + t.getMessage());
}
});
//post购物车数量
apiService.cartCount("bbaad219df1e8271eeb631c51ac78af5").enqueue(new Callback<Cart>() {
@Override
public void onResponse(Call<Cart> call, Response<Cart> response) {
Log.d(TAG, "onResponse: 购物车数量: "+response.body());
}
@Override
public void onFailure(Call<Cart> call, Throwable t) {
Log.e(TAG, "onFailure: "+t.getMessage() );
}
});
//get,无参数
apiService.search().enqueue(new Callback<Search>() {
@Override
public void onResponse(Call<Search> call, Response<Search> response) {
Log.d(TAG, "onResponse: 搜索: "+response.body());
}
@Override
public void onFailure(Call<Search> call, Throwable t) {
Log.e(TAG, "onFailure: "+t.getMessage() );
}
});
//带参get,key和当前页id
apiService.redpacket("4bf2ec6ff96824dd792ac079fb90422f","1","10").enqueue(new Callback<Redpacket>() {
@Override
public void onResponse(Call<Redpacket> call, Response<Redpacket> response) {
Log.d(TAG, "onResponse: 红包: "+response.body());
}
@Override
public void onFailure(Call<Redpacket> call, Throwable t) {
Log.e(TAG, "onFailure: "+t.getMessage() );
}
});
//带参get,key和当前页id
Map<String,String> map = new HashMap<>();
map.put("key","4bf2ec6ff96824dd792ac079fb90422f");
map.put("curpage","1");
map.put("page","10");
apiService.redpacket(map).enqueue(new Callback<Redpacket>() {
@Override
public void onResponse(Call<Redpacket> call, Response<Redpacket> response) {
Log.d(TAG, "onResponse: 使用Map获取红包: "+response.body());
}
@Override
public void onFailure(Call<Redpacket> call, Throwable t) {
Log.e(TAG, "onFailure: "+t.getMessage() );
}
});
//get带path,带参数
Map<String,String> params = new HashMap<>();
map.put("accessToken","4bf2ec6ff96824dd792ac079fb90422f");
map.put("openId","1khkgfdv");
map.put("clientType","android");
apiService.third("weixin",params).enqueue(new Callback<User>() {
@Override
public void onResponse(Call<User> call, Response<User> response) {
Log.d(TAG, "onResponse: 第三方登录: " + response.body());
Log.d(TAG, "onResponse: 第三方登录: " + response.code()+"-->"+response.message());
}
@Override
public void onFailure(Call<User> call, Throwable t) {
Log.e(TAG, "onFailure: "+t.getMessage() );
}
});