Android網(wǎng)絡(luò)訪問之Retrofit使用教程
一、概念
| HttpClient | Android 6中移除(API數(shù)量多擴(kuò)展困難)。 |
| HttpURLConnection | 目前官方集成的。 |
| OKHttp | Square公司出品,底層通訊的實(shí)現(xiàn)。 |
| Retrofit | Square公司出品,上層接口的封裝,更方便使用面向?qū)ο笏季S進(jìn)行網(wǎng)絡(luò)操作。 |
二、使用
Android 9開始默認(rèn)只允許使用 HTTPS 類型的網(wǎng)絡(luò)請(qǐng)求,HTTP明文傳輸因?yàn)橛邪踩[患不再支持。堅(jiān)持使用的話需要配置:右鍵res目錄→New→Directory→創(chuàng)建一個(gè)xml目錄,右鍵xml目錄→New→File→創(chuàng)建一個(gè)network_config.xml文件,修改內(nèi)容如下:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true">
<trust-anchors>
<certificates src="system" />
</trust-anchors>
</base-config>
</network-security-config>Manifest {
//添加網(wǎng)絡(luò)訪問權(quán)限
<uses-permission android:name="android.permission.INTERNET" />
//允許HTTP訪問
<application
android:networkSecurityConfig="@xml/network_config"
</application>
}
2.1HttpURLConnection
thread {
var connection: HttpURLConnection? = null
try {
val response = StringBuilder()
val url = URL("https://www.baidu.com")
connection = url.openConnection() as HttpURLConnection
connection.connectTimeout = 8000
connection.readTimeout = 8000
//GET請(qǐng)求
val input = connection.inputStream
val reader = BufferedReader(InputStreamReader(input))
reader.useLines { response.append(it) }
print(response.toString())
//POST請(qǐng)求
connection.requestMethod = "POST"
val output = DataOutputStream(connection.outputStream)
output.writeBytes("username=admin&password=123456")
} catch (e: Exception) {
e.printStackTrace()
} finally {
connection?.disconnect()
}
}2.2OKHttp
2.3Retrofit
implementation 'com.squareup.retrofit2:retrofit:2.9.0' //會(huì)連帶下載 OkHttp和Okio
implementation 'com.squareup.retrofit2:converter-gson:2.k6.1' //會(huì)連帶下載 GSON
2.3.1 定義實(shí)體類
根據(jù) JSON 內(nèi)容,編寫對(duì)應(yīng)的實(shí)體類。
data class Person(var name: String, var age: Int)
2.3.2 定義API接口
根據(jù) API 接口,編寫對(duì)應(yīng)的訪問文件。命名通常以功能名稱開頭+Service結(jié)尾。
| @GET | 從服務(wù)器獲取數(shù)據(jù) |
| @POST | 向服務(wù)器提交數(shù)據(jù) |
| @PUT @PATCH | 修改服務(wù)器上的數(shù)據(jù) |
| @DELETE | 刪除服務(wù)器上的數(shù)據(jù) |
interface PersonService {
//接口1:https://www.baidu.com/person.json
@GET("person.json") //表示發(fā)起的是GET請(qǐng)求,傳入請(qǐng)求的地址(相對(duì)路徑,重復(fù)根路徑在后面配置)
fun getPerson(): Call<list<Person>> //返回值必須聲明成Retrofit內(nèi)置的Call類型,通過泛型指定服務(wù)器返回的具體數(shù)據(jù)類型
//接口2:https://www.baidu.com/<page>/person.json
@GET("{page}/get_data.json") //使用 {page} 占位
fun getData(@Path("page") page: Int): Call<Data> //使用 @Path("page")注解來聲明對(duì)應(yīng)參數(shù)
//接口3:https://www.baidu.com/person.json?u=<user>&t=<token>
@GET("person.json")
fun getData(@Query("u") user: String, @Query("t") token: String): Call<Data>
//接口4:https://api.caiyunapp.com/v2/place?query=北京&token={token}&lang=zh_CN
@GET("v2/place?token=${GlobalApplication.TOKEN}&lang=zh_CN") //不變的參數(shù)固定寫在GET里
fun searchPlaces(@Query("query") query: String): Call<PlaceResponse>
//接口5:https://www.baidu.com/data/<id>
@DELETE("data/{id}")
fun deleteData(@Path("id") id: String): Call<ResponseBody> //該泛型表示能接受任意類型切不會(huì)進(jìn)行解析
//接口6:https://www.baidu.com/data/create{"id": 1, "content": "The description for this data."}
@POST("data/create")
fun createData(@Body data: Data): Call<ResponseBody> //將Data對(duì)象中的數(shù)據(jù)轉(zhuǎn)換成JSON格式的文本,并放到HTTP請(qǐng)求的body部分
//接口7:http://example.com/get_data.json
// User-Agent: okhttp //header參數(shù)就是鍵值對(duì)
// Cache-Control: max-age=0
//靜態(tài)聲明
@Headers("User-Agent: okhttp", "Cache-Control: max-age=0")
@GET("get_data.json")
fun getData(): Call<Data>
//動(dòng)態(tài)聲明
@GET("get_data.json")
fun getData(@Header("User-Agent") userAgent: String, @Header("Cache-Control") cacheControl: String): Call<Data>
}2.3.3 構(gòu)建Retrofit對(duì)象
val retrofit = Retrofit.Builder()
.baseUrl("https://www.baidu.com/") //配置重復(fù)的根路徑
.addConverterFactory(GsonConverterFactory.create()) //指定解析數(shù)據(jù)使用的轉(zhuǎn)換庫(kù)(這里是Gson)
.build()2.3.4 創(chuàng)建API接口實(shí)例并調(diào)用訪問函數(shù)
//創(chuàng)建動(dòng)態(tài)代理對(duì)象
val personService = retrofit.create(PersonService::class.java)
//調(diào)用訪問函數(shù)
personService.getPerson().enqueue(object : Call<List<person>> { //根據(jù)注解中配置的地址進(jìn)行網(wǎng)絡(luò)請(qǐng)求
override fun onResponse(call: Call<List<person>>, response: Response<List<person>>) {
val list = response.body() //得到解析后的對(duì)象
}
override fun onFailure(call: Call<List<person>>, t: Trouble) {
t.printStackTrace()
}
})2.3.5 優(yōu)化
object GlobalRetrofit {
private const val BASE_URL = "www.baidu.com/"
val retrofit: Retrofit = Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build()
//fun <T> create(serviceClass: Class<T>): T = retrofit.create(serviceClass)
inline fun <reified T> create(): T = create(T::class.java)
}
//使用
val personService = GlobalRetrofit.create<PersonService>()到此這篇關(guān)于Android網(wǎng)絡(luò)訪問之Retrofit使用教程的文章就介紹到這了,更多相關(guān)Android Retrofit內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android開發(fā)實(shí)現(xiàn)的簡(jiǎn)單媒體播放器功能示例
這篇文章主要介紹了Android開發(fā)實(shí)現(xiàn)的簡(jiǎn)單媒體播放器功能,結(jié)合實(shí)例形式分析了Android基于surfaceview實(shí)現(xiàn)多媒體視頻及音頻播放的相關(guān)操作技巧,需要的朋友可以參考下2017-10-10
Android實(shí)現(xiàn)聯(lián)動(dòng)下拉框二級(jí)地市聯(lián)動(dòng)下拉框功能
這篇文章主要介紹了Android實(shí)現(xiàn)聯(lián)動(dòng)下拉框二級(jí)地市聯(lián)動(dòng)下拉框功能,本文給大家分享思路步驟,給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-12-12
Android使用自定義View實(shí)現(xiàn)360手機(jī)衛(wèi)士波浪球進(jìn)度的效果
360衛(wèi)士的波浪球進(jìn)度的效果,一般最常用的方法就是畫線的方式,先繪sin線或貝塞爾曲線,然后從左到右繪制豎線,然后再裁剪圓區(qū)域2018-05-05
Android實(shí)現(xiàn)開機(jī)自動(dòng)啟動(dòng)Service或app的方法
這篇文章主要介紹了Android實(shí)現(xiàn)開機(jī)自動(dòng)啟動(dòng)Service或app的方法,結(jié)合實(shí)例形式分析了Android開機(jī)自啟動(dòng)程序的具體步驟與相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2016-07-07
Android開發(fā)手冊(cè)SeekBar拖動(dòng)條使用實(shí)例
這篇文章主要為大家介紹了Android開發(fā)手冊(cè)SeekBar拖動(dòng)條使用實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06
Android?Studio實(shí)現(xiàn)彈窗設(shè)置
這篇文章主要為大家詳細(xì)介紹了Android?Studio實(shí)現(xiàn)彈窗設(shè)置,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04
RecyclerView實(shí)現(xiàn)側(cè)滑和網(wǎng)絡(luò)斷點(diǎn)續(xù)傳
這篇文章主要為大家詳細(xì)介紹了RecyclerView實(shí)現(xiàn)側(cè)滑和網(wǎng)絡(luò)斷點(diǎn)續(xù)傳,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07
Android中PopupWindow彈出式窗口使用方法詳解
這篇文章主要為大家詳細(xì)介紹了Android中PopupWindow彈出式窗口的使用方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-09-09
Android自定義雙向進(jìn)度條的實(shí)現(xiàn)代碼
本篇文章主要介紹了Android自定義雙向進(jìn)度條的實(shí)現(xiàn)代碼,非常具有實(shí)用的價(jià)值,有興趣的同學(xué)一起來了解一下2017-09-09

