Retrofit2.0 的初步使用

Retrofit2.0 的初步使用

首先我就不介绍了,直接说下怎么使用,本身我也是刚刚因为要仿照微软的azure-sdk-for-java(git地址是:https://github.com/Azure/azure-sdk-for-java.git)
然后去编写一个类似的程序里面就设计到了Retrofit。
我也是刚刚才使用所以说叫我讲啥原理我肯定不怎么会讲,所以这里就是告诉大家怎么使用,里面可能有些代码不怎么好,希望大家一起指出来,我会慢慢改正,请大家见谅。



首先我是把Retrofit跟OkHttpClient
一起封装在RestCline中,当然也可以单独使用Retrofit,用法都是一样的,这里面因为加入了Gosn转化器,所以需要添加Gson依赖包,
我这个版本是可以用的之前好像用的是Gson2.4的版本,然后在使用的时候一直报没找到Gson包中的JsonWrite这个类的错误,好像是这个 。

Maven

 1  <!-- https://mvnrepository.com/artifact/com.squareup.retrofit2/converter-gson -->
 2       <dependency>
 3         <groupId>com.squareup.retrofit2</groupId>
 4         <artifactId>converter-gson</artifactId>
 5         <version>2.0.1</version>
 6       </dependency>
 7       <!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
 8       <dependency>
 9         <groupId>com.google.code.gson</groupId>
10         <artifactId>gson</artifactId>
11         <version>2.6.1</version>
12       </dependency>

 1  public RestClient build() {
 2                 OkHttpClient httpClient = httpClientBuilder
 3                         .build();
 4                 return new RestClient(httpClient,
 5                         retrofitBuilder
 6                                 .baseUrl(baseUrl)//设置URL
 7                                 .addConverterFactory(GsonConverterFactory.create())//添加Gosn转换器
 8                                 .client(httpClient)
 9                                 .build()
10                 );
11             }

接下来的就是创建一个接口,我这里写了增删改查,跟提交方式为GET,POST,PUT,DELETE的四种方法。

1 @Headers("Content-Type: application/json; charset=utf-8")
2 @GET("{apiVersion}/saibongs/items/")
3 Call<Result> search(@Path("apiVersion") String apiVersion,@Query("number")Integer number);
 

@GET这里面有@Query,跟@QueryMap它会把参数以?number=3&….这种方式连接在url上面
@Path的作用就是:
{apiVersion}/uses/items/ 比如apiVersion=v1,那么它的访问路径就是v1/uses/items

 1  interface Service {
 2         /**
 3          * 新增一条仓库定义记录**/
 4         @Headers("Content-Type: application/json; charset=utf-8")
 5         @POST("{apiVersion}/stores/items/")
 6         Call<ResponseBody> addStore(@Path("apiVersion") String apiVersion,@Body StoreInfo storeInfo);
 7         /**
 8          * 根据map中的参数查询满足条件的仓库定义记录列表**/
 9         @Headers("Content-Type: application/json; charset=utf-8")
10         @POST("{apiVersion}/stores/list/")
11         Call<ResponseBody> getStoreList(@Path("apiVersion") String apiVersion,@Body StoreInfo storeInfo);
12         /**
13          * 修改仓库定义记录*/
14         @Headers("Content-Type: application/json; charset=utf-8")
15         @PUT("{apiVersion}/stores/items/{code}")
16         Call<ResponseBody> editStore(@Path("apiVersion") String apiVersion,@Path("code") String code,@Body StoreInfo storeInfo);
17         /**
18          * 删除仓库定义记录*/
19         @Headers("Content-Type: application/json; charset=utf-8")
20         @DELETE("{apiVersion}/stores/items/{code}")
21         Call<ResponseBody> deleteStore(@Path("apiVersion") String apiVersion,@Path("code") String code);
22      }

@POST里面的 @Body 是绑定一个对象
至于网上说的根据表单提交方式的不同
表单提交类型为@FormUrlEncoded跟它对应的就是@Field和@FieldMap,(表单默认提交为FormUrlEncoded)
表单提交类型为@Multipart的跟它对应的是@Part跟@PartMap
比如我这里面的那个根据map查询的那个方法,我直接就是把参数封装成对象然后用@Body可以正常访问,而用上面的那两种我都试了下都不行,至于是什么原因我也不是很清楚。
在使用之前你要create一下

 retrofit.create(StoreInfoService.class);

    }
 

