1、retrofit的使用
public interface Api {
//get请求
@GET("user")
Call<ResponseBody> getData();
}
- 这是一个没有网络参数的get请求方式,需要在方法头部添加@GET注解,表示采用get方法访问网络请求,括号内的是请求的地址(Url的一部分)
,其中返回类型是Call<*>,*表示接收数据的类,如果想直接获取ResponseBody中的内容,可以定义网络请求返回值为Call,ResponseBody是请求网络后返回的原始数据,如果网络请求没有参数,不用写。 - 这里特别说明Url的组成(下面会讲解到),retrofit把网络请求的Url分成两部分设置:第一部分在创建Retrofit实例时通过.baseUrl()设置,第二部分在网络接口注解中设置,比如上面接口的"/user",网络请求的完整地址Url
= Retrofit实例.baseUrl()+网络请求接口注解()。
3、Retrofit中get请求的使用
在build.gradle文件中添加Retrofit依赖库,由于Retrofit已经封装有okhttp所以不需要再添加okhttp的库
implementation 'com.squareup.retrofit2:retrofit:2.5.0'
<uses-permission android:name="android.permission.INTERNET"/>
implementation 'com.squareup.retrofit2:converter-gson:2.0.2'
因为用的是GSON解析方式所以先创建对应服务器返回的数据
public class Data<T> {
private int status;
private String msg;
private T data;
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
}
2、创建描述网络接口的类
这是Retrofit将okhttp请求抽象成Java的接口用注解描述和配置网络请求参数,封装Url地址和网络数据请求、
package com.example.networkdemo;
import android.icu.text.IDNA;
import retrofit2.Call;
import retrofit2.http.GET;
import retrofit2.http.Query;
public interface Api {
//get请求
@GET("FollowExcellence/Rxjava_Retrofit/master/data1.js")
Call<Data<ReData>> getJsonData(@Query("id") String id);
}
在方法头部添加@GET注解,表示采用get方法访问网络请求,括号内的是请求的地址(Url的一部分) ,其中返回类型是Call<*>,*表示接收数据的类,Data是上面封装的一个接收数据的统一公共类,添加参数在方法括号内添加@Query,后面是参数类型和参数字段,其实就是键值对的形式。
3、创建Retrofit实例
//构建Retrofit实例
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://raw.githubusercontent.com/")
//设置数据解析器
.addConverterFactory(GsonConverterFactory.create())
.build();
通过new Retrofit.Builder().buile()构建Retrofit实例对象,同时设置baseUrl地址,Retrofit把网络请求的URL 分成了两部分设置:
第一部分:在创建Retrofit实例时通过.baseUrl()设置,
.baseUrl("https://raw.githubusercontent.com/")
就是上面的这个地址会和方法请求注解上面的地址拼接在一起,baseUrl地址必须以“/”结尾,否则会报错,
第二部分:在网络请求接口的注解设置,就是在上面的APi接口中用GET注解的字符串:
@GET("FollowExcellence/Rxjava_Retrofit/master/data1.js")
上面地址拼接后的完整地址为:https://raw.githubusercontent.com/FollowExcellence/Rxjava_Retrofit/master/data1.js,然后通过addConverterFactory设置数据解释器,这里添加的是Gson解释器。这是为了使来自接口的json结果会自动解析成定义好的字段和类型都相符的json对象接受类,在Retrofit 2.0中已经没有Converter,需要自己创建一个Converter, 不然Retrofit只能接收字符串结果,最后需要自己去解析。
4、创建网络请求接口实例
//创建网络请求接口对象实例
Api api = retrofit.create(Api.class);
//对发送请求进行封装
Call<Data<ReData>> dataCall = api.getJsonData("10006");
5、发送网络请求(异步/同步)
//异步请求
dataCall.enqueue(new Callback<Data<Info>>() {
//请求成功回调
@Override
public void onResponse(Call<Data<Info>> call, Response<Data<Info>> response) {
}
//请求失败回调
@Override
public void onFailure(Call<Data<Info>> call, Throwable t) {
}
});
//同步请求
Response<Data<Info>> data= dataCall.execute();
6、处理返回数据
//异步请求
dataCall.enqueue(new Callback<Data<ReData>>() {
@Override
public void onResponse(Call<Data<ReData>> call, retrofit2.Response<Data<ReData>> response) {
//请求成功回调
Toast.makeText(MainActivity.this,"回调成功:异步执行",Toast.LENGTH_LONG).show();
if (response == null) return;
Data<ReData> data = response.body();
ReData info = data.getData();
textView.setText(info.getId()+"\n"+info.getTitle()+"\n"+info.getUnique()+"\n"+info.getImageId());
}
@Override
public void onFailure(Call<Data<ReData>> call, Throwable t) {
//请求失败回调
Log.e(TAG, "回调失败:" + t.getMessage() + "," + t.toString());
Toast.makeText(MainActivity.this, "回调失败", Toast.LENGTH_SHORT).show();
}
});