实战retrofit

来源:互联网 发布:金蝶房地产软件 编辑:程序博客网 时间:2024/06/08 07:18

retrofit 是一个类型安全的 REST 客户端,用于 Android 平台。

上次项目因为时间关系并没有来得及用上retrofit这个据说比volley(因为我之前项目是用的volley)更快捷的。这周翻看了网上一些资料学习了,并总结了一下。

首先,配置。方法在as添加,就不细说了。(retrofit 2.0)

接下来就看使用方法 (ApiService)

@POST("login")    Call<LoginResult> getLogin(@Query("phone") String phone, @Query("password") String password);   

@POST是请求方法。里面包含的则是对应的接口。Call方法里面是返回的数据。@Query 是添加查询 。

Retrofit的Annotation包含请求方法相关的@GET、@POST、@HEAD、@PUT、@DELETA、@PATCH,和参数相关的@Path、@Field、@Multipart等。

注意:@GET 等请求不要以/开头;@Url: 可以定义完整url,不要以 / 开头。

然后是一个总的用法。

Retrofit retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create(gson))
.build();
LoginService loginService = retrofit.create(LoginService.class);

这里的baseUrl是接口前缀。addConverterFactory(GsonConverterFactory.create(gson))是转换器,提供Gson支持,可以添加多种序列化Factory,但是GsonConverterFactory必须放在最后,否则会抛出异常。 然后到2.0移除了Converter,所以需要自己插入一个Converter 不然的话Retrofit 只能接收字符串结果。同样的,2.0也不再依赖于Gson。2.0之后网络请求可以取消。

Call loginResultCall = loginService.getLogin(phone,password);
taskListsResultCall.enqueue(new Callback() {
@Override
public void onResponse(Call call, Response response) {
if (response.isSuccessful()) {
Log.e(“h”, “成功” + response.body());
}
}@Override
public void onFailure(Call call, Throwable t) {
Log.e(“h”, “失败”);
}
});

当然如果想要实现拦截器和超时设置就需要依赖okhttp。以下是我写的一个调用类。写的并不好,不喜勿喷。

import com.app.spire.BuildConfig;import com.app.spire.network.url.ApiUrl;import java.io.IOException;import java.util.concurrent.TimeUnit;import okhttp3.Headers;import okhttp3.HttpUrl;import okhttp3.Interceptor;import okhttp3.OkHttpClient;import okhttp3.Request;import okhttp3.Response;import okhttp3.logging.HttpLoggingInterceptor;import retrofit2.Retrofit;import retrofit2.converter.gson.GsonConverterFactory;/** * Created by huyin on 16/7/10. */public class AppClient {    public static Retrofit retrofit = null;    public static Retrofit retrofit() {        if (retrofit == null) {            OkHttpClient.Builder builder = new OkHttpClient.Builder();            /**             *  公共参数             */            Interceptor addQueryParameterInterceptor = new Interceptor() {                @Override                public Response intercept(Chain chain) throws IOException {                    Request originalRequest = chain.request();                    Request request = null;                    String method = originalRequest.method();                    Headers headers = originalRequest.headers();                    HttpUrl modifiedUrl = originalRequest.url().newBuilder()                            .addQueryParameter("参数1", "")                            .addQueryParameter("参数2", "")                            .build();                    request = originalRequest.newBuilder().url(modifiedUrl).build();                    return chain.proceed(request);                }            };            builder.addInterceptor(addQueryParameterInterceptor);            /**             * Log信息拦截器             */            if (BuildConfig.DEBUG) {                // Log信息拦截器                HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();                loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);                //设置 Debug Log 模式                builder.addInterceptor(loggingInterceptor);            }            /**             * 设置超时和重连             */            //设置超时            builder.connectTimeout(10, TimeUnit.SECONDS);            builder.readTimeout(10, TimeUnit.SECONDS);            builder.writeTimeout(10, TimeUnit.SECONDS);//            builder.retryOnConnectionFailure(true);//错误重连            OkHttpClient okHttpClient = builder.build();            retrofit = new Retrofit.Builder()                    .baseUrl(ApiUrl.getHeadUrl())                    .client(okHttpClient)                    .addConverterFactory(GsonConverterFactory.create())//转换器                    .build();        }        return retrofit;    }}

import com.app.spire.network.result.BaseResult;
import com.app.spire.util.ActivityUtils;

import java.net.ConnectException;
import java.net.SocketTimeoutException;

import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;

/**
* Created by huyin on 16/7/10.
*/
public class BaseRequest {
private Call mCall;

public BaseRequest( Call call) {    mCall = call;}//异步请求public void handleResponse(final ResponseListener listener) {    mCall.enqueue(new Callback<T>() {        @Override        public void onResponse(Call<T> call, Response<T> response) {            if (response.raw().code() == 200) {//200是服务器有合理响应                if (response.isSuccessful() && response.errorBody() == null) {                    listener.onSuccess(response.body());                } else {                    listener.onFail();                }            } else {//失败响应                onFailure(call, new RuntimeException("response error,detail = " + response.raw().toString()));            }        }        @Override        public void onFailure(Call<T> call, Throwable t) {            if (t instanceof SocketTimeoutException) {                ActivityUtils.toast("连接超时!");            } else if (t instanceof ConnectException) {                ActivityUtils.toast("网络出错");            } else if (t instanceof RuntimeException) {            }        }    });}// 取消public void cancel(){    mCall.cancel();}public interface ResponseListener<T> {    void onSuccess(BaseResult t);    void onFail();}

}
未完待续…

1 0
原创粉丝点击