简单聊聊Okhttp基本用法

前言:

Android开发中网络开发是一个很重要的模块,基本上所有的APP也都用到了这个模块。从最开始自己实现网络模块到后来使用Google提供的网络框架Volley,再到现在很流行的Okhttp和Retrofit。实现网络模块也变得越来越简单,框架帮我们做的也越来越多。我们就从Okhttp开始,来简单聊聊。

Okhttp大家肯定都不会陌生,没吃过猪头也见过猪跑对吧。

聊Okhttp的时候就不得不提到Square,这家公司是美国一家移动支付公司。这家公司在第三方框架方面也有很多不错的作品,比如Okhttp,Retrofit和Picasso都是出自这家公司。

Okhttp git地址


废话不多说,下面直接上代码。

首先需要在build.gradle中加入

implementation'com.squareup.okhttp3:okhttp:3.12.1'

一、get方法

Okhttp为我们提供了同步和异步两种执行方法

同步:

val okHttpClient = OkHttpClient()

val call = Request

.Builder()

.url("请求地址")

.build()

val newCall = okHttpClient.newCall(call)

Thread(Runnable {

    try {

val response: Response = newCall.execute()

val body = response.body()

if (response.code() ==200 && body !=null) {

Log.d("Test",body.string())

}else {

Log.d("Test","请求失败")

}

}catch (e: Exception) {

Log.d("Test","报错了:${e.message}")

}

}).start()

同步的时候如果请求过程中报错,是没有Error返回的,需要自己try/catch来捕获异常,因为代码不难,这里就不具体说明了。注:response.code()所返回的参数不是服务器返回的,是框架自己返回的。

异步:

val okHttpClient = OkHttpClient()

val call = Request

.Builder()

.url("请求地址")

.build()

val newCall = okHttpClient.newCall(call)

newCall.enqueue(object : Callback {

override fun onFailure(call: Call, e: IOException) {

Log.d("Test","请求报错: ${e.message}")

}

override fun onResponse(call: Call, response: Response) {

val body = response.body()

if (response.code() ==200 && body !=null) {

Log.d("Test",body.string())

}else {

Log.d("Test","请求失败")

}

}

})

异步newCall 调用的是enqueue而不是execute,传入了一个接口来接收返回数据。这里需要注意的是onFailure和onResponse是在子线程中而不是主线程。Okhttp的异步其实也是在内部使用线程来实现的。


二、Post方法

Post方法在调用上和get方法没有太大区别,它需要多调用一个post方法。

post方法

在post方法中,我们会传入RequestBody这个对象。那么我们看看这个对象。


RequestBody

我们可以看到这个对象可以用自带的create方法来new一个对象然后传入。我们进入RequestBody看看他的源码。


RequestBody源码

我们可以发现它是一个abstract类,并且有FormBody和MultipartBody两个实现类。以下我们将展示这三个类的具体用法。

1.RquestBody:

create方法

在调用RequestBody的create方法的时候需要传入一个MediaType。这里的MediaType是用来描述HTTP请求或响应体的内容类型。常见的媒体格式类型有:

text/html:HTML格式

text/pain:纯文本格式

image/jpeg:jpg图片格式

application/json:JSON数据格式

application/octet-stream:二进制流数据(如文件下载)

application/x-www-form-urlencoded:form表单encType属性的默认格式,表单数据将以key/value的形式发送到服务端

multipart/form-data:表单上传文件的格式

val okHttpClient = OkHttpClient()

val mediaType = MediaType.parse("application/json; charset=utf-8")

val json = JSONObject()

json.put("key","content")

val requestBody = RequestBody.create(mediaType, json.toString())

val request = Request

.Builder()

.url("请求地址")

.post(requestBody)

.build()

val newCall = okHttpClient.newCall(request)

newCall.enqueue(object : Callback {

override fun onFailure(call: Call, e: IOException) {

Log.d("Test","请求报错: ${e.message}")

}

override fun onResponse(call: Call, response: Response) {

val body = response.body()

if (response.code() ==200 && body !=null) {

Log.d("Test",body.string())

}else {

Log.d("Test","请求失败")

}

}

})

Post这里用的是异步请求的方法,同步的方法和get的同步方法一样。这里的post()方法如果没有调用,则默认是使用get去请求。这里上传的数据为json,大家可以根据自己需求去改变MediaType。

2.FormBody

FormBody一般用户表单请求。

val okHttpClient = OkHttpClient()

val requestBody = FormBody

.Builder()

.add("key","content")

.build()

val request = Request

.Builder()

.url("请求地址")

.post(requestBody)

.build()

val newCall = okHttpClient.newCall(request)

newCall.enqueue(object : Callback {

override fun onFailure(call: Call, e: IOException) {

Log.d("Test","请求报错: ${e.message}")

}

override fun onResponse(call: Call, response: Response) {

val body = response.body()

if (response.code() ==200 && body !=null) {

Log.d("Test",body.string())

}else {

Log.d("Test","请求失败")

}

}

})

FormBody的用法和RequestBody的用法差不多,这里就不过多描述了。

3.MultipartBody

MultipartBody可以同时上传多种类型的数据。

val okHttpClient = OkHttpClient()

val file = File("文件地址")

val mediaType = MediaType.parse("application/octet-stream")

val fileBody = RequestBody.create(mediaType, file)

val requestBody = MultipartBody

.Builder()

.setType(MultipartBody.FORM)

.addFormDataPart("key","content")

.addFormDataPart("key", file.name, fileBody)

.build()

val request = Request

.Builder()

.url("请求地址")

.post(requestBody)

.build()

val newCall = okHttpClient.newCall(request)

newCall.enqueue(object : Callback {

override fun onFailure(call: Call, e: IOException) {

Log.d("Test","请求报错: ${e.message}")

}

override fun onResponse(call: Call, response: Response) {

val body = response.body()

if (response.code() ==200 && body !=null) {

Log.d("Test",body.string())

}else {

Log.d("Test","请求失败")

}

}

})

上面的代码难度不大,大家应该都能看懂,MultipartBody某种意义上更像RequestBody和FormBody的结合。到这里Post的方法也讲得差不多了。


这是我第一次写文章,肯定有很多不完善的地方,希望大家提出来,以后改进!!!

最后要过年了,祝大家新年快乐,越来越有钱!!!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容