美文网首页
网络框架Retrofit2.0

网络框架Retrofit2.0

作者: huqj | 来源:发表于2018-06-07 18:47 被阅读0次

    上一篇学习了okhttp的入门篇,这一篇学习的retrofit底层默认使用的就是okhttp,相信大家多少也听过这个框架,下面我们就来一起学习下,讲真,学会之后这个框架用起来真的很爽,特别灵活。

    按照习惯先来说一下它的优缺点

    优点:

    可以配置不同HTTP client来实现网络请求,如okhttp、httpclient等

    请求的方法参数注解都可以定制

    支持同步、异步和RxJava

    超级解耦

    可以配置不同的反序列化工具来解析数据,如json、xml等

    使用非常方便灵活

    框架使用了很多设计模式(感兴趣的可以看看源码学习学习)

    缺点:

    不能接触序列化实体和响应数据

    执行的机制太严格

    使用转换器比较低效

    只能支持简单自定义参数类型

    相关学习资料的网址

    retrofit官网:http://square.github.io/retrofit/

    github地址:https://github.com/square/retrofit

    Simple HTTP with Retrofit2:

    https://realm.io/news/droidcon-jake-wharton-simple-http-retrofit-2/

    环境配置

    在builde.gradle里面添加上

    compile'com.squareup.retrofit2:retrofit:2.1.0'compile'com.squareup.retrofit2:converter-gson:2.1.0'compile'com.squareup.okhttp3:okhttp:3.4.1'

    在AndroidManifest.xml添加所需权限

    基本使用

     get异步请求

    .baseUrl设置最基本url,也就是http请求的url前缀,可以把项目中重复的前缀用这个来设置

    .addConverterFactory(GsonConverterFactory.create())是添加Gson数据解析ConverterFactory,后面会专门介绍下这个,这里就不做过多解释

    ResponseBody这个是okhttp里面的对象,可以直接返回整个字符串,也可以获取流的形式

    post异步请求

    POST与GET实现基本上是一样的,只是把注解GET换成POST就OK.为了测试POST,专门去网上找了个接口测试,下面就分享给大家,既可以用GET也可以用POST请求

    http://www.kuaidi100.com/query?type=快递公司代号&postid=快递单号 ps:快递公司编码:申通="shentong"EMS="ems"顺丰="shunfeng"圆通="yuantong"中通="zhongtong"韵达="yunda"天天="tiantian"汇通="huitongkuaidi"全峰="quanfengkuaidi"德邦="debangwuliu"宅急送="zhaijisong"

    拿着这个接口来实现一下POST异步请求

    http://www.bejson.com/knownjson/webInterface/这网站里面还有一些其它免费接口,感兴趣的可以去看看

    常用注解的使用介绍

    上面GitHubService里面的注解大家应该都能猜它的作用了吧,下面就给大家介绍下

    @GET和@POST分别是get和post请求。括号里面的value值与上面.baseUrl组成完整的路径

    @Path动态的URL访问。像上面get请求中的{user}可以把它当做一个占位符,通过@Path("user")标注的参数进行替换

    @Query请求参数。无论是GET或POST的参数都可以用它来实现

    @QueryMap请求参数使用Map集合。可以传递一个map集合对象

    @Body实体请求参数。顾名思义可以传递一个实体对象来作为请求的参数,不过实体属性要与参数名一一致

    @FormUrlEncoded和@Field简单的表单键值对。两个需要结合使用,使用如下:

    @FormUrlEncoded@POST("user/edit")Call updateUser(@Field("first_name") String first, @Field("last_name") String last);

    @Multipart和@PartPOST表单的方式上传文件可以携带参数。两个需要结合使用,使用方式查看下面文件上传中介绍。

    @PartMap和@PartPOST表单上传多个文件携带参数。两个结合使用,使用方式查看下面文件上传中介绍。

    这里只介绍了一些常用的,大家如果想了解更多可以查看相关文档

    文件上传

    1、单文件上传携带参数(使用注解@Multipart和@Part),需要在手机SD卡目录下的Pictures文件夹下添加xuezhiqian.png图片

    @Multipart@POST("UploadServlet")Call uploadfile(@Part MultipartBody.Part photo, @Part("username") RequestBody username, @Part("password") RequestBody password);

    2、多文件上传携带参数(使用注解@PartMap和@Part),需要再在手机SD卡目录下的Pictures文件夹下添加xuezhiqian2.png图片

    @Multipart@POST("UploadServlet")Call uploadfile(@PartMap Map params,  @Part("password") RequestBody password);

    文件下载

    可以采用OKHTTP下载文件的方式,利用ResponseBody对象,调用response.body().byteStream()方法获取InputStream输入流,通过写文件操作来实现。

    同步请求和结合RxJava的使用

    1、同步请求

    Call.execute()同步请求网络,要注意的是Android4.0以后不能在主线程里调用,要开一个异步线程来使用,

    Call.enqueue()异步请求网络,加入一个回调,同步异步需要可按照不同的场景来使用。

    Call.cancel()取消此次请求,有一些场景还是会用到该方法的。

    2、结合RxJava使用

    @POST("query")Observable searchRx(@Query("type") String type, @Query("postid") String postid);


    配置OKHttp

    链接:https://www.jianshu.com/p/a94e38636fde

    相关文章

      网友评论

          本文标题:网络框架Retrofit2.0

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