栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Retrofit基本使用

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Retrofit基本使用

一、小牛初试

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      //使用表单方式提交填写@FormUrlEncoded
    Call post(@Field("username") String username, @Field("password")String pwd);                    
//post方式请求,字段用Field  "username"会由username参数替换补充到url
    
    @GET("get")
    Call get(@Query("username") String username, @Query("password") String pwd);                    
//get方式请求,字段用Query

 @HTTP(method="GET",path="get",hasBody = false) 
//path表示选择上边的其中一个,hasbody请求体默认为false,因为get不需要请求体。
    Call 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 call= httpBinService.post("lance","123");
//Call call= httpBinService.get("lance","123");
//Call call= httpBinService.http("lance","123");
        

4.调用

call.enqueue(new Callback() {
            @Override
            public void onResponse(Call call, Response response) {
                try {
                    Log.d("msg",response.body().string()+"");
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            @Override
            public void onFailure(Call 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 get(@QueryMap Map map);

    2.初始化
         private HashMap param=new HashMap<>();

         param.put("username","lance");
         param.put("password","123");

         Call call=httpBinService.get(param);

    3.请求
        按照以前正常请求就可以

@Body 
    1.布置接口
          @POST("post")
          //@FormUrlEncoded   有@Body注解在这里不需要添加,
          Call postBody(@Body RequestBody responseBody);
    2.初始化
          FormBody formBody=new FormBody.Builder()
                .add("username","lucan")
                .add("password","123")
                .build();
    3.调用
           new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Response           response=httpBinService.postBody(formBody).execute();
                    Log.d("msg",response.body().string());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();
@Path
    1.布置接口
    @POST("{id}") //用参数id替换到"{id}"
    Call path(@Path("id") String id);
    2.调用:
     new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    //实际请求到的是"https://www.httpbin.org/post"
                    Response response=httpBinService.path("post").execute();
                    Log.d("msg",response.body().string());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();  
@Header  表示请求头
    1.布置接口:
      @POST("{id}")
    Call path(@Path("id") String id, @Header("os") String os);
    2.调用
     new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    //实际请求到的是"https://www.httpbin.org/post"
                    Response response=httpBinService.path("post","Android").execute();
                    Log.d("msg",response.body().string());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();

@Headers
    1.布置接口
          @Headers({"os:Android","version:1"})
    @POST("post")
    Call postwithheaders();
    2.调用
     new Thread(new Runnable() {
            @Override
            public void run() {
                Call call=httpBinService.postwithheaders();
                try {
                    Log.d("msg",call.execute().body().string());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    
        

调用结果

@Url   
    1.布置接口:
        @POST
    Call posturl(@Url String url);
    2.调用:
           new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Response 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")
    @FormUrlEncoded
    Call 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);
    @Test
    public void login() throws IOException {
       Call call=wanandroidService.login("lanceedu","123123");
       Response 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 替换成了  Call 
    Call 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

 @Test
    public 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 call=wanandroidService2.login("lanceedu","123123");
        Response 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")
    @FormUrlEncoded
    Flowable login2(@Field("username") String username, @Field("password")String password);

    @GET("lg/collect/list/{pageNum}/json")
    Flowable getArticle(@Path("pageNum") int pageNum);

3.调用

 Map> cookies =new HashMap<>();
    @Test
    public void rxjavaTest() {
        Map> cookies =new HashMap<>();
        Retrofit retrofit3= new Retrofit.Builder()
                .baseUrl("https://www.wanandroid.com/")
                //先配置cookie
                .callFactory(new OkHttpClient.Builder().cookieJar(new cookieJar() {
                    @Override
                    public void saveFromResponse(HttpUrl url, List list) {
                        cookies.put(url.host(),list);
                    }

                    @Override
                    public List loadForRequest(HttpUrl url) {
                        List 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>() {   //在请求完登录后查看收藏的文章
                    @Override
                    public Publisher apply(baseResponse baseResponse) throws Throwable {
                        return wanandroidService2.getArticle(0);
                    }
                })
                .observeOn(Schedulers.io())
                .subscribeOn(Schedulers.newThread()) //安卓中请使用AndroidScheulers.newThread()
                .subscribe(new Consumer() {
                    @Override
                    public void accept(ResponseBody baseResponse) throws Throwable {
                        System.out.println(baseResponse.string());
                    }
                });
        while(true){}
    }

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/769797.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号