哈嘍,大家新年好,在上一篇聊了Okhttp基本用法之后,準(zhǔn)備再和大家聊聊Okhttp的其他方法。還沒有看過(guò)我上一篇的同學(xué)可以點(diǎn)擊鏈接先看看上一篇文章。
下面先說(shuō)說(shuō)這篇文章的基本大綱
1、請(qǐng)求超時(shí)設(shè)置
2、自定義Requestbody
3、Okhttp如何設(shè)置Header
4、Response
請(qǐng)求超時(shí)設(shè)置
在Okhttp訪問(wèn)網(wǎng)絡(luò)時(shí),我們可以通過(guò)它提供給我們的方法來(lái)設(shè)置Okhttp網(wǎng)絡(luò)請(qǐng)求超時(shí)的時(shí)間,這樣能更加方便的滿足我們的需求。
val okHttpClient = OkHttpClient.Builder()
? ? .connectTimeout(10, TimeUnit.SECONDS)//連接超時(shí)
? ? .readTimeout(10, TimeUnit.SECONDS)//讀取超時(shí)
? ? .writeTimeout(10, TimeUnit.SECONDS)//寫入超時(shí)
? ? .build()
val request = Request.Builder()
.url("網(wǎng)絡(luò)地址")
.build()
val call = okHttpClient.newCall(request)
這里可以根據(jù)自己的需求進(jìn)行設(shè)置,如果沒有設(shè)置的話,默認(rèn)的時(shí)間為10秒。
自定義Requestbody
當(dāng)我們要以流的方式提交請(qǐng)求體的時(shí)候,我們就會(huì)用到自定義的Requestbody。
val okHttpClient = OkHttpClient()
val requestBody =object : RequestBody() {
override fun contentType(): MediaType? {
return null
? ? }
override fun writeTo(sink: BufferedSink) {
//以流的方式提交post請(qǐng)求體
? ? ? ? val fileInputStream = FileInputStream("path")
val byte = ByteArray(1024)
while ((fileInputStream.read(byte)) != -1) {
//向服務(wù)器寫入
? ? ? ? ? ? sink.write(byte)
}
}
}
val request = Request.Builder()
.url("網(wǎng)絡(luò)地址")
.post(requestBody)
.build()
val call? = okHttpClient.newCall(request)
Okhttp如何設(shè)置Header
在Okhttp中設(shè)置請(qǐng)求頭很簡(jiǎn)單,方法都是現(xiàn)成的
val okHttpClient = OkHttpClient()
val request = Request.Builder()
.url("網(wǎng)絡(luò)地址")
.header("key1","content1")
.addHeader("key2","content2")
.build()
val call = okHttpClient.newCall(request)
就是這么簡(jiǎn)單,可以直接設(shè)置,包括Cookie也是可以這樣設(shè)置。
Response
最后我們來(lái)簡(jiǎn)單說(shuō)說(shuō)請(qǐng)求返回的Response
response.body()!!.string()//字符串,json等
response.body()!!.bytes()//Btimap等
response.body()!!.byteStream()//IO流,文件等
response.header("key")//獲取相應(yīng)頭文件
其中response.body()!!.string()只能調(diào)用一次,第二次調(diào)用的時(shí)候返回值為null。這是因?yàn)閞esponse.body()!!.string()實(shí)質(zhì)上是輸入流獲取數(shù)據(jù),這是需要服務(wù)器有了輸出才能獲取的。服務(wù)器只做了一次輸出,所以response.body()!!.string()也只能第一次調(diào)用獲取數(shù)據(jù)。因?yàn)閞esponse.body()!!.string()實(shí)質(zhì)上是輸入流,所以也要放在子線程中操作。
關(guān)于Okhttp的簡(jiǎn)單用法到這里就告一段落了,有錯(cuò)誤的地方請(qǐng)大家指出來(lái),我們可以多多交流。