官方介紹
Type-safe HTTP client for Android and Java - 用于Android和Java的類型安全的HTTP客戶端忆植。
加載新手教程
Retrofit譯為“改進(jìn)”蝌诡,改進(jìn)了啥纬向?實(shí)際上Retrofit是基于OkHttp網(wǎng)絡(luò)框架的封裝参滴。
首先我們來看看,使用Retrofit發(fā)送一個(gè)請(qǐng)求的大概流程:
- 我們使用Retrofit的接口層對(duì)URL、請(qǐng)求方式、請(qǐng)求參數(shù)勇边、Header等進(jìn)行封裝
- Retrofit使用OkHttp完成真正的請(qǐng)求操作
- OkHttp將服務(wù)器返回的數(shù)據(jù)提供給Retrofit
- Retrofit根據(jù)我們的需求去解析數(shù)據(jù)。
進(jìn)入新手教程
簡單介紹完Retrofit之后折联,讓我們來看看具體應(yīng)該怎么使用&&一起完成一個(gè)搜索古詩小Demo
搜索古詩小Demo
首先我們打開Android Studio粒褒,新建RetrofitDemo項(xiàng)目
添加依賴
//Retrofit庫
implementation 'com.squareup.retrofit2:retrofit:2.5.0'
獲取最新版本請(qǐng)移步Retrofit Github官方地址
在
activity_main.xml
布局文件中添加以下控件并根據(jù)自己喜好排版
3個(gè)TextView:title標(biāo)題、author作者诚镰、content內(nèi)容
1個(gè)EditText 編輯框
1個(gè)Button 按鈕
1個(gè)ProgressBar 進(jìn)度條(可要可不要)
然后在MainActivity
中將實(shí)例化他們-
搜索古詩API
https://api.apiopen.top/searchPoetry?name=
這里我用的是簡書用戶有夢(mèng)想的程序丶猿老哥提供的免費(fèi)開放接口API(點(diǎn)擊跳轉(zhuǎn))
新建古詩實(shí)體類Poetry
這里給大家推薦一款實(shí)用小插件GsonFormat
奕坟,它可以幫我們快速生成一個(gè)實(shí)體類
安裝方式:File - Settings... - Plugins - 搜索GsonFormat
- 點(diǎn)擊右側(cè)綠色I(xiàn)nstall plugin按鈕
等待安裝完成重啟Android Stdio就可以使用了
使用方式:在瀏覽器中打開https://api.apiopen.top/searchPoetry?name=靜夜思,將返回的整個(gè)JSON數(shù)據(jù)復(fù)制清笨,然后回到Poetry類中月杉,按下alt+ins
選擇GsonFormat,將內(nèi)容粘貼到這里抠艾,然后點(diǎn)OK苛萎,就能看到GsonFormat幫我們自動(dòng)生成好的實(shí)體類內(nèi)容了~
public class Poetry {
/**
* code : 200
* message : 成功!
* result : [{"title":"靜夜思","content":"床前看月光,疑是地上霜检号。|舉頭望山月腌歉,低頭思故鄉(xiāng)。","authors":"李白"}]
*/
private int code;
private String message;
private List<ResultBean> result;
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public List<ResultBean> getResult() {
return result;
}
public void setResult(List<ResultBean> result) {
this.result = result;
}
public static class ResultBean {
/**
* title : 靜夜思
* content : 床前看月光齐苛,疑是地上霜翘盖。|舉頭望山月,低頭思故鄉(xiāng)脸狸。
* authors : 李白
*/
private String title;
private String content;
private String authors;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getAuthors() {
return authors;
}
public void setAuthors(String authors) {
this.authors = authors;
}
}
}
- 在
MainActivity
中創(chuàng)建Retrofit實(shí)例
Retrofit retrofit = new Retrofit.Builder() //創(chuàng)建Retrofit實(shí)例
.baseUrl("https://api.apiopen.top/") //這里需要傳入url的域名部分
.addConverterFactory(GsonConverterFactory.create()) //返回的數(shù)據(jù)經(jīng)過轉(zhuǎn)換工廠轉(zhuǎn)換成我們想要的數(shù)據(jù)最仑,最常用的就是Gson
.build(); //構(gòu)建實(shí)例
我們期望請(qǐng)求返回的結(jié)果Retrofit能幫我們加工成剛才定義的實(shí)體類,所以我們需要添加Gson轉(zhuǎn)換工廠炊甲,使用GsonConverterFactory之前我們需要先添加以下依賴
//將剛才添加的retrofit依賴庫中的retrofit替換成converter-gson即可
implementation 'com.squareup.retrofit2:converter-gson:2.5.0'
- 新建一個(gè)RetrofitService接口類泥彤,用于定義所有網(wǎng)絡(luò)請(qǐng)求
在本案例中,我們使用的是一個(gè)GET請(qǐng)求卿啡,讓我們來看看怎么去定義這個(gè)請(qǐng)求
import retrofit2.Call;
import retrofit2.http.GET;
import retrofit2.http.Query;
public interface RetrofitService {
//get請(qǐng)求接口
@GET("searchPoetry") //指定請(qǐng)求類型的注解
Call<Poetry> getPoetry(@Query("name") String name); //獲取古詩的方法
}
首先我們?cè)讷@取古詩方法的上面添加了一個(gè)GET注解吟吝,并在括號(hào)里傳入了url的后半段,也就是你要訪問前面域名baseUrl下的哪個(gè)文件(接口)
相應(yīng)的颈娜,Retrofit肯定也為我們提供了@POST/@PUT等注解剑逃,用法相同
然后我們定義了一個(gè)返回類型為Call實(shí)體的方法getPoetry,并指定其泛型為Poetry類官辽,緊接著我們看到這個(gè)方法的傳入?yún)?shù)為@Query("name") String name蛹磺,再次觀察url的最后一部分searchPoetry?name=靜夜思
,不難發(fā)現(xiàn)同仆,name=靜夜思
中的name就是@Query("name")注解萤捆,而靜夜思就是我們傳入的String字符串,原來Retrofit會(huì)幫我們自動(dòng)處理好,我們只需要把a(bǔ)pi接口需要的參數(shù)用@Query注解標(biāo)記俗或,然后傳值就可以了市怎,除了@Query,再介紹一些Retrofit為我們提供的常用注解:
GET請(qǐng)求
@QueryMap :傳入?yún)?shù)較多時(shí)辛慰,可以把參數(shù)放在Map中
……
POST
@Body:將一整個(gè)對(duì)象作為請(qǐng)求體
@Field:表單數(shù)據(jù)鍵值對(duì)傳輸
具體用法請(qǐng)閱讀Retrofit官方文檔
- 接下來我們將在
MainActivity
中完成實(shí)現(xiàn)接口類 → 使用接口類中的請(qǐng)求方法獲取一個(gè)Call對(duì)象 → 使用Call對(duì)象發(fā)送請(qǐng)求并編寫回調(diào)Callback邏輯区匠,由于我在代碼中已經(jīng)為大部分步驟寫好了注釋,所以直接貼上MainActivity
代碼
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
public class MainActivity extends AppCompatActivity {
private TextView title; //古詩標(biāo)題
private TextView author; //古詩作者
private TextView content; //古詩內(nèi)容
private EditText editText; //編輯框
private Button find; //查找古詩按鈕
private RetrofitService service; //請(qǐng)求接口
private ProgressBar progressBar; //進(jìn)度條
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//綁定控件
title = findViewById(R.id.title);
author = findViewById(R.id.author);
content = findViewById(R.id.content);
editText = findViewById(R.id.edit_text);
find = findViewById(R.id.button);
progressBar = findViewById(R.id.progress_bar);
Retrofit retrofit = new Retrofit.Builder() //創(chuàng)建Retrofit實(shí)例
.baseUrl("https://api.apiopen.top/") //url頭部
.addConverterFactory(GsonConverterFactory.create()) //返回的數(shù)據(jù)經(jīng)過轉(zhuǎn)換工廠轉(zhuǎn)換成我們想要的數(shù)據(jù)帅腌,最常用的就是Gson
.build(); //構(gòu)建實(shí)例
service = retrofit.create(RetrofitService.class); //使用retrofit的create()方法實(shí)現(xiàn)請(qǐng)求接口類
find.setOnClickListener(new View.OnClickListener() { //設(shè)置按鈕點(diǎn)擊事件
@Override
public void onClick(View v) {
progressBar.setVisibility(View.VISIBLE); //進(jìn)度條顯示
request();
}
});
}
//請(qǐng)求古詩的方法
private void request() {
Call<Poetry> call = service.getPoetry(editText.getText().toString()); //通過getPoetry()方法獲取Call對(duì)象
call.enqueue(new Callback<Poetry>() { //call入列發(fā)送請(qǐng)求驰弄,傳入回調(diào)Callback,重寫成功onRespons()與失敗onFailure()方法狞膘,并編寫相應(yīng)邏輯
/**
* 請(qǐng)求成功
* */
@Override
public void onResponse(Call<Poetry> call, Response<Poetry> response) { //返回的response中包含了所有信息揩懒,其中response.body就是響應(yīng)主體
if (response.body().getResult().size() > 0) { //由于我們已經(jīng)添加了Gson轉(zhuǎn)換工廠,所以響應(yīng)主體會(huì)被轉(zhuǎn)換成Poetry對(duì)象挽封,使用對(duì)象響應(yīng)方法判斷返回的古詩是否大于一首
title.setText(response.body().getResult().get(0).getTitle()); //數(shù)據(jù)展示
author.setText(response.body().getResult().get(0).getAuthors());
String contentText = response.body().getResult().get(0).getContent().replace("|", "\n"); //由于接口返回的古詩體用"|"代替換行已球,所以我們想要換行輸出就要替換回來
content.setText(contentText);
} else {
Toast.makeText(MainActivity.this, "這就觸及到我的知識(shí)盲區(qū)了", Toast.LENGTH_SHORT).show(); //古詩沒有大于一首
}
progressBar.setVisibility(View.INVISIBLE); //進(jìn)度條隱藏
}
/**
* 請(qǐng)求失敗
* */
@Override
public void onFailure(Call<Poetry> call, Throwable t) {
progressBar.setVisibility(View.INVISIBLE); //進(jìn)度條隱藏
Log.d("ManiActivity", t.getMessage()); //控制臺(tái)打印報(bào)錯(cuò)原因
}
});
}
}
- 最后一步
也是經(jīng)常容易忘記的一步,在AndroidManifest.xml
中添加網(wǎng)絡(luò)請(qǐng)求權(quán)限
<uses-permission android:name="android.permission.INTERNET"/>
新手教程結(jié)束
對(duì)于Retrofit本篇僅是了解個(gè)入門辅愿,更多Retrofit的用法還需繼續(xù)學(xué)習(xí)智亮!