Retrofit2 的简单使用

友情链接Rx:
Rxjava2操作符(一)
Rxjava2操作符(二)
Rxjava2操作符(三)
Retrofit2介绍
demo地址:github

1. 简介

Retrofit 是一个用于 Android 和 Java 平台的类型安全的网络请求框架。Retrofit 通过将 API 抽象成 Java 接口而让我们连接到 REST web 服务变得很轻松。其实 Retrofit 已经使用很久了,但是都没有总结过,所以写下这篇文章

2. 添加gradle

compile 'com.squareup.retrofit2:retrofit:2.3.0'
//这个玩意就是用来把json变成java中的实体类
compile 'com.squareup.retrofit2:converter-gson:2.3.0' 
//retrofit底层通过okhttp操作的
compile 'com.squareup.okhttp3:okhttp:3.9.1' 
//日志拦截器
compile 'com.squareup.okhttp3:logging-interceptor:3.9.1'  
compile 'com.google.code.gson:gson:2.8.2'
复制代码

3. 初始化Retrofit

  private static final String BASE_URL = "http://m2.qiushibaike.com/";
  OkHttpClient okHttpClient = new OkHttpClient.Builder()
                            // 设置超时时间
                            .connectTimeout(10000L, TimeUnit.MILLISECONDS)
                            // 设置读写时间
                            .readTimeout(10000L, TimeUnit.MILLISECONDS)
                            .build();
Retrofit retrofit=new Retrofit.Builder()
                        .baseUrl(BASE_URL)
                        .client(okHttpClient)
                         // 添加生成bean的工厂
                        .addConverterFactory(GsonConverterFactory.create())
                        .build();
复制代码

4. 各种注解

4.1 http请求的方式

在我们使用中以下四个基本上已经可以包括全部的了, 尤其 get/post 两个用的比较多

  1. GET -用于资源查询
  2. POST -用于创建资源
  3. PUT -用户更新资源
  4. DELETE -用于资源删除

4.2 关于请求的注解

格式请求方式
@GETget请求
@POSTpost请求
@PUTput请求
@DELETEdelete请求

4.3 GET请求 使用@GET注解

  1. 定义一个接口,里面的方法是
// 这个是得到 json字符串
 @GET("/article/list/text?page=1")
    Call<ResponseBody> getNetData();
    
// 这个是得到 实体类
@GET("/article/list/text?page=1")
    Call<TextBean> getBeanData(); 
复制代码
  1. 开始发送请求
    下面得到的是json字符串
