最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android網(wǎng)絡(luò)訪問之Retrofit使用教程

 更新時(shí)間:2022年12月13日 14:37:27   作者:懶到死的程序員  
Retrofit?是一個(gè)?RESTful?的?HTTP?網(wǎng)絡(luò)請(qǐng)求框架的封裝,網(wǎng)絡(luò)請(qǐng)求的工作本質(zhì)上是?OkHttp?完成,而?Retrofit?僅負(fù)責(zé)?網(wǎng)絡(luò)請(qǐng)求接口的封裝

一、概念

HttpClientAndroid 6中移除(API數(shù)量多擴(kuò)展困難)。
HttpURLConnection目前官方集成的。
OKHttpSquare公司出品,底層通訊的實(shí)現(xiàn)。
RetrofitSquare公司出品,上層接口的封裝,更方便使用面向?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)換庫(這里是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)文章

最新評(píng)論

柳林县| 尉氏县| 遂川县| 滨海县| 澄迈县| 新和县| 水富县| 舟山市| 古交市| 东海县| 藁城市| 新龙县| 北京市| 集贤县| 贵南县| 丰镇市| 铜鼓县| 旌德县| 塔河县| 甘洛县| 轮台县| 吕梁市| 乐东| 福建省| 南阳市| 曲麻莱县| 大埔县| 枣强县| 新乡县| 临朐县| 抚宁县| 宽甸| 石首市| 广水市| 色达县| 临安市| 定南县| 曲靖市| 肥城市| 镇康县| 湾仔区|