然后再进行调用上面的方法

 1  /**
 2      * 查询服务目录记录**/
 3     public List<StoreInfo> getStoreList(Catalogue catalogue, Retrofit retrofit) throws IOException, IllegalArgumentException {
 4         Call<ResponseBody> call = service.getStoreList(this.client.apiVersion(), catalogue);
 5         List<StoreInfo> list=new ArrayList<StoreInfo>();
 6         Response<ResponseBody> bodyResponse = call.execute();
 7         if(bodyResponse.errorBody()!=null){
 8             Converter<ResponseBody, ErrorMsg> errorConverter =
 9                     retrofit.responseBodyConverter(ErrorMsg.class, new Annotation[0]);
10             // 错误类型
11             ErrorMsg error = errorConverter.convert(bodyResponse.errorBody());
12             if(error!=null){
13                 error.setStatus(bodyResponse.code()+"");
14                 throw new DataCenterException(error);
15             }
16         }else{
17             Gson gson=new Gson();
18             DatacenterResult datacenterResult= gson.fromJson(bodyResponse.body().string(), new TypeToken<DatacenterResult>() {
19             }.getType()) ;
20             PageUtil pa= datacenterResult.getPageUtil();
21             list=pa.getList();
22         }
23         return list;
24     }

bodyResponse.body().string()这里面存放的就是你的结果数据,我是用Gson把它转化成了一个对象
当然还可以直接定义那个类型的对象它可以自己转化

 //查询服务
        @Headers("Content-Type: application/json; charset=utf-8")
        @POST("{apiVersion}/saibongs/")
        Call<SaibongResult> searchSaibong(@Path("apiVersion") String apiVersion,@Body SaibongSearch sa) ;

 public List<SaibongRules> searchSaibong(SaibongSearch saibong, Retrofit retrofit) throws IOException, IllegalArgumentException {
        Call<SaibongResult> call = service.searchSaibong("v1", saibong);
        List<SaibongRules> list=new ArrayList<SaibongRules>();
        Response<SaibongResult> bodyResponse = call.execute();
        //这里面系统手动抛出的异常,自己定义的异常类型
        if(bodyResponse.errorBody()!=null){
            Converter<ResponseBody, ErrorMsg> errorConverter =              retrofit.responseBodyConverter(ErrorMsg.class, new Annotation[0]);
            // 错误类型ErrorMsg 是我自己定义的
            ErrorMsg error = errorConverter.convert(bodyResponse.errorBody());
            if(error!=null){
                error.setStatus(bodyResponse.code()+"");
                throw new SaibongException(error);
            }
        }else{
            SaibongResult saibongResult=  bodyResponse.body();
             PageUtil pa= saibongResult.getPageUtil();
            list=pa.getList();
        }
        return list;
    }

测试

这里测试需要创建一个本地的服务,所以需要添加mockwebserver的jar包
Maven

1 <dependency>
2         <groupId>com.squareup.okhttp3</groupId>
3         <artifactId>mockwebserver</artifactId>
4         <version>3.3.1</version>
5 </dependency>

创建一个本地的服务

 1   MockWebServer  server = new MockWebServer(); //创建本地服务
 2          server.start();//开启服务
 3          //创建连接对象
 4           retrofit = new Retrofit.Builder()
 5                  .baseUrl(server.url("/"))
 6                  .addConverterFactory(GsonConverterFactory.create())
 7                  .build();
 8          server.enqueue(new MockResponse()
 9                  .setResponseCode(404)//这里设置你的http状态码
10                  .setBody("这里设置的是你的结果"));
11          Service service = retrofit.create(Service.class);
12          //调用方法
13          server.add();
14          //这里可以用junit中的来比对结果
15          assertEquals(server.add(),"添加成功");

第一次把这几天弄出来的东西跟大家一起分享,希望能一起讨论--

时间: 2024-10-06 11:46:48

Retrofit2.0 的初步使用的相关文章

Retrofit2.0 公共参数(固定参数)

