okhttp3 示例
1.GET请求
private fun httpGetDemo() {
//1.请求参数
val url = httpHost + "/api/test?arg1=xxx"
//2.构造 OkHttpClient : 设置连接超时、读取超时、写出超时、cookie等
var okhttp3 = OkHttpClient.Builder()
.retryOnConnectionFailure(true) //失败重连
.connectTimeout(connectTimeout, TimeUnit.SECONDS) //设置连接超时时间
.readTimeout(readTimeout, TimeUnit.SECONDS) //设置读取超时时间
.writeTimeout(writeTimeout,TimeUnit.SECONDS) //设置写出超时时间
.cookieJar(cookieJar) //设置cookie
.build()
//3.构造 Request ,设置请求方法,请求头参数
var rb = Request.Builder()
.url(url) //指定请求地址
.get() //指定请求的方法
//设置header的3种方法:
//a, 添加 key - value
rb.addHeader("header1","value1") //添加自定义的header1
rb.addHeader("header2","value2") //添加自定义的header2
//b, 按key修改value
rb.header("Cookie","df") //指定某个header的值
//c,完全替换headers,注意它会把Request.Builder里设置的都删除,然后按自己添加的key-value重新设置当前builder的headers
var hb = Headers.Builder()
hb.add("header1","value1")
hb.add("header2","value2")
var headers = hb.build()
rb.headers(headers) //指定headers
var request = rb.build()
//4.发起请求
okhttp3.newCall(request).enqueue(object : Callback {
override fun onFailure(call: Call, e: IOException) {
//5.处理请求失败
Log.e("DailyFrgmt","rollOverData onFailure error = " + e.message)
activity?.runOnUiThread {
Toast.makeText(getContext(),"查询翻身数据失败",Toast.LENGTH_SHORT).show()
}
}
override fun onResponse(call: Call, response: Response) {
//6.请求成功
var json = ""
//6.1 从response里可取得cookie
var url = request.url
var headers = response.headers
var cookies = Cookie.parseAll(url,headers)
for (cookie in cookies){
Log.e("Cookies ", "cookie : name = " + cookie.name + " value = " + cookie.value)
}
//6.2 得到2进制流,一般下载用,保存成文件。
var stream = response.body?.byteStream()
var br = BufferedInputStream(stream)
var len =
var buf = ByteArray( * )
do {
len = br.read(buf)
if (len > ){
json += String(buf,,len)
}
}while (len != -)
Log.e("DailyFrgmt","rollOverData onResponse = " + json)
if (LogUtil.TO_FILE){
try {
var js = context?.getExternalFilesDir("")?.absolutePath.toString() + "/rollover.json"
var fw = FileWriter(js)
fw.write(json)
fw.close()
}catch (e : java.lang.Exception){
e.printStackTrace()
Log.e("DailyFrgmt","exception = " + e.message)
}
}
//7.业务方法
}
})
}
2.POST请求
fun login( uname : String,pwd : String,failed : (reason : String?) -> Unit,succeed : () -> Unit){
val url = httpHost + "/api/login/"
//1.构造post的json
var jsObj = JSONObject()
jsObj.put("userName",uname)
jsObj.put("password", Encrypt.md5(pwd))
var body = RequestBody.create("application/json; charset=utf-8".toMediaType(), jsObj.toString())
//2.构造 OkHttpClient
var okhttp3 = OkHttpClient.Builder()
.retryOnConnectionFailure(true) //失败重连
.connectTimeout(connectTimeout, TimeUnit.SECONDS) //设置连接超时时间
.readTimeout(readTimeout, TimeUnit.SECONDS) //设置读取超时时间
.writeTimeout(writeTimeout,TimeUnit.SECONDS)
.cookieJar(cookieJar) //设置cookie
.build()
//3.构造post请求
var rb = Request.Builder()
.url(url)
.post(body)
//设置header的3种方法:
//a, 添加 key - value
rb.addHeader("header1","value1") //添加自定义的header1
rb.addHeader("header2","value2") //添加自定义的header2
//b, 按key修改value
rb.header("Cookie","df") //指定某个header的值
//c,完全替换headers,注意它会把Request.Builder里设置的都删除,然后按自己添加的key-value重新设置当前builder的headers
var hb = Headers.Builder()
hb.add("header1","value1")
hb.add("header2","value2")
var headers = hb.build()
rb.headers(headers) //指定headers
var request = rb.build()
//4.发送请求
okhttp3.newCall(request).enqueue(object : Callback{
override fun onFailure(call: Call, e: IOException) {
//5.处理失败
Log.e("Login","error = " + e.message)
failed("请求失败")
}
override fun onResponse(call: Call, response: Response) {
//6.请求成功
var json = ""
//6.1 从response里可取得cookie
var url = request.url
var headers = response.headers
var cookies = Cookie.parseAll(url,headers)
for (cookie in cookies){
Log.e("Cookies ", "cookie : name = " + cookie.name + " value = " + cookie.value)
}
//6.2 得到2进制流,一般下载用,保存成文件。
var stream = response.body?.byteStream()
var br = BufferedInputStream(stream)
var len =
var buf = ByteArray( * )
do {
len = br.read(buf)
if (len > ){
json += String(buf,,len)
}
}while (len != -)
//7.业务方法
onSomeFunction(json)
}
})
}
3.关于Cookie
3.1 解析cookie
//4.发送请求
okhttp3.newCall(request).enqueue(object : Callback{
override fun onFailure(call: Call, e: IOException) {
//5.处理失败
Log.e("Login","error = " + e.message)
failed("请求失败")
}
override fun onResponse(call: Call, response: Response) {
//6.请求成功
var json = ""
//6.1 从response里可取得cookie
var url = request.url
var headers = response.headers
var cookies = Cookie.parseAll(url,headers)
for (cookie in cookies){
Log.e("Cookies ", "cookie : name = " + cookie.name + " value = " + cookie.value)
}
...
}
})
3.2 使用CookieJar操作cookie(保存、上报、共享)
var cm = HashMap<String,List<Cookie> >()
var cookieJar = object : CookieJar{
override fun loadForRequest(url: HttpUrl): List<Cookie> {
var cookies = java.util.ArrayList<Cookie>()
var cks = cm.get(url.host)
if (cks != null){
cookies.addAll(cks)
}
for(cookie in cookies){
Log.i("cookieJar","loadForRequest cookie = ${cookie}")
}
return cookies
} override fun saveFromResponse(url: HttpUrl, cookies: List<Cookie>) {
cm.put(url.host,cookies)
}
} private fun testCookie() {
//1.请求参数
val url = httpHost + "/api/test?arg1=xxx" //2.构造 OkHttpClient : 设置连接超时、读取超时、写出超时、cookie等
var okhttp3 = OkHttpClient.Builder()
.retryOnConnectionFailure(true) //失败重连
.connectTimeout(connectTimeout, TimeUnit.SECONDS) //设置连接超时时间
.readTimeout(readTimeout, TimeUnit.SECONDS) //设置读取超时时间
.writeTimeout(writeTimeout,TimeUnit.SECONDS) //设置写出超时时间
.cookieJar(cookieJar) //设置cookie处理对象
.build() ...
}
- loadForRequest 是请求时加载本地cookie 的调用
- saveFromResponse 是保存cookie时的调用
- 每个 OkHttpClient 可以指定一个 cookie处理对象,一般一个url可返回一个cookie,同一个主机所有子url可以使用相同的CookieJar对象。
okhttp3 示例的更多相关文章
- retrofit2 okhttp3 RxJava butterknife 示例
eclipse的jar包配置 eclipse中貌似用不了butterknife buildToolsVersion "23.0.2" defaultConfig { applica ...
- 002-06-RestTemplate-请求示例-form、json、multipart、okhttp3
一.概述 请求示例集合 服务端:https://github.com/bjlhx15/common-study.git 中的 http-client-webserver 服务端:RequestBody ...
- OkHttp3源码详解(一) Request类
每一次网络请求都是一个Request,Request是对url,method,header,body的封装,也是对Http协议中请求行,请求头,实体内容的封装 public final class R ...
- okhttp3.4.1+retrofit2.1.0实现离线缓存
关于Retrofit+OkHttp的强大这里就不多说了,还没了解的同学可以自行去百度.这篇文章主要讲如何利用Retrofit+OkHttp来实现一个较为简单的缓存策略:即有网环境下我们请求数据时,如果 ...
- Okhttp【简介】应用 示例
资源 GitHub:https://github.com/square/okhttp 官网 文档 API You'll also need Okio[https://github.c ...
- retrofit okhttp RxJava bk Gson Lambda 综合示例【配置】
项目地址:https://github.com/baiqiantao/retrofit2_okhttp3_RxJava_butterknife.git <uses-permission andr ...
- 深入解析OkHttp3
OkHttp是一个精巧的网络请求库,有如下特性: 1)支持http2,对一台机器的所有请求共享同一个socket 2)内置连接池,支持连接复用,减少延迟 3)支持透明的gzip压缩响应体 4) ...
- Java 调用http接口(基于OkHttp的Http工具类方法示例)
目录 Java 调用http接口(基于OkHttp的Http工具类方法示例) OkHttp3 MAVEN依赖 Http get操作示例 Http Post操作示例 Http 超时控制 工具类示例 Ja ...
- Spring Cloud Feign 总结问题,注意点,性能调优,切换okhttp3
### Feign常见问题总结 **FeignClient接口如使用`@PathVariable` ,必须指定value属性** ```java //在一些早期版本中, @PathVariable(& ...
随机推荐
- Neo4j 的使用说明(二)
上一篇: https://www.cnblogs.com/infoo/p/9840965.html 阅读量挺多的,因此继续写一下(二) 在上一篇说到:(版本依然基于V3.4.9) 如果为了方便更改d ...
- Pytest单元测试框架-学习
pytest: Python的一个单元测试框架,基于UnitTest二次开发,语法上更加简洁,可以用来做Python开发项目的单元测试,UI自动化.接口自动化测试等,有很多的插件访问Pytest插件汇 ...
- 618购物节要到了,Python帮你实现商品有货的微信提醒
时间过的真快,不知不觉一年已过了一半,又快到618购物狂欢节了,剁手党们都希望无论是618购物节还是双11购物节,都能够买到便宜又实惠的商品,但是真心实惠的东西往往是紧俏的,经常会出现无货的情况,我们 ...
- 怎么将PPT文件上传到微信公众号上?
我们都知道创建一个微信公众号,在公众号中发布一些文章是非常简单的,但公众号添加附件下载的功能却被限制,如今可以使用小程序“微附件”进行在公众号中添加附件. 以下是公众号添加附件使用“微附件”小程序的教 ...
- Linux安装配置PHPmyadmin
进官网下载zip安装包 wget https://files.phpmyadmin.net/phpMyAdmin/5.0.1/phpMyAdmin-5.0.1-all-languages.zip 安装 ...
- Vue + ccropper.js裁切图片(vue-cropper)
按原比例裁剪图片并且不失真. 安装: cnpm install vue-cropper --save-dev 使用: <template> <div style="disp ...
- 深度强化学习:Deep Q-Learning
在前两篇文章强化学习基础:基本概念和动态规划和强化学习基础:蒙特卡罗和时序差分中介绍的强化学习的三种经典方法(动态规划.蒙特卡罗以及时序差分)适用于有限的状态集合$\mathcal{S}$,以时序差分 ...
- JS实例-DOM查询
<!DOCTYPE html><html lang="en"><head> <meta charset="utf-8" ...
- markdown基础使用技巧
markdown基础使用技巧 通过``创建代码形式,不同形式可以叠加(比如:斜体+加粗) 块级元素 通过return/Enter实现切换段落/创建段落 通过shift+return/enter 实现换 ...
- Golang笔记整理--第二天
一. 标识符 Go语言标识符构成规则:开头第一个字符必须是字母或者是下划线,后面可以跟任意多个字符,数子或者下划线,并且区分大小写. 例: _aa11 //合法标识符 aa11 //合法标识符 _aa ...