android 网络框架-Retrofit(一)

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&regid=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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

安卓兼职framework应用工程师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值