android retrofit 2.0公共参数,Android Retrofit 2.0 使用-补充篇

之前分享的Android Retrofit 2.0 使用,属于基本的使用,实际开发还远远不够,因此对其补充,主要在Retrofit配置和接口参数。

Retrofit配置

添加依赖

app/build.gradle

compile 'com.squareup.retrofit2:retrofit:2.0.2'

首先Builder(),得到OkHttpClient.Builder对象builder

OkHttpClient.Builder builder = new OkHttpClient.Builder();

Log信息拦截器

Debug可以看到,网络请求,打印Log信息,发布的时候就不需要这些log

1、添加依赖

app/build.gradle

compile 'com.squareup.okhttp3:logging-interceptor:3.1.2'

2、Log信息拦截器

if (BuildConfig.DEBUG) {

// Log信息拦截器

HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();

loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);

//设置 Debug Log 模式

builder.addInterceptor(loggingInterceptor);

}

缓存机制

无网络时,也能显示数据

File cacheFile = new File(DemoApplication.getContext().getExternalCacheDir(), "WuXiaolongCache");

Cache cache = new Cache(cacheFile, 1024 * 1024 * 50);

Interceptor cacheInterceptor = new Interceptor() {

@Override

public Response intercept(Chain chain) throws IOException {

Request request = chain.request();

if (!AppUtils.networkIsAvailable(DemoApplication.getContext())) {

request = request.newBuilder()

.cacheControl(CacheControl.FORCE_CACHE)

.build();

}

Response response = chain.proceed(request);

if (AppUtils.networkIsAvailable(DemoApplication.getContext())) {

int maxAge = 0;

// 有网络时 设置缓存超时时间0个小时

response.newBuilder()

.header("Cache-Control", "public, max-age=" + maxAge)

.removeHeader("WuXiaolong")// 清除头信息,因为服务器如果不支持,会返回一些干扰信息,不清除下面无法生效

.build();

} else {

// 无网络时,设置超时为4周

int maxStale = 60 * 60 * 24 * 28;

response.newBuilder()

.header("Cache-Control", "public, only-if-cached, max-stale=" + maxStale)

.removeHeader("nyn")

.build();

}

return response;

}

};

builder.cache(cache).addInterceptor(cacheInterceptor);

公共参数

可能接口有某些参数是公共的,不可能一个个接口都去加吧

//公共参数

Interceptor addQueryParameterInterceptor = new Interceptor() {

@Override

public Response intercept(Chain chain) throws IOException {

Request originalRequest = chain.request();

Request request;

String method = originalRequest.method();

Headers headers = originalRequest.headers();

HttpUrl modifiedUrl = originalRequest.url().newBuilder()

// Provide your custom parameter here

.addQueryParameter("platform", "android")

.addQueryParameter("version", "1.0.0")

.build();

request = originalRequest.newBuilder().url(modifiedUrl).build();

return chain.proceed(request);

}

};

//公共参数

builder.addInterceptor(addQueryParameterInterceptor);

设置头

有的接口可能对请求头要设置

Interceptor headerInterceptor = new Interceptor() {

@Override

public Response intercept(Chain chain) throws IOException {

Request originalRequest = chain.request();

Request.Builder requestBuilder = originalRequest.newBuilder()

.header("AppType", "TPOS")

.header("Content-Type", "application/json")

.header("Accept", "application/json")

.method(originalRequest.method(), originalRequest.body());

Request request = requestBuilder.build();

return chain.proceed(request);

}

};

//设置头

builder.addInterceptor(headerInterceptor );

设置cookie

服务端可能需要保持请求是同一个cookie,主要看各自需求

1、app/build.gradle

compile 'com.squareup.okhttp3:okhttp-urlconnection:3.2.0'

2、设置cookie

CookieManager cookieManager = new CookieManager();

cookieManager.setCookiePolicy(CookiePolicy.ACCEPT_ALL);

builder.cookieJar(new JavaNetCookieJar(cookieManager));

设置超时和重连

希望超时时能重连

//设置超时

builder.connectTimeout(15, TimeUnit.SECONDS);

builder.readTimeout(20, TimeUnit.SECONDS);

builder.writeTimeout(20, TimeUnit.SECONDS);

//错误重连

builder.retryOnConnectionFailure(true);

