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 示例的更多相关文章

  1. retrofit2 okhttp3 RxJava butterknife 示例

    eclipse的jar包配置 eclipse中貌似用不了butterknife buildToolsVersion "23.0.2" defaultConfig { applica ...

  2. 002-06-RestTemplate-请求示例-form、json、multipart、okhttp3

    一.概述 请求示例集合 服务端:https://github.com/bjlhx15/common-study.git 中的 http-client-webserver 服务端:RequestBody ...

  3. OkHttp3源码详解(一) Request类

    每一次网络请求都是一个Request,Request是对url,method,header,body的封装,也是对Http协议中请求行,请求头,实体内容的封装 public final class R ...

  4. okhttp3.4.1+retrofit2.1.0实现离线缓存

    关于Retrofit+OkHttp的强大这里就不多说了,还没了解的同学可以自行去百度.这篇文章主要讲如何利用Retrofit+OkHttp来实现一个较为简单的缓存策略:即有网环境下我们请求数据时,如果 ...

  5. Okhttp【简介】应用 示例

    资源 GitHub:https://github.com/square/okhttp 官网     文档     API  You'll also need Okio[https://github.c ...

  6. retrofit okhttp RxJava bk Gson Lambda 综合示例【配置】

    项目地址:https://github.com/baiqiantao/retrofit2_okhttp3_RxJava_butterknife.git <uses-permission andr ...

  7. 深入解析OkHttp3

    OkHttp是一个精巧的网络请求库,有如下特性: 
1)支持http2,对一台机器的所有请求共享同一个socket 
2)内置连接池,支持连接复用,减少延迟 
3)支持透明的gzip压缩响应体 
4) ...

  8. Java 调用http接口(基于OkHttp的Http工具类方法示例)

    目录 Java 调用http接口(基于OkHttp的Http工具类方法示例) OkHttp3 MAVEN依赖 Http get操作示例 Http Post操作示例 Http 超时控制 工具类示例 Ja ...

  9. Spring Cloud Feign 总结问题,注意点,性能调优,切换okhttp3

    ### Feign常见问题总结 **FeignClient接口如使用`@PathVariable` ,必须指定value属性** ```java //在一些早期版本中, @PathVariable(& ...

随机推荐

  1. GPS坐标显示在百度地图上(Qt+百度地图)

    Qt在5.6以后的版本就不支持webview控件了,这里我用的是Qt5.4的版本,里面还有这个控件: 下面简单介绍下Qt与html中的javascript调用交互过程: 一.整体实现介绍 在html中 ...

  2. spring boot项目集成zuul网关

    1 zuul简介 Zuul 的官方介绍是 “Zuul is the front door for all requests from devices and web sites to the back ...

  3. JS 窗口加载与定时器笔记

    bom浏览器对象模型     bom由一系列相关的对象构成并且每个对象都提供了很多方法属性     bom顶级对象是window     bom是浏览器产商在各自浏览器上定义的,兼容性差     wi ...

  4. JS 模仿京东键盘输入内容

    css代码 .search { width: 300px; height: 80px; margin: 0 auto; position: relative; } .con { display: no ...

  5. java 启动Tomcat报错:The specified JRE installation does not exist

    启动TomCat服务报错: The specified JRE installation does not exist 解决方法: Eclipse:window->perferences-> ...

  6. java 的API及Object类

    一 Java的API Java 的API(API: Application(应用) Programming(程序) Interface(接口)) Java API就是JDK中提供给我们使用的类,这些类 ...

  7. QT QJson与QByteArray的转化

    目录 QJsonObject转为QByteArray QByteArray转为QJsonObject 可以将QJsonObject与QByteArray互相转化,以便网络编程时客户端与服务器之间的通信 ...

  8. troubleshoot之:分析OutOfMemoryError异常

    目录 简介 OutOfMemoryError java.lang.OutOfMemoryError: Java heap space java.lang.OutOfMemoryError: GC Ov ...

  9. 【Codeforces】CF Round #592 (Div. 2) - 题解

    Problem - A Tomorrow is a difficult day for Polycarp: he has to attend \(a\) lectures and \(b\) prac ...

  10. Elasticsearch聚合语句

    聚合的范围是search query过滤出的数据 四种聚合类型: 一.Bucketing 桶聚合,常规的分类然后计算每个分类的文档数量 二.Metric 分类并对一组文档进行sum.avg等数学运算 ...