Retrofit

作者: 限量版MVP | 来源:发表于2017-10-18 16:52 被阅读0次

    Retrofit与okhttp共同出自于Square公司,retrofit就是对okhttp做了一层封装。把网络请求都交给给了Okhttp,我们只需要通过简单的配置就能使用retrofit来进行网络请求了,作者就是本人小大神使用中实践总结的一些小经验。

    一.首先需要添加Gradle最新依赖(建议大家经常去最新的官方网站查看)

    compile'com.squareup.retrofit2:retrofit:2.0.1'
    compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta4'//ConverterFactory的Gson依赖包
    compile 'com.squareup.retrofit2:converter-scalars:2.0.0-beta4'//ConverterFactory的String依赖包

    这里注意添加的另外的两个接口是后面需要添加的转化器方便解析数据

    二.创建API接口(注意添加INTENT网络权限)

    public interface NetApi {
    @GET()
    Call<ResponseBody> getJavaBean(@path("value"),String key);
    }
    

    三.创建Retrofit对象

    public static Gson buildGson() {
    if (gson == null) {
    gson = new GsonBuilder()
    .setDateFormat("yyyy-MM-dd HH:mm:ss")
    .registerTypeAdapter(Integer.class, new IntegerDefault0Adapter())
    .registerTypeAdapter(int.class, new IntegerDefault0Adapter())
    .create();
    }
    return gson;
    }
    OkHttpClient client = new OkHttpClient.Builder()
    .connectTimeout(10, TimeUnit.SECONDS)
    .writeTimeout(1, TimeUnit.SECONDS)
    .readTimeout(1, TimeUnit.SECONDS)
    .build();
    // 业务链接
    retrofit = new Retrofit.Builder()
    .baseUrl(Constant.URL)
    .addConverterFactory(GsonConverterFactory.create(buildGson()))
    .client(client)
    .build();

    4.通过创建的retrofit对象把创建的NetApi接口变成java对象

    NetApi netApi = retrofit.create(NetApi.class);
    这里采用的是动态代理模式

    5.创建call对象,并解析数据然后保存

    Call<LoginBean> call = MyApp.getNetApi().postLogin(os, phone, UiUtils.md5(password), type);
    call.enqueue(new Callback<LoginBean>() {
    @Override
    public void onResponse(Call<LoginBean> call, Response<LoginBean> response) {
    if (response.isSuccessful()) {
    switchOfLoginResult(response.body());
    } else {

                }
            }
    
            @Override
            public void onFailure(Call<LoginBean> call, Throwable t) {
    
            }
        });
    }
    

    private void switchOfLoginResult(LoginBean body) {
    switch (body.getStatus()) {
    case 0:
    CacheUtil.putString(act, "username", body.getData().getPhone());
    CacheUtil.putString(act, "password", UiUtils.md5(password));
    CacheUtil.putString(act, "type", body.getData().getType());
    // if (loginType.equals("result")){
    // // }
    // finish();
    break;
    default:
    UiUtils.showToast("登录失败");
    break;
    }
    }

    这样就基本完成了一次完整的网络请求接下来是一些简单的补充

    请求的类型包括

    五种注解方式:GET POST PUT DELETE HEAD 相对的URL在注解内容中添加(这里需要注意的是@path @Query @Filed @Multipart 避免犯错建议使用一样的注解方式因为这里会报参数错误很难找到错误的原因,)

    其它的一些简单知识补充

    Retrofit对输入和输出做了封装,通过TypedOutput向服务器发送数据,通过TypedInput读取服务器返回的数据。

    通过MultipartTypedOutput支持文件上传,读取服务器数据时,如果要求直接返回未解析的Response,Restonse会被转换为TypedByteArray,所以不能是大文件类的

    Retrofit支持不同的Log等级,当为LogLevel.Full时会把Request及Response的Body打印出来,所以如果包含文件就不行了。

    Retrofit默认使用GsonConverter,所以要想获取原始数据不要Retrofit解析,要么自定义Conveter,要么直接返回Response了,返回Response也比较麻烦

    总体来说Retrofit看起来很好用,不过要求服务端返回数据最好要规范,不然如果请求成功返回一种数据结构,请求失败返回另一种数据结构,不好用Converter解析,接口的定义也不好定义,除非都返回Response,或自定义Converter所有接口都返回String

    期待接下来的更新

    相关文章

      网友评论

          本文标题:Retrofit

          本文链接:https://www.haomeiwen.com/subject/vcceuxtx.html