一、小牛初试

1.在Build.Gradle中导入Retorfit的第三方依赖

implementation 'com.squareup.retrofit2:retrofit:2.9.0'//更高版本请在Github上查看

2.创建接口


import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.GET;
import retrofit2.http.POST;
import retrofit2.http.Query;public interface HttpBinService {@POST("post")        //POST方法使用POST@FormUrlEncoded      //使用表单方式提交填写@FormUrlEncodedCall<ResponseBody> post(@Field("username") String username, @Field("password")String pwd);
//post方式请求,字段用Field  "username"会由username参数替换补充到url@GET("get")Call<ResponseBody> get(@Query("username") String username, @Query("password") String pwd);
//get方式请求,字段用Query@HTTP(method="GET",path="get",hasBody = false)
//path表示选择上边的其中一个,hasbody请求体默认为false,因为get不需要请求体。Call<ResponseBody> http(@Query("username") String username, @Query("password") String pwd);}

3.基本的初始化

//创建变量
private  Retrofit retrofit;
private HttpBinService httpBinService;//初始化
retrofit = new Retrofit.Builder().baseUrl("https://www.httpbin.org/").build();
httpBinService=retrofit.create(HttpBinService.class);
Call<ResponseBody> call= httpBinService.post("lance","123");
//Call<ResponseBody> call= httpBinService.get("lance","123");
//Call<ResponseBody> call= httpBinService.http("lance","123");

4.调用

call.enqueue(new Callback<ResponseBody>() {@Overridepublic void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {try {Log.d("msg",response.body().string()+"");} catch (IOException e) {e.printStackTrace();}}@Overridepublic void onFailure(Call<ResponseBody> call, Throwable t) {}});

二、注解的说明

方法注解:@GET  @POST  @PUT @DELETE  @PATH  @HEAD  @OPTIONS  @HTTP标记注解:@FormUrlEncoded  @Multipart @Streaming 参数注解:@Query  @QueryMap  @Body @Field  @FieldMap  @Part  @PartMap其他注解:@Path  @Header  @Headers  @Url
@HTTP在“一、小牛初试”中已经有案例。method选择get或者post,path表示选择之前已经写好的哪个接口来实现,hasbody表示是否有请求体(默认是false),我们get是没有请求体的。@Multipart 和@Steaming 用于文件下载@QueryMap @FieldMap用于多个参数请求1.现在接口中布置:@GET("get")Call<ResponseBody> get(@QueryMap Map<String,String> map);2.初始化private HashMap<String,String> param=new HashMap<>();param.put("username","lance");param.put("password","123");Call<ResponseBody> call=httpBinService.get(param);3.请求按照以前正常请求就可以@Body 1.布置接口@POST("post")//@FormUrlEncoded   有@Body注解在这里不需要添加,Call<ResponseBody> postBody(@Body RequestBody responseBody);2.初始化FormBody formBody=new FormBody.Builder().add("username","lucan").add("password","123").build();3.调用new Thread(new Runnable() {@Overridepublic void run() {try {Response<ResponseBody>           response=httpBinService.postBody(formBody).execute();Log.d("msg",response.body().string());} catch (IOException e) {e.printStackTrace();}}}).start();
@Path1.布置接口@POST("{id}") //用参数id替换到"{id}"Call<ResponseBody> path(@Path("id") String id);2.调用:new Thread(new Runnable() {@Overridepublic void run() {try {//实际请求到的是"https://www.httpbin.org/post"Response<ResponseBody> response=httpBinService.path("post").execute();Log.d("msg",response.body().string());} catch (IOException e) {e.printStackTrace();}}}).start();
@Header  表示请求头1.布置接口:@POST("{id}")Call<ResponseBody> path(@Path("id") String id, @Header("os") String os);2.调用new Thread(new Runnable() {@Overridepublic void run() {try {//实际请求到的是"https://www.httpbin.org/post"Response<ResponseBody> response=httpBinService.path("post","Android").execute();Log.d("msg",response.body().string());} catch (IOException e) {e.printStackTrace();}}}).start();@Headers1.布置接口@Headers({"os:Android","version:1"})@POST("post")Call<ResponseBody> postwithheaders();2.调用new Thread(new Runnable() {@Overridepublic void run() {Call<ResponseBody> call=httpBinService.postwithheaders();try {Log.d("msg",call.execute().body().string());} catch (IOException e) {e.printStackTrace();}}}).start();

调用结果

@Url   1.布置接口:@POSTCall<ResponseBody> posturl(@Url String url);2.调用:new Thread(new Runnable() {@Overridepublic void run() {try {Response<ResponseBody> response=httpBinService.posturl("https://www.httpbin.org/post").execute();Log.d("msg",response.body().string());} catch (IOException e) {e.printStackTrace();}}}).start();

三、Retrofit转换器

转换器是什么,是为了接收gson数据后快速进行转换。

1.导入Gson

    implementation 'com.google.code.gson:gson:2.9.0'

2.去wanandroid找开放API,试着拉取数据

https://www.wanandroid.com/user/login方法:POST
参数:username,password

3..定义接口

import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.POST;public interface WanandroidService {@POST("user/login")@FormUrlEncodedCall<ResponseBody> login(@Field("username") String username, @Field("password")String password);
}

4.调用

public class WanAndroidUnitTest {Retrofit retrofit= new Retrofit.Builder().baseUrl("https://www.wanandroid.com/").build();WanandroidService wanandroidService=retrofit.create(WanandroidService.class);@Testpublic void login() throws IOException {Call<ResponseBody> call=wanandroidService.login("lanceedu","123123");Response<ResponseBody> response=call.execute();String result=response.body().string();System.out.println(result);}
}

5.result回调

{"data":{"admin":false,"chapterTops":[],"coinCount":4500,"collectIds":[17188,18965,20087,19623],"email":"","icon":"","id":86459,"nickname":"lanceedu","password":"","publicName":"lanceedu","token":"","type":0,"username":"lanceedu"},"errorCode":0,"errorMsg":""}

6.我们创建javabean

如果一个一个的创建很麻烦,

这时我们把json复制下来,百度搜索“bejson”,打开在线JSON校验格式化工具(Be JSON)网址。在json工具里有个转换为java类

然后就可以看到接过了,可以改文件名和包名,下载下来导入项目,或者自己创建文件复制粘贴过去。

7.因为上边只是查看数据,所以我们现在要将他自行赋值给BaseReponse这个Bean,

我们要创建一个新的接口WanandroidService2

import com.example.***.beans.BaseResponse;
import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.POST;public interface WanandroidService2 {@POST("user/login")@FormUrlEncoded   //注意这里的Call<ResponseBody> 替换成了  Call<BaseResponse> Call<BaseResponse> login(@Field("username") String username, @Field("password")String password);
}

8.为了能把以前的ResponseBody替换成BaseResponse的JavaBean,我们需要导入Gson的转换器,。

 implementation 'com.squareup.retrofit2:converter-gson:2.9.0'

9.之后运行Test

 @Testpublic void loginConvert() throws IOException {Retrofit retrofit2= new Retrofit.Builder().baseUrl("https://www.wanandroid.com/").addConverterFactory(GsonConverterFactory.create()).build();WanandroidService2 wanandroidService2=retrofit2.create(WanandroidService2.class);Call<BaseResponse> call=wanandroidService2.login("lanceedu","123123");Response<BaseResponse> response=call.execute();BaseResponse baseResponse=response.body();System.out.println(baseResponse);}

10.查看结果

BaseResponse{data=Data{admin=false, chapterTops=[], coinCount=4536, collectIds=[17188, 18965, 20087, 19623], email='', icon='', id=86459, nickname='lanceedu', password='', publicName='lanceedu', token='', type=0, username='lanceedu'}, errorCode=0, errorMsg=''}

如上所示,我们收到了一个BaseResponse的JavaBean对象。

四、Retrofit的适配器

1.导入

  implementation 'com.squareup.retrofit2:adapter-rxjava3:2.9.0'implementation 'io.reactivex.rxjava3:rxandroid:3.0.0'

2.创建接口

先登录,再查找收藏的文章

  @POST("user/login")@FormUrlEncodedFlowable<BaseResponse> login2(@Field("username") String username, @Field("password")String password);@GET("lg/collect/list/{pageNum}/json")Flowable<ResponseBody> getArticle(@Path("pageNum") int pageNum);

3.调用

 Map<String,List<Cookie>> cookies =new HashMap<>();@Testpublic void rxjavaTest() {Map<String,List<Cookie>> cookies =new HashMap<>();Retrofit retrofit3= new Retrofit.Builder().baseUrl("https://www.wanandroid.com/")//先配置cookie.callFactory(new OkHttpClient.Builder().cookieJar(new CookieJar() {@Overridepublic void saveFromResponse(HttpUrl url, List<Cookie> list) {cookies.put(url.host(),list);}@Overridepublic List<Cookie> loadForRequest(HttpUrl url) {List<Cookie> cookie=cookies.get(url.host());return cookie==null?new ArrayList<>() : cookie;}}).build()).addConverterFactory(GsonConverterFactory.create()).addCallAdapterFactory(RxJava3CallAdapterFactory.create()).build();WanandroidService2 wanandroidService2=retrofit3.create(WanandroidService2.class);wanandroidService2.login2("lanceedu","123123")//在登陆后调用.flatMap(new Function<BaseResponse, Publisher<ResponseBody>>() {   //在请求完登录后查看收藏的文章@Overridepublic Publisher<ResponseBody> apply(BaseResponse baseResponse) throws Throwable {return wanandroidService2.getArticle(0);}}).observeOn(Schedulers.io()).subscribeOn(Schedulers.newThread()) //安卓中请使用AndroidScheulers.newThread().subscribe(new Consumer<ResponseBody>() {@Overridepublic void accept(ResponseBody baseResponse) throws Throwable {System.out.println(baseResponse.string());}});while(true){}}

Retrofit基本使用相关推荐

  1. 为什么要使用Retrofit封装OkHttp,而不单独使用OkHttp?

    OkHttp的优点: 开源的轻量级框架.高效.快速的请求客户端,可以单独使用它来实现网络请求. 支持SPDY: 支持连接池,可极大减少延时: 支持Gzip压缩响应体,降低传输内容的大小: 支持Http ...

  2. Retrofit 网络请求参数注解@Path @Field @Query 等使用

    请求参数呢大致如下,到个别人的图, 下面就说下这些内容使用 其中 @Path.@Query.@QueryMap 使用 Get 请求 , 加入使用了Post 请求注解使用@Path  一般都会是项目崩溃 ...

  3. retrofit 源码分析

    callAdater可以设置RxJava2CallAdapter,目前只可用这个adapter,支持rxjava2的操作:convertAdater可以使用多种进行操作. 调用例子: Retrofit ...

  4. Retrofit源码研究

    2016-05-06 15:35:27 最近抽空研究了一下Retrofit源码,包括API使用.源码结构.使用到的设计模式.SDK的架构设计.作者设计/实现思路等,会形成一系列文章. 以前Retrof ...

  5. java dagger2_从零开始搭建一个项目(rxJava+Retrofit+Dagger2) ---上

    工程结构 Androd studio 替代eclipse给我带来最大的感觉,就是不用每次需要用到什么类库,就得去网上下载一个jar包.只要在项目app/build.gradle中加入代码,就能远程使用 ...

  6. android 添加头参数,Retrofit添加header参数的几种方法

    (1)使用注解的方式 添加一个Header参数 publicinterfaceUserService { @Headers("Cache-Control: max-age=640000&qu ...

  7. Spring Boot 中的 RestTemplate不好用?试试 Retrofit !

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者 | 六点半起床 来源 | juejin.im/post/68 ...

  8. 一行代码实现Okhttp,Retrofit,Glide下载上传进度监听

    2019独角兽企业重金招聘Python工程师标准>>> 发表上篇文章 我一行代码都不写实现Toolbar!你却还在封装BaseActivity? 已是一个月前的事情~ 上篇文章的研究 ...

  9. java 获取动态的service_【Android】动态代理在 Retrofit 中的使用

    首先,什么是动态代理和为什么会有动态代理. 众所周知,Java 是一门静态语言,编写完的类,无法在运行时做动态修改. 一个简单的动态代理如下: 1.先定义一个接口,想要使用动态代理,必须先定义一个接口 ...

  10. Retrofit全攻略——进阶篇

    最近事比较多,距离上次写文章已经过去了一个月了.上一篇文章Retrofit全攻略--基础篇 介绍了Retrofit的基础用法,这篇文章介绍点进阶的用法. 打印网络日志 在开发阶段,为了方便调试,我们需 ...

最新文章

  1. Android学习笔记---Material Design设计理念
  2. Javascript操纵Cookie--转
  3. WebSocket 1.0的学习和简单使用
  4. boost::log模块实现logging旋转文本文件的示例
  5. 【人脸对齐-Landmarks】300W 数据集
  6. [译].Net中的内存-什么分配在了哪里
  7. P5718 【深基4.例2】找最小值
  8. Leetcode Math刷题笔记
  9. IT众包Web网站服务案例:江苏保税店
  10. windows10安装Visual Studio 2017
  11. PR菜鸟入门 -- PR下载安装
  12. 基于微信小程序计算机基础答疑系统设计与实现
  13. python猜数字游戏编程、直到猜对为止显示猜了几次_python编写猜数字小游戏
  14. multi task训练torch_torch中创建multitask网络结构
  15. from StyleFrame import StyleFrame, Styler ModuleNotFoundError: No module named ‘StyleFrame‘
  16. 《奇特的一生:柳比歇夫坚持56年的时间统计法》的读书笔记(作者: 【俄】格拉宁)
  17. java获取日期/时间
  18. 有扰动的闭环传递函数 matlab,已知闭环传递函数
  19. ACM日历题新版(界面修改+国际节日)
  20. 一个整数称为完全平方数,是指它的值是另一个整数的平方。如81是个完全平方数,因为它是9的平方。请按要求完成:①在三位的正整数中寻找所有完全平方数;例如:144(12*12),676(26*26)

热门文章

  1. 邮箱客户端 gmail支持_如何在新的Gmail中启用离线支持
  2. 一副眼镜一千多贵吗_眼镜片的价格差距为什么那么大
  3. pip 使用国内阿里云软件源
  4. JWT 避坑指南:nbf 验签失效问题的解决
  5. OpenCV_连通区域分析(Connected Component Analysis-Labeling)
  6. 安装mysql详细教程(windows 10安装mysql详细教程新手必看)
  7. 迪赛智慧数——其他图表(盒须图):员工离职率分析
  8. 请教苹果虚拟机自动配置序列号ID脚本
  9. 打造一款最强王者云笔记typora+坚果云+阿里云oss?
  10. spring事务出现的超卖问题