Retrofit 使用技巧

Retrofit 使用技巧

  1. 创建工厂类
	public class RetrofitFactory {
	    private static String baseUrl = "BaseURL/";
	
	    private static Retrofit GsonRetrofit = new Retrofit.Builder()
	            .baseUrl(baseUrl)
	
	            //TOdo 添加转换器配置
	            .addConverterFactory(GsonConverterFactory.create(GsonFactory.getgson()))
	            .build();
	
	
	    //解析返回的字符串
	    public static LogInService getStringService() {
	        LogInService service = GsonRetrofit.create(LogInService.class);
	        return service;
	    }
	
	
	}
	 //retrofit底层用的okHttp,所以设置超时还需要okHttp
	 //然后设置5秒超时
	 //其中DEFAULT_TIMEOUT是我这边定义的一个常量
	 //TimeUnit为java.util.concurrent包下的时间单位
	 //TimeUnit.SECONDS这里为秒的单位
	 OkHttpClient client = new OkHttpClient.Builder()
	    .connectTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS)
	      .writeTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS)
	       .readTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS)
	                        .build();
	
	  //构建Retrofit对象
	  //然后将刚才设置好的okHttp对象,通过retrofit.client()方法 设置到retrofit中去
	    retrofit = new Retrofit.Builder().baseUrl(baseUrl)
	    .addConverterFactory(GsonConverterFactory.create()).client(client).build();    
  1. 通过泛型和注解方式配置参数

	
	public interface LogInService {
	    @GET("/auth/login")
	    Call<LogInRequestBean> login(@Query("mail") String mail,
	                                 @Query("secret") String secret,
	                                 @Query("device") String device);
	
	    @GET("/auth/check")
	    Call<CheckBean> check(@Query("mail") String mail);
	
	    @GET("/auth/register")
	    Call<LogInRequestBean> register(@Query("mail") String mail,
	                                    @Query("secret") String secret,
	                                    @Query("code") String code,
	                                    @Query("device") String device);
	
	    @GET("/auth/refresh")
	    Call<LogInRequestBean> refresh(@Query("mail") String mail,
	                                   @Query("refresh_token") String refresh_token,
	                                   @Query("device") String device);
	
	}
  1. 生成转换后的bean 使用gsonformat(必要值可定义枚举)
    4.创建requestManager统一处理网络请求
	public class RequestManager {
        
    /**
     * 重置密码
     *
     * @param email
     * @param password
     * @param deviceID
     */
    public static void register(String email, String password, String code, String deviceID) {
        Call<LogInRequestBean> call = RetrofitFactory.getStringService().register(email, password, code, deviceID);
        if (call != null) {
            call.enqueue(new Callback<LogInRequestBean>() {
                @Override
                public void onResponse(Call<LogInRequestBean> call, Response<LogInRequestBean> response) {
                    if (response.code() == 200) {
                        //TODO 记录当前用户类型
                        //todo 记录"accessToken": "string", "expiresIn": 0,"refreshToken": "string",
                        LogInRequestBean logInRequestBean = response.body();
                        //todo 登陆成功
                        EventBus.getDefault().post(new CTLoginEvent(CTEvent.TYPE_LOGIN, true, CTLoginEvent.REASON_NONE));

                    }
                    //todo 登陆失败
                    else {
                        EventBus.getDefault().post(new CTLoginEvent(CTEvent.TYPE_LOGIN, false, CTLoginEvent.REASON_INVALID_PARAM));

                    }


                }

                @Override
                public void onFailure(Call<LogInRequestBean> call, Throwable t) {
                    //todo 网络失败
                }
            });
        }
    }
}

表单提交:

@FormUrlEncoded
    @POST("/oauth/refresh")
    Call<LogInRequestBean> refreshToken(@Header("Authorization") String authorization,
                                        @Field("username") String username,
                                        @Field("refresh_token") String refreshToken,
                                        @Field("grant_type") String grantType);
  1. 处理逻辑此处应特别注意,不应该在manager中拆开response,只需将response传递给请求方即可。
  2. 和EventBus结合即可将对象在回传事件时传递给请求调起方

