设为首页 收藏本站
查看: 2033|回复: 0

[经验分享] Retrofit2.0 的初步使用

[复制链接]

尚未签到

发表于 2017-7-1 19:04:17 | 显示全部楼层 |阅读模式
  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


DSC0000.gif DSC0001.gif


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>
View Code


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      }
View Code  @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     }
View Code  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;
}
View Code


测试
  这里测试需要创建一个本地的服务,所以需要添加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(),"添加成功");


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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-390157-1-1.html 上篇帖子: [UWP]爱恋动漫BT开发小记 下篇帖子: [译]:Orchard入门
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表