Retrofit入门使用

Retrofit入门使用

简介:Retrofit是一种类型安全的HTTP客户端,它基于OkHttp并由Square公司开发。它使用注解来定义HTTP请求,可以轻松地将REST API转换为Java接口。Retrofit还支持异步和同步请求,支持多种转换器来处理JSON、XML和其他数据格式,是开发Android和Java应用程序中广泛使用的网络库之一。它的使用和Room数据库十分相似。

添加依赖和权限

首先添加依赖:

implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
implementation 'com.squareup.okhttp3:okhttp:4.9.2'

然后添加网络权限:

<uses-permission android:name="android.permission.INTERNET"/>

入门使用流程图

在这里插入图片描述

Interface接口类

接口类中我们需要定义一些方法,这些方法本质上来说其实是用来指定获取数据的网址和方法的,即获取信息的路径。
我以彩云天气的api文档中的示例URL作为测试数据。点这里获取最新文档。

这里我定义了一个简单的接口类:

public interface ReInterface {
//定义了需要实现的方法

public static String BASE_URL = "https://api.caiyunapp.com/v2.6/TAkhjf8d1nlSlspN/101.6656,39.2072/";


@GET("realtime")
public Call<ReModel> getRealtime();

//dynamic para
@GET("{type}")
 public Call<ReModel> Dynamic_getData(@Path("type") String types);
}

方法上的@GET注解表示我们用GET方法请求,同理还有@POST注解,表示用POST方法请求。返回的数据需要是Call< T >
,即Call的泛型,我这里传入的ReModel类是一个GSON的数据类,就是用JSON解析时需要传入的模板类。

在GET注解的括号里,我们可以注意到还有一个字符串,这个字符串是和baseUrl配合起来拼接成请求网址的,比如上面的例子,BASE_URL为 “https://api.caiyunapp.com/v2.6/TAkhjf8d1nlSlspN/101.6656,39.2072/”,而第一个GET方法后面跟的是"realtime",那么最后请求的网址就是"https://api.caiyunapp.com/v2.6/TAkhjf8d1nlSlspN/101.6656,39.2072/realtime",就是直接拼接在后面。

需要说明的是baseUrl也是有一定命名规则的:

  • 1.BaseUrl的格式应该遵循URI格式规范,例如:
    • HTTP协议:http://www.example.com/api/
    • HTTPS协议:https://www.example.com/api/
  • 2.BaseUrl应该以/结尾,否则在接口中添加路径参数时可能会导致路径拼接错误。
  • 3.BaseUrl应该只包含主机名和基础路径,不应该包含具体的接口路径,因为具体的接口路径应该在接口定义中进行定义。

Model数据类

这里的数据类就是GSON解析时我们需要传入的模板类,GSON会根据这个模板类将JSON数据转化为GSON模板类的实体,具体可以看GSON解析。

实体类:

public class ReModel {

	@SerializedName("status")
	public String status;

	@SerializedName("lang")
	public String lang;

	@SerializedName("timezone")
	public String timezone;
}

使用Retrofit

遵循一开始的入门使用流程图,我们来编写一段示例代码:

private void simpleForRetrofit(){
    Retrofit retrofit = new Retrofit.Builder().baseUrl(ReInterface.BASE_URL)
            .addConverterFactory(GsonConverterFactory.create())
            .build();//创建Retrofit实体类
    //baseUrl有着格式的规范

    //创建接口实现类
    ReInterface simpleInterface = retrofit.create(ReInterface.class);
    //通过接口实现类返回Call对象
    Call<ReModel> myCall = simpleInterface.getRealtime();

    //通过Call执行请求--与Okhttp不同,Retrofit的回调中可以直接刷新UI,这是它比Okhttp更优秀的一点
    myCall.enqueue(new Callback<ReModel>() {
        @Override
        public void onResponse(Call<ReModel> call, Response<ReModel> response) {
            ReModel data = response.body();//通过response获取序列化后的数据(因为之前已经添加了GsonConvert)
            Toast.makeText(MainActivity.this, data.timezone, Toast.LENGTH_SHORT).show();
            Log.d(TAG, "onResponse: "+Thread.currentThread().getName());
        }
        @Override
        public void onFailure(Call<ReModel> call, Throwable t) {
            Toast.makeText(MainActivity.this, "Error!", Toast.LENGTH_SHORT).show();
        }
    });

}

我们先配置Builder,设置了它的baseUrl和Convert,Convert是用来转化数据的,即把数据转化为实体类,这里我们设置转换器为Gson,即利用Gson解析。这样它最终返回的数据就会被解析为Gson实体类。然后通过Builder,我们构建了Retrofit实体类,这个实体类使用接口类为模板,创建出了具体的接口实体,然后我们就可以用这个接口实体发送请求。我们将请求发送出去,并在其回调方法中处理数据。

**这里我们可能会有疑惑,Retrofit的回调方法中可以使用Toast吗,实际上是可以的,虽然Retrofit是基于Okhttp的,但是它与Okhttp不同,它的回调方法中是可以直接刷新UI的,因为其是通过Handler与主线程绑定的,所以会在主线程里执行。**执行后我们可以看到 Log.d(TAG, "onResponse: "+Thread.currentThread().getName());方法打印了main,说明是在主线程中运行的。
在这里插入图片描述
通过Toast,我们可以看出数据请求成功了:
在这里插入图片描述

Path注解-动态参数

当然,除了在GET注解里将参数定死,我们还可以用Path注解,动态地来指定请求的Url:

 //dynamic para
   @GET("{type}")
   public Call<ReModel> Dynamic_getData(@Path("type") String types);
}

这里,传入的String 参数 types 将会替换 它前面的@Path(“type”)中的"type"字符串,然后该字符串又会替换GET注解后面的{type},这里我们可能换个参数名比较好理解:

//dynamic para
   @GET("{typeB}")
   public Call<ReModel> Dynamic_getData(@Path("typeB") String typeA);
}

就是说,typeA替换@Path中的typeB,然后@Path中被替换掉的typeB最后替换GET后的{typeB},最终实现动态请求参数。

Query注解-查询具体项

其实总的来说,我们上面所说的几种注解都是为了实现字符串的拼接,Query也不例外。

在Retrofit中,@Query注解是用来标记一个请求参数的,它可以添加到一个方法的参数中,指定这个参数是用来作为请求URL的查询参数的。例如,如果我们有一个API接口,需要通过城市名称查询天气,我们可以这样定义:

@GET("weather")
Call<Weather> getWeatherByCity(@Query("city") String cityName);

在这个例子中,我们使用@GET注解来指定请求方法为GET,然后在getWeatherByCity方法的参数cityName上使用@Query注解来标记这个参数是用来作为请求URL的查询参数的。最终生成的请求URL为:https://example.com/weather?city=xxx。

我们可以在参数上使用多个@Query注解,每个@Query注解的value指定查询参数的名称,例如:

@GET("weather")
Call<Weather> getWeatherByCityAndTime(@Query("city") String cityName, @Query("time") long timestamp);

最终生成的请求URL为:https://example.com/weather?city=xxx&time=yyy。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值