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(& ...
 
随机推荐
- 【NOI2010】超级钢琴 题解(贪心+堆+ST表)
			
题目链接 题目大意:求序列内长度在$[L,R]$范围内前$k$大子序列之和. ---------------------- 考略每个左端点$i$,合法的区间右端点在$[i+L,i+R]$内. 不妨暴力 ...
 - "点"醒自己
			
回顾: 过去的经历 从18年开始在某机构进行了测试培训,9月正式加入测试小白大军,中间也经历了半年的空窗期,入职2个月应能力不够被公司辞退,后通过培训班的朋友内推到一家软件外包公司,工作到现在. 思考 ...
 - 《JavaScript语言入门教程》记录整理:运算符、语法和标准库
			
目录 运算符 算数运算符 比较运算符 布尔运算符 二进制位运算符 void和逗号运算符 运算顺序 语法 数据类型的转换 错误处理机制 编程风格 console对象和控制台 标准库 Object对象 属 ...
 - hashCode竟然不是根据对象内存地址生成的?还对内存泄漏与偏向锁有影响?
			
起因 起因是群里的一位童鞋突然问了这么问题: 如果重写 equals 不重写 hashcode 会有什么影响? 这个问题从上午10:45 开始陆续讨论,到下午15:39 接近尾声 (忽略这形同虚设的马 ...
 - Python初学者的自我修养,找到自己的方向
			
今天是 Python专题 的第22篇文章,原本今天是准备和大家继续Python当中多线程的使用的相关内容.然而前两天有一个读者在后台问我,学习Python有哪些适合新手入门的小项目推荐,所以今天这篇临 ...
 - 15、Facade 外观模式
			
什么是Facade模式 随着系统越来越复杂,我们需要把细节隐藏起来,给客户端提供一个统一的接口.在这种需求下facade模式诞生了.该模式比较简单,我们只需要在系统变得复杂把它运用上来,这样底层跟客户 ...
 - C++ 的字符串反转
			
C++ 的字符串反转 方法一: 使用 algorithm 中的 reverse 函数: // reverse 函数的定义(在 std 名称空间中) template<class BidirIt& ...
 - DB2 SQLCODE=-206, SQLSTATE=42703 定义表字段问题
			
>[错误] 脚本行:1-1 --------------------------------------- "STATUS" is not valid in the cont ...
 - neo4j批量导入数据的两种解决方案
			
neo4j批量导入数据有两种方法,第一种是使用cypher语法中的LOAD CSV,第二种是使用neo4j自带的工具neo4j-admin import. LOAD CSV 导入的文件必须是csv文件 ...
 - 【HAOI2015】树上染色 - 树形 DP
			
题目描述 有一棵点数为 N 的树,树边有边权.给你一个在 0~ N 之内的正整数 K ,你要在这棵树中选择 K个点,将其染成黑色,并将其他 的N-K个点染成白色 . 将所有点染色后,你会获得黑点两两之 ...