baseurl更改为动态:

public class RetrofitFactory {
    private static Gson gson = new GsonBuilder()
            .setDateFormat("yyyy-MM-dd hh:mm:ss")
            .create();
    private static String baseUrl;

    public static boolean setBaseUrl(String url) {
        HttpUrl httpUrl = HttpUrl.parse(url);
        if (httpUrl == null) {
            return false;
        }
        baseUrl = url;
        return true;
    }

    //解析返回的字符串
    public static Authentication getAuthenticationService() {
        Retrofit GsonRetrofit = new Retrofit.Builder()
                .baseUrl(baseUrl)
                .addConverterFactory(GsonConverterFactory.create(gson))
                .build();
        Authentication authenticationService = GsonRetrofit.create(Authentication.class);
        return authenticationService;
    }
}

判定一次请求正在进行中则不发起第二次请求:

public static void login(String username, String password, String terminalSwVersion) {
        if (sIsLogin) {
            return;
        }
        sIsLogin = true;
        Call<LoginRequestBean> call = RetrofitFactory.getAuthenticationService().login(xxxxxxx, username, Utils.getMD5(password).toString(), "1a", "2b", "3c", "4d", "sdk-" + terminalSwVersion);
        call.enqueue(new Callback<LoginRequestBean>() {
            @Override
            public void onResponse(Call<LoginRequestBean> call, Response<LoginRequestBean> response) {
                switch (response.code()) {
                    case 401:
                        EventBus.getDefault().post(new LoginEvent(false, 401, response.body()));
                        break;
                    case 200:
                        EventBus.getDefault().post(new LoginEvent(true, 200, response.body()));
                        break;
                    case 400:
                        EventBus.getDefault().post(new LoginEvent(false, 400, null));
                        break;
                    default:
                        EventBus.getDefault().post(new LoginEvent(false, response.code(), null));
                        break;
                }
                sIsLogin = false;
            }

            @Override
            public void onFailure(Call<LoginRequestBean> call, Throwable t) {
                t.printStackTrace();
                sIsLogin = false;
                EventBus.getDefault().post(new LoginEvent(false, LoginEvent.NETWORK_TIME_OUT, null));
            }
        });
    }

支持https:

  /*********   Https   *********/

    private static OkHttpClient getOkHttpClient() {
        if (okHttpClient == null) {

            if (okHttpClient == null) {
                okHttpClient = new OkHttpClient().newBuilder()
                        .connectTimeout(15, TimeUnit.SECONDS)
                        .readTimeout(15, TimeUnit.SECONDS)
                        .writeTimeout(15, TimeUnit.SECONDS)
                        .sslSocketFactory(getSSLSocketFactory())//配置
                        .hostnameVerifier(getHostnameVerifier())//配置
                        .build();
            }
        }
        return okHttpClient;
    }

    //获取这个SSLSocketFactory
    public static SSLSocketFactory getSSLSocketFactory() {
        try {
            SSLContext sslContext = SSLContext.getInstance("SSL");
            sslContext.init(null, getTrustManager(), new SecureRandom());
            return sslContext.getSocketFactory();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    //获取TrustManager
    private static TrustManager[] getTrustManager() {
        TrustManager[] trustAllCerts = new TrustManager[]{
                new X509TrustManager() {
                    @Override
                    public void checkClientTrusted(X509Certificate[] chain, String authType) {
                    }

                    @Override
                    public void checkServerTrusted(X509Certificate[] chain, String authType) {
                    }

                    @Override
                    public X509Certificate[] getAcceptedIssuers() {
                        return new X509Certificate[]{};
                    }
                }
        };
        return trustAllCerts;
    }

    //获取HostnameVerifier
    public static HostnameVerifier getHostnameVerifier() {
        HostnameVerifier hostnameVerifier = new HostnameVerifier() {
            @Override
            public boolean verify(String s, SSLSession sslSession) {
                return true;
            }
        };
        return hostnameVerifier;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值