//通过请求得到 Call
 Call<ResponseBody> netData = mApiService.getNetData();
 //执行请求网络操作
        netData.enqueue(new Callback<ResponseBody>() {
            @Override
            public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                if (response.isSuccessful()) {
                    try {
                    //response.body().string() 就是我们得到的数据
                     Toast.makeText(MainActivity.this, response.body().string(), Toast.LENGTH_SHORT).show();
                        Log.i(TAG,response.body().string());
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }

            @Override
            public void onFailure(Call<ResponseBody> call, Throwable t) {
                Log.e(TAG,t.toString());
            }
        });
复制代码

下面得到的是 TextBean 实体类

  Call<TextBean>  beanData = mApiService.getBeanData();;
                beanData.enqueue(new Callback<MovicBean>() {

                    @Override
                    public void onResponse(Call<MovicBean> call, Response<MovicBean> response) {
                        if (response.isSuccessful()) {
                            TextBean textBean = response.body();
                            Toast.makeText(MainActivity.this, movicBean.toString(), Toast.LENGTH_SHORT).show();
                        }
                    }

                    @Override
                    public void onFailure(Call<MovicBean> call, Throwable t) {

                    }
                });
复制代码
4.3.1 . 上面是简单的请求,假如我们需要动态设置页数,和每页的个数,还有类型那我们就该用到下面的方法了
  • @Query 动态设置参数
  • @Path 动态设置路径
  • @QueryMap 动态设置参数map集合
@Query

假如我们要查丑事百科的纯文, 当前查询的是第一页url是

http://m2.qiushibaike.com/article/list/text?page=1
复制代码

当我们再查第二页的时候的url是

http://m2.qiushibaike.com/article/list/text?page=2
复制代码

对比发现只有page的参数发生了改变,这里用@Query注解完美解决 步骤:

  • 定义接口
 @GET("/article/list/text")
   Call<TextBean> getDataByQuery(@Query("page") String page);
复制代码
  • 调用接口
//可以动态设置page的页数

  Call<TextBean> beanData  = mApiService.getDataByQuery("1");
  // 开始执行
  beanData.enqueue(...);
复制代码

假如我们有两个变化的参数,或者多个的时候怎么办呢?,可以写多参数,下面就是 page 和 每页的个数的组合

 @GET("/article/list/text")
 Call<TextBean> getDataByMoreQuery(@Query("page") String page,@Query("size")String size);
复制代码
@QueryMap

假如我们参数过多的话,挨个写@Query有点麻烦,所以用到了 @QueryMap

 @GET("/article/list/text")
    Call<TextBean> getDataByMap(@QueryMap Map<String, String> map);
复制代码
下载文件

InputStream is = response.body().byteStream();得到下载的字节流

// baseUrl 用的我的github上的一个apk,https://github.com/niezhiyang/StudyDemo/blob/master/TinkerDemo/patch.apk
 @GET()
    Call<ResponseBody> getDownload(@Url String baseUrl,@Query("raw")String raw);
复制代码
@Path 动态设置路径

假如我们要查纯文 和 热门的

//纯文
http://m2.qiushibaike.com/article/list/text
//热门
http://m2.qiushibaike.com/article/list/video
复制代码

4.3 POST请求 使用@POST注解

  • 场景一 登录例子 下一个接口 @FormUrlEncoded 表示表单形式提交参数 @Field 添加参数
    @POST("login")
    @FormUrlEncoded
    Call<UserBean> postLogin(@Field("username") String username, @Field("pwd") String pwd);
复制代码

调用

  Call<UserBean> nzy = mApiService.postLogin("nzy", "123456");
                nzy.enqueue(...);
复制代码
  • 表单上传 @Part
@Multipart
    @POST ("/avatar")
    Call<UserBean> postAvatar (@Header("Authorization") String authorization, @Part("file\"; filename=\"pp.png") RequestBody file);
复制代码
  • 添加头部(比如 header) @Part
@Multipart
    @POST ()
    Call<UserBean> postHeader (@Header("header") String header);
复制代码

Retrofit配合rxjava的使用

添加依赖compile'com.squareup.retrofit2:adapter-rxjava2:2.3.0'这个版本跟Retrofit版本最好一致

初始化Retrofit

 Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .client(okHttpClient)
                // 添加生成bean的工厂
                .addConverterFactory(GsonConverterFactory.create())
                //添加支持Rxjava
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .build();
复制代码

添加接口

 @GET("/article/list/text?page=1")
    Observable<TextBean> getBeanObservable();
复制代码

调用接口

 mApiService = retrofit.create(ApiService.class);
        Observable<TextBean> observable = mApiService.getBeanObservable();
        observable.subscribe(new Consumer<TextBean>() {
            @Override
            public void accept(TextBean textBean) throws Exception {
                Intent intent = new Intent(getApplicationContext(), TextActivity.class);
                intent.putExtra("textbean", textBean);
                startActivity(intent);
            }
        });
复制代码
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot 可以与 Retrofit2 集成,以便在应用程序中使用 Retrofit2 进行网络请求。 首先,需要在项目的构建文件中添加 Retrofit2 和其所需的依赖项。通常,可以在 Maven 或 Gradle 文件中添加以下依赖项: Maven: ```xml <dependencies> ... <dependency> <groupId>com.squareup.retrofit2</groupId> <artifactId>retrofit</artifactId> <version>2.9.0</version> </dependency> <dependency> <groupId>com.squareup.retrofit2</groupId> <artifactId>retrofit-converters</artifactId> <version>2.9.0</version> </dependency> <dependency> <groupId>com.squareup.retrofit2</groupId> <artifactId>converter-gson</artifactId> <version>2.9.0</version> </dependency> ... </dependencies> ``` Gradle: ```groovy dependencies { ... implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.retrofit2:converter-gson:2.9.0' ... } ``` 接下来,创建一个 Retrofit 的配置类,用于创建 Retrofit 实例。在该类中,可以设置 Retrofit 的基本配置,如 Base URL、Converter 等。以下是一个简单的示例: ```java @Configuration public class RetrofitConfig { @Value("${api.baseurl}") private String baseUrl; @Bean public Retrofit retrofit() { return new Retrofit.Builder() .baseUrl(baseUrl) .addConverterFactory(GsonConverterFactory.create()) .build(); } } ``` 上述示例中,`api.baseurl` 是一个配置属性,用于指定基本的 API URL。 然后,可以创建一个 Retrofit 的服务接口,定义需要访问的 API 接口。例如: ```java public interface MyApiService { @GET("/users/{id}") Call<User> getUser(@Path("id") String id); } ``` 在上述示例中,`User` 是一个自定义的数据模型类。 最后,在需要使用 Retrofit2 的地方,可以通过依赖注入的方式获取 Retrofit 实例,并使用它创建服务接口的实例。例如: ```java @Service public class MyService { private final MyApiService myApiService; @Autowired public MyService(Retrofit retrofit) { this.myApiService = retrofit.create(MyApiService.class); } public User getUser(String id) { Call<User> call = myApiService.getUser(id); Response<User> response = call.execute(); if (response.isSuccessful()) { return response.body(); } else { // 处理请求失败的情况 return null; } } } ``` 在上述示例中,通过 Retrofit 的 `create()` 方法创建了 `MyApiService` 的实例,并使用该实例进行网络请求。 需要注意的是,上述示例中的代码仅供参考,具体的实现可能会根据项目的需求和架构进行调整。 希望能帮到你!如果还有其他问题,请继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值