请先阅读: Retrofit 动态参数(非固定参数.非必须参数)(Get.Post请求) 在实际项目中,对于有需要统一进行公共参数添加的网络请求,可以使用下面的代码来实现: RestAdapter restAdapter = new RestAdapter.Builder() .setEndpoint(ctx).setRequestInterceptor(new RequestInterceptor() { @Override public void intercept(RequestFacad

Retrofit2.0使用

随着Google对HttpClient 摒弃,和Volley的逐渐没落,OkHttp开始异军突起,而Retrofit则对okHttp进行了强制依赖. Retrofit是由Square公司出品的针对于Android和Java的类型安全的Http客户端, 如果看源码会发现其实质上就是对okHttp的封装,使用面向接口的方式进行网络请求,利用动态生成的代理类封装了网络接口请求的底层, 其将请求返回javaBean,对网络认证 REST API进行了很好对支持此,使用Retrofit将会极大的提高我们应

Android 基于ijkplayer+Rxjava+Rxandroid+Retrofit2.0+MVP+Material Design的android万能播放器aaa

MDPlayer万能播放器 MDPlayer,基于ijkplayer+Rxjava+Rxandroid+Retrofit2.0+MVP+Material Design的android万能播放器,可以播放本地和在线视频,可以浏览宅男杀手妹纸图片,UI设计遵循 Material Design. GitHub地址:https://github.com/Dawish/MDPlayer UI浏览:         1.UI设计: 列表使用RecyclerView,item为CardView并设置rippl

Retrofit2.0+ RxJava 优雅的取消重复避免并取消请求(十一)

Tamic/文 地址:http://blog.csdn.net/sk719887916/article/details/54575137 前几篇主要介绍了retrofit基本使用,结合rxJava的案列,以及RxJava结合retrofit的封装,包括公用参数,局部参数请求头添加,缓存,https, 文件上下传,结果解析,异常处理等,还有一些技巧,那么还有一个比较关键的是取消问题. 两者结合技巧可点击阅读:http://blog.csdn.net/sk719887916/article/deta

Retrofit2.0通俗易懂的学习姿势,Retrofit2.0 + OkHttp3 + Gson + RxJava

Retrofit2.0通俗易懂的学习姿势,Retrofit2.0 + OkHttp3 + Gson + RxJava Retrofit,因为其简单与出色的性能,也是受到很多人的青睐,但是他和以往的通信框架还是有点区别,不过放心,因为他本身还是挺简单的,所有我相信你看完这篇文章,对基本的请求是没什么问题的,其实现在网上这样的文章也有很多了,好了,那我们直接开车吧! 一.相关资料 Github:https://github.com/square/retrofit 官网文档:http://square

Retrofit2.0使用详解

Retrofit2.0使用 随笔 生活是一面镜子,不去擦拭,岁月的灰尘将掩埋它. 转载请标明出处:http://blog.csdn.net/qq_15807167/article/details/51712048 主页 Retrofit20使用 初次了解Retrofit 具体的使用文档 请求体Request Body FORM ENCODED AND MULTIPART 表单和Multipart 异步 VS 同步 Retrofit20的新知识点 Retrofit20的使用方式 使用 注意 如果有

基于Retrofit2.0+RxJava+Dragger2实现不一样的Android网络构架搭建(转载)

转载请注明出处:http://blog.csdn.net/finddreams/article/details/50849385#0-qzone-1-61707-d020d2d2a4e8d1a374a433f596ad1440   一起分享,一起进步.finddreams:http://blog.csdn.net/finddreams/article/details/50849385 众所周知,手机APP的核心就在于调用后台接口,展示相关信息,方便我们在手机上就能和外界交互.所以APP中网络框架

Android 网络框架 Retrofit2.0介绍、使用和封装

前言 时至今日,Android的网络框架不再像之前那么到处都是,随着Google把 HttpClient直接删掉,似乎意味着Android越来越成熟.网络框架中的佼佼者Volley也不再那么光鲜,取而代之的是 Retrofit 和 okHttp. 感觉很像 OnePiece 中白胡子的离去象征着时代的变革,新时代的开始,多弗的垮台象征着七武海制度的取缔一样,不会使用Retrofit + okHttp + RxJava等一系列技术,就迈不进新时代的门槛,也不足以称为一个合格的开发者. 哈哈闲话不多

Android Retrofit2.0 查看log和JSON字符串(HttpLoggingInterceptor)

Retrofit2.0 怎么打印请求到的json字符串和查看log呢? 关键类:HttpLoggingInterceptor 关键代码: HttpLoggingInterceptor logging = new HttpLoggingInterceptor(); logging.setLevel(HttpLoggingInterceptor.Level.BODY); httpClient = new OkHttpClient.Builder().addInterceptor(logging).b