Retrofit2.0入門教程
Retrofit的官方文件前面我已經把現在最為流行三個網路框架的其中兩個volley和Okhttp3擼了一遍,接下來我就把最後的一個Retrofit2也擼一下。最近也搞了一下Android SDK開發的事,發現網上對於Android SDK開發的資料真的很少。到時我會把這個框架的功能整合到一個Jar包上,做一個簡單的SDK開發來讓大家也瞭解一下。
我們先來了解一下Retrofit2這個網路框架,準確來說Retrofit是基於Okhttp3的官方封裝一個網路框架。所以這個框架的使用跟Okhttp3非常的相似,如果你在此之前又看過我前面的OKhttp3的教程或者其他人的教程的話,接下來的內容你就會更加的容易瞭解。
由於最近更新了Androidstudio3.0,便用這個編譯環境來試水啦,不過使用原理都是一樣的。首先我們先建立一個名為RetrofitDemo的專案,然後在app的gradle下新增Retrofit的依賴包。如下:
implementation 'com.squareup.retrofit2:retrofit:2.4.0'
然後我們嘗試做這樣一個功能,當我們點選一個GET按鈕時就向服務端傳送一個GET請求,然後我們把返回來的結果通過吐司展示出來。當我們點選一個POST按鈕就向服務端傳送一個POST請求,也把返回來的結果吐司展現。XML佈局如下:
<Button android:layout_margin="10dp" android:id="@+id/btn_login_get" android:text="GET登入" android:layout_width="match_parent" android:layout_height="wrap_content" /> <Button android:layout_margin="10dp" android:id="@+id/btn_login_post" android:text="POST登入" android:layout_width="match_parent" android:layout_height="wrap_content" />
接下來我們建立一個名為Api的介面,這是根據Retrofit的官方文件的格式來定義。介面程式碼如下:
public interface Api {
@GET("寫上你要訪問的地址")//GET請求註釋
Call<ResponseBody> getUserInfo();
@POST("寫上你要訪問的地址")//POST請求註釋
Call<User> postSubmit (@Body User user);
}
主函式裡,因為我們的POST請求是以JSON的格式來返回資料的,所以我們要先在app.gradle裡新增GSON依賴,程式碼如下:
implementation 'com.squareup.retrofit2:converter-gson:2.4.0'
接下來我們分別為兩個按鈕新增點選事件,並呼叫剛才定義介面的GET和POST方法來驗證是否能夠正常訪問我們需要訪問的地址,並進行吐司,最後還要在AndroidManifest裡面註冊網路許可權。主函式程式碼如下:
private Button btn_login_get,btn_login_post;
private Api api;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn_login_get = findViewById(R.id.btn_login_get);
btn_login_post = findViewById(R.id.btn_login_post);
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("寫上你要訪問的基地址如:http://127.0.0.1:8080/")
.addConverterFactory(GsonConverterFactory.create())//通過Gson的格式來解析資料
.build();
api = retrofit.create(Api.class);
btn_login_post.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
User user = new User();
user.setMoyo_sdk_name("admin");
user.setMoyo_sdk_pwd("123456");
api.postSubmit(user).enqueue(new Callback<User>() {//呼叫了我們在介面上定義的POST方法postSubmit(請求型別) Callback(返回型別)
@Override
public void onResponse(Call<User> call, Response<User> response) {
String name = response.body().getMoyo_sdk_name();
String password = response.body().getMoyo_sdk_pwd();
int code = response.body().getCode();
Toast.makeText(MainActivity.this,"name:"+name+"password:"+password+"code:"+code,Toast.LENGTH_LONG).show();
}
@Override
public void onFailure(Call<User> call, Throwable t) {
}
});
}
});
btn_login_get.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//此部分為不簡寫,適合新手檢視原理
// Call<ResponseBody> call = api.getUserInfo();
//
// call.enqueue(new Callback<ResponseBody>() {
// @Override
// public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
//
// try {
// String msg = response.body().string();
// Toast.makeText(MainActivity.this,msg,Toast.LENGTH_LONG).show();
// } catch (IOException e) {
// e.printStackTrace();
// }
// }
//
// @Override
// public void onFailure(Call<ResponseBody> call, Throwable t) {
//
// }
// });
//
api.getUserInfo().enqueue(new Callback<ResponseBody>() {//呼叫了介面上的GET方法getUserInfo()
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
try {
String result = response.body().string();
Toast.makeText(MainActivity.this,result,Toast.LENGTH_LONG).show();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
}
});
}
});
}
在我們處理資料的時候我們可以選擇建立一些Bean類,因為每個人請求的後臺所得到的資料都不一樣我就不把我的Bean類的原始碼粘貼出來了。在官方文件中還有很多的提交形式,有興趣的可以去了解一下。我這裡算了拋磚引玉,如果有什麼錯誤的地方歡迎各位提出來一個探討。