1差导,Retrofit2的使用步驟
1脓匿,定義接口(封裝URL地址和數(shù)據(jù)請(qǐng)求)
2遍略,實(shí)例化Retrofit
3压鉴,通過Retrofit實(shí)例創(chuàng)建接口服務(wù)對(duì)象
4崖咨,接口服務(wù)對(duì)象調(diào)用接口中的方法,獲取Call對(duì)象
5油吭,Call對(duì)象執(zhí)行請(qǐng)求(異步击蹲、同步請(qǐng)求)
2.Retrofit2發(fā)送GET署拟、POST請(qǐng)求(異步、同步)
1.Retrofit2發(fā)送GET
//主機(jī)地址
String URL = "http://api.shujuzhihui.cn/api/news/";//必須以反斜杠結(jié)尾
//接口服務(wù)
public interface MyServer {
//GET
@GET("categories?appKey=908ca46881994ffaa6ca20b31755b675")
Call<ResponseBody> getData1();
@GET("categories?")
Call<ResponseBody> getData2(@Query("appKey") String appkey);
@GET("categories?")
Call<ResponseBody> getData3(@QueryMap Map<String,Object> map);
}
//Get異步
private void initGetEnqueue() {
//1.創(chuàng)建Retrofit對(duì)象
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(MyServer.URL)
.build();
//2.獲取MyServer接口服務(wù)對(duì)象
MyServer myServer = retrofit.create(MyServer.class);
//3.獲取Call對(duì)象
//方式一
Call<ResponseBody> call1 = myServer.getData1();
//方式二
Call<ResponseBody> call2 = myServer.getData2("908ca46881994ffaa6ca20b31755b675");
//方式三
Map<String,Object> map = new HashMap<>();
map.put("appKey","908ca46881994ffaa6ca20b31755b675");
Call<ResponseBody> call = myServer.getData3(map);
//4.Call對(duì)象執(zhí)行請(qǐng)求
call.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call,Response<ResponseBody> response) {
try {
String result = response.body().string();
Log.e("retrofit", "onResponse: "+result);
tv.setText(result);//默認(rèn)直接回調(diào)主線程
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
Log.e("retrofit", "onFailure: "+t.getMessage());
}
});
}
//GET同步
private void initGetExecute() {
//1.創(chuàng)建Retrofit對(duì)象
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(MyServer.URL)
.build();
//2.獲取MyServer接口服務(wù)對(duì)象
MyServer myServer = retrofit.create(MyServer.class);
//3.獲取Call對(duì)象
final Call<ResponseBody> call = myServer.getData1();
new Thread(){//子線程執(zhí)行
@Override
public void run() {
super.run();
try {
//4.Call對(duì)象執(zhí)行請(qǐng)求
Response<ResponseBody> response = call.execute();
final String result = response.body().string();
Log.e("retrofit", "onResponse: "+result);
runOnUiThread(new Runnable() {
@Override
public void run() {
tv.setText(result);//默認(rèn)直接回調(diào)主線程
}
});
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
}
2.Retrofit2發(fā)送POST
String URL = "http://api.shujuzhihui.cn/api/news/";//必須以反斜杠結(jié)尾
public interface MyServer {
//POST("categories?") POST("categories")相同
@POST("categories?")
@FormUrlEncoded
Call<ResponseBody> postData1(@Field("appKey") String appKey);
@POST("categories")
@FormUrlEncoded
Call<ResponseBody> postData2(@FieldMap Map<String,Object> map);
}
//POST異步
private void initPostEnqueue() {
//1.創(chuàng)建Retrofit對(duì)象
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(MyServer.URL)
.build();
//2.獲取MyServer接口服務(wù)對(duì)象
MyServer myServer = retrofit.create(MyServer.class);
//3.獲取Call對(duì)象
//方式一
Call<ResponseBody> call1 = myServer.postData1("908ca46881994ffaa6ca20b31755b675");
//方式二
Map<String,Object> map = new HashMap<>();
map.put("appKey","908ca46881994ffaa6ca20b31755b675");
Call<ResponseBody> call = myServer.postData2(map);
//4.Call對(duì)象執(zhí)行請(qǐng)求
call.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call,Response<ResponseBody> response) {
try {
String result = response.body().string();
Log.e("retrofit", "onResponse: "+result);
tv.setText(result);//默認(rèn)直接回調(diào)主線程
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
Log.e("retrofit", "onFailure: "+t.getMessage());
}
});
}
3.Retrofit注解
注解代碼 請(qǐng)求格式
請(qǐng)求方式:
@GET GET請(qǐng)求
@POST POST請(qǐng)求
@DELETE DELETE請(qǐng)求
@HEAD HEAD請(qǐng)求
@OPTIONS OPTIONS請(qǐng)求
@PATCH PATCH請(qǐng)求
請(qǐng)求頭:
@Headers("K:V") 添加請(qǐng)求頭歌豺,作用于方法
@Header("K") 添加請(qǐng)求頭推穷,參數(shù)添加頭
@FormUrlEncoded 用表單數(shù)據(jù)提交,搭配參數(shù)使用
@Stream 下載
@Multipart 用文件上傳提交 multipart/form-data
請(qǐng)求參數(shù):
@Query 替代參數(shù)值类咧,通常是結(jié)合get請(qǐng)求的
@QueryMap 替代參數(shù)值馒铃,通常是結(jié)合get請(qǐng)求的
@Field 替換參數(shù)值,是結(jié)合post請(qǐng)求的
@FieldMap 替換參數(shù)值痕惋,是結(jié)合post請(qǐng)求的
請(qǐng)求路徑:
@Path 替換路徑
@Url 路徑拼接
請(qǐng)求體:
@Body(RequestBody) 設(shè)置請(qǐng)求體区宇,是結(jié)合post請(qǐng)求的
文件處理:
@Part Multipart.Part
@Part("key") RequestBody requestBody(單參)
@PartMap Map<String,RequestBody> requestBodyMap(多參)
@Body RequestBody requestBody(自定義參數(shù))