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(& ...
随机推荐
- Linux入门-程序开发
Linux程序开发 linux程序总体上来说是分两部分的: 1. 底层驱动程序开发: 2.应用层应用程序开发: 驱动程序 一般情况下驱动是跟内核与硬件有关系的,编程语言是C语言,需要懂一些硬件的知识, ...
- ES集群部署
1.环境准备 主机名 IP地址 CPU 内存 硬盘 gztxy-prd-es01 192.168.1.11 8 16 200 gztxy-prd-es01 192.168.1.12 8 16 200 ...
- ~/.ssh/目录找不到解决方法
执行 cd ~/.ssh发现.ssh目录找不到 原因是因为没有用root用户ssh登录过,执行一下ssh操作就会自动生成了
- 文章要保存为TXT文件,其中的图片要怎么办?Python帮你解决
前言 用 python 爬取你喜欢的 CSDN 的原创文章,保存为TXT文件,不仅查看不方便,而且还无法保存文章中的代码和图片. 今天教你制作成 PDF 慢慢看.万一作者的突然把号给删了,也会保存备份 ...
- 漏洞重温之XSS(下)
XSS总结 XSS的可利用方式 1.在登录后才可以访问的页面插入xss代码,诱惑用户访问,便可直接偷取用户cookie,达到窃取用户身份信息的目的. 2.修改昵称,或个人身份信息.如果别的用户在登录状 ...
- 图的DFS和BFS(邻接表)
用C++实现图的DFS和BFS(邻接表) 概述 图的储存方式有邻接矩阵和邻接表储存两种.由于邻接表的实现需要用到抽象数据结构里的链表,故稍微麻烦一些.C++自带的STL可以方便的实现List,使算 ...
- Mac 从睡眠恢复后没有声音的问题
重启能解决,不想重启,因为不想重置当前工作状态 换个办法是: 杀掉coreaudiod进程,然后系统会把他自动拉起,然后就ok了.
- 浏览器自动化的一些体会8 HttpWebRequest的几个问题
前面说过了,httpWebRequest的好处在于轻量,不需要界面,缺点在于无法执行javascript.这里再归纳一些问题. 1. 设置代理 1) httpWebRequest不支持https的代理 ...
- three.js 利用uv和ThreeBSP制作一个快递柜
最近有three网友,问我要不要学习blender,其实我感觉学习一下也无妨,不过花大量时间精通,尚可不必,术业有专攻给别人留一条路吧,哈哈.那我我们就是用ThreeBSP和uv贴图的知识来制作一个定 ...
- angular schametics 使用记录
什么是 schametics Schematics是Angular团队发布的一个代码生成工具.它提供了API,可以操作文件并在Angular项目中添加新的依赖项,ng cli 创建模板就是用它. 它也 ...