最后将这些配置设置给retrofit:

OkHttpClient okHttpClient = builder.build();

Retrofit retrofit = new Retrofit.Builder()

.baseUrl(ApiStores.API_SERVER_URL)

//设置 Json 转换器

.addConverterFactory(GsonConverterFactory.create())

//RxJava 适配器

.addCallAdapterFactory(RxJavaCallAdapterFactory.create())

.client(okHttpClient)

.build();

完整配置

public class AppClient {

public static Retrofit retrofit = null;

public static Retrofit retrofit() {

if (retrofit == null) {

OkHttpClient.Builder builder = new OkHttpClient.Builder();

/**

*设置缓存,代码略

*/

/**

* 公共参数,代码略

*/

/**

* 设置头,代码略

*/

/**

* Log信息拦截器,代码略

*/

/**

* 设置cookie,代码略

*/

/**

* 设置超时和重连,代码略

*/

//以上设置结束,才能build(),不然设置白搭

OkHttpClient okHttpClient = builder.build();

retrofit = new Retrofit.Builder()

.baseUrl(ApiStores.API_SERVER_URL)

.client(okHttpClient)

.build();

}

return retrofit;

}

}

接口参数

Path

@GET("2016/01/15/{retrofit}")

Call getData(@Path("retrofit") String retrofit);

即您传的参数retrofit内容会替换大括号里的内容。

Query

@GET("v1")

Call getData(@Query("ip") String ip,@Query("name") String name);

Field

表单提交,如登录

@FormUrlEncoded

@POST("v1/login")

Call userLogin(@Field("phone") String phone, @Field("password") String password);

传json格式

如果参数是json格式,如:

{

"apiInfo": {

"apiName": "WuXiaolong",

"apiKey": "666"

}

}

建立Bean

public class ApiInfo {

private ApiInfoBean apiInfo;

public ApiInfoBean getApiInfo() {

return apiInfo;

}

public void setApiInfo(ApiInfoBean apiInfo) {

this.apiInfo = apiInfo;

}

public class ApiInfoBean {

private String apiName;

private String apiKey;

//省略get和set方法

}

}

ApiStores

@POST("client/shipper/getCarType")

Call getData(@Body ApiInfo apiInfo);

代码调用

ApiInfo apiInfo = new ApiInfo();

ApiInfo.ApiInfoBean apiInfoBean = apiInfo.new ApiInfoBean();

apiInfoBean.setApiKey("666");

apiInfoBean.setApiName("WuXiaolong");

apiInfo.setApiInfo(apiInfoBean);

//调接口

getData(apiInfo);

传数组

@GET("v1/enterprise/find")

Call getData(@Query("id") String id, @Query("linked[]") String... linked);

代码调用

String id="WuXiaolong";

String[] s = new String[]{"WuXiaolong"};

//调接口

getData(id, s);

传文件-单个

@Multipart

@POST("v1/create")

Call create(@Part("pictureName") RequestBody pictureName, @Part MultipartBody.Part picture);

代码调用

RequestBody pictureNameBody = RequestBody.create(MediaType.parse(AppConstants.CONTENT_TYPE_FILE), "pictureName");

File picture= new File(path);

RequestBody requestFile = RequestBody.create(MediaType.parse(AppConstants.CONTENT_TYPE_FILE), picture);

// MultipartBody.Part is used to send also the actual file name

MultipartBody.Part picturePart = MultipartBody.Part.createFormData("picture", picture.getName(), requestFile);

//调接口

create(pictureNameBody, picturePart);

传文件-多个

@Multipart

@POST("v1/create")

Call create(@Part("pictureName") RequestBody pictureName, @PartMap Map params);

代码调用

RequestBody pictureNameBody = RequestBody.create(MediaType.parse(AppConstants.CONTENT_TYPE_FILE), "pictureName");

File picture= new File(path);

RequestBody requestFile = RequestBody.create(MediaType.parse(AppConstants.CONTENT_TYPE_FILE), picture);

Map params = new HashMap<>();

params.put("picture\"; filename=\"" + picture.getName() + "", requestFile);

//调接口

create(pictureNameBody, params);

微信公众号

我的微信公众号:吴小龙同学。

不止于技术分享,不取悦他人,写给懂的你看~

欢迎微信扫一扫关注。

93153b34310e

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值