一沙郭、Retrofit介紹
簡介:
- Retrofit是Square公司基于RESTful風(fēng)格推出的網(wǎng)絡(luò)框架封裝
- Retrofit與OKHttp的關(guān)系:
?Retrofit是基于OKHttp的網(wǎng)絡(luò)請求的二次封裝督惰,其本質(zhì)仍是OKHttp - Retrofit庫包結(jié)構(gòu)
與其它網(wǎng)絡(luò)庫的對比:
-
AndroidAsynHttp
?基于HttpClient枪眉,作者已停止維護(hù)服球,Android5.0不再使用HttpClient因此不推薦使用挖诸。 -
Volley:
?基于HttpUrlConnection任柜,Google官方推出枫笛,只適合輕量級網(wǎng)絡(luò)交互如數(shù)據(jù)傳輸小吨灭,不適合大文件上傳下載場景。
Retrofit優(yōu)點(diǎn):
- API設(shè)計(jì)簡潔易用崇堰,注解化配置高度解耦沃于、支持多種解析器、支持Rxjava海诲。
二繁莹、Retrofit使用
Step1:
?Retrofit開源庫、OkHttp網(wǎng)絡(luò)庫特幔、數(shù)據(jù)解析器集成咨演、注冊網(wǎng)絡(luò)權(quán)限 。
- 依賴包導(dǎo)入
implementation 'com.squareup.retrofit2:retrofit:2.5.0'
implementation 'com.squareup.okhttp3:okhttp:3.12.0'
implementation 'com.squareup.retrofit2:converter-gson:2.5.0'
?maven方式:
<dependency>
<groupId>com.squareup.retrofit2</groupId>
<artifactId>retrofit</artifactId>
<version>2.4.0</version>
</dependency>
- 添加網(wǎng)絡(luò)權(quán)限
<uses-permission android:name="android.permission.INTERNET" />
Step2:
?創(chuàng)建接口設(shè)置請求類型與參數(shù)蚯斯。
//所需解析json對應(yīng)的類
public class UserInfoModel {
public String code; //屬性
}
//接口
public interface UserMgrService {
@GET("login")
Call<UserInfoModel> login(@Query("username") String username, @Query("pwd") String password);
}
Step3:
?創(chuàng)建Retrofit對象薄风、設(shè)置數(shù)據(jù)解析器。
//創(chuàng)建Retrofit對象 注意url后面有一個(gè)'/'拍嵌。
Retrofit retrofit = new Retrofit.Builder().baseUrl("http://localhost:8080/")
.addConverterFactory(GsonConverterFactory.create()).build();
Step4:
?生成接口對象遭赂。
// 獲取UserMgrService對象
UserMgrService userMgrService = retrofit.create(UserMgrService.class);
Step5:
?調(diào)用接口方法返回Call對象。
//調(diào)用login
final Call<UserInfoModel> call = userMgrService.login("admin", "admin");
Step6:
?發(fā)送請求(同步横辆、異步)撇他。
- 同步:調(diào)用Call對象的execute(),返回結(jié)果的響應(yīng)體
- 異步:調(diào)用Call對象的enqueue()狈蚤,參數(shù)是一個(gè)回調(diào)
//同步請求
Response<UserInfoModel> response = call.execute();
//異步請求
call.enqueue(new Callback<UserInfoModel>() {
@Override
public void onResponse(Call<UserInfoModel> call, Response<UserInfoModel> response) {
}
@Override
public void onFailure(Call<UserInfoModel> call, Throwable t) {
}
});
Step7:
?處理返回?cái)?shù)據(jù)困肩。
//發(fā)送請求
//同步請求需要開啟新線程執(zhí)行,否則會(huì)報(bào)錯(cuò)
new Thread(new Runnable() {
@Override
public void run() {
Response<UserInfoModel> response = null;
try {
response = call.execute();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("code:" + response.body().code);
}
}).start();
//異步請求
call.enqueue(new Callback<UserInfoModel>() {
@Override
public void onResponse(Call<UserInfoModel> call, Response<UserInfoModel> response) {
}
@Override
public void onFailure(Call<UserInfoModel> call, Throwable t) {
}
});
Step3-7:
//創(chuàng)建Retrofit對象 注意url后面有一個(gè)'/'脆侮。 Retrofit retrofit = new Retrofit.Builder().baseUrl("http://localhost:8080/") .addConverterFactory(GsonConverterFactory.create()).build(); // 獲取UserMgrService對象 UserMgrService userMgrService = retrofit.create(UserMgrService.class); //調(diào)用login final Call<UserInfoModel> call = userMgrService.login("admin", "admin"); //異步請求 call.enqueue(new Callback<UserInfoModel>() { @Override public void onResponse(Call<UserInfoModel> call, >Response<UserInfoModel> response) { } @Override public void onFailure(Call<UserInfoModel> call, Throwable t) { } });
常見參數(shù)注解:
@GET,@POST : 確定請求方式
@Path : 請求URL的字符替代
@Query:要傳遞的參數(shù)
@QueryMap:包含多個(gè)@Query注解參數(shù)
@body:添加實(shí)體類對象
@FormUrlEncoded:URL編碼
三锌畸、總結(jié)
- Retrofit是基于Okhttp網(wǎng)絡(luò)庫的高級封裝。
- 采用紓解靖避、網(wǎng)絡(luò)請求參數(shù)配置更靈活潭枣,擴(kuò)展性更好比默。
- RESTful風(fēng)格的API優(yōu)先選用Retrofit。