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对象。

Android网络连接判断与检测的更多相关文章

  1. Android 网络连接判断与处理

    Android网络连接判断与处理  获取网络信息需要在AndroidManifest.xml文件中加入相应的权限. <uses-permission android:name="and ...

  2. android 网络连接判断

    Android 网络判断类,用来判断网络状态 使用方法: (1)先初始化 //初始化网络状态检测类 NetworkStateManager.instance().init(this); (2)判断是否 ...

  3. Android网络连接判断与处理

    博客分类: Android 获取网络信息需要在AndroidManifest.xml文件中加入相应的权限. <uses-permission android:name="android ...

  4. Android网络类型判断(2g、3g、wifi)

    判断网络类型是wifi,还是3G,还是2G网络,对不同 的网络进行不同的处理,现将判断方法整理给大家,以供参考   说明:下面用到的数据移动2G,联通2G,联通3G,wifi我都已经测试过,暂时手上 ...

  5. 怎样检查Android网络连接状态

    在发送任何HTTP请求前最好检查下网络连接状态,这样可以避免异常.这个教程将会介绍怎样在你的应用中检测网络连接状态. 创建新的项目 1.在Eclipse IDE中创建一个新的项目并把填入必须的信息.  ...

  6. WebView 的使用----android 网络连接处理分析

    在Android中,可以有多种方式来实现网络编程: 创建URL,并使用URLConnection/HttpURLConnection 使用HttpClient 使用WebView 创建URL,并使用U ...

  7. Android 网络连接状态的监控

    有些应用需要连接网络,例如更新后台服务,刷新数据等,最通常的做法是定期联网,直接使用网上资源.缓存数据或执行一个下载任务来更新数据. 但是如果终端设备没有连接网络,或者网速较慢,就没必要执行这些任务. ...

  8. Android网络连接监听

    接收系统网络服务的广播接收者 public class NetStateReceiver extends BroadcastReceiver { private Handler handler; pu ...

  9. Android网络连接之HttpURLConnection和HttpClient

    1.概念   HTTP 协议可能是现在 Internet 上使用得最多.最重要的协议了,越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源.在 JDK 的 java.net 包中 ...

随机推荐

  1. Android c/c++ 应用向linux 平台迁移执行

    鉴于近期在minicamera (linux + FPGA) 平台上模拟 安卓系统camera流程遭遇不断升级同步的困扰.尤其是 不开放源代码后 , 应用要链接封闭动态库造成的困难.以及在sprdis ...

  2. 火狐浏览器Firefox 如何使用iMacros 自动填写网页表单

    1 我们首先访问一个想要自动填写表单的网站.我们以百度为例,右侧有登录窗口.   2 然后我们点开刚安装上的iMacros插件,一般安装之后就会自动出现在浏览器的某个地方,点击记录选项卡,再点击记录. ...

  3. centos中w使用smbclient连接window出现:session setup failed: NT_STATUS_LOGON_FAILURE

    1. 在window中网络->我自己的电脑->能够查看到共享文件,说明window的共享是正常了; 2. 在window中配置共享时,使用的是仅仅同意超级管理员訪问,可是我把超级管理员改名 ...

  4. 一起talk C栗子吧(第一百二十一回:C语言实例--线程知识体系图)

    各位看官们.大家好,上一回中咱们说的线程属性的样例.这一回咱们说的样例是:线程知识体系图.闲话休提.言归正转. 让我们一起talk C栗子吧! 我们在前面的章回中介绍了与线程相关的知识,在今天的章回中 ...

  5. android 浮动窗体学习笔记及个人理解(仿360手机助手)

    很感谢原文作者 http://blog.csdn.net/guolin_blog/article/details/8689140 经自己理解 程序执行界面例如以下图: 1.程序入口界面 2.小浮动窗体 ...

  6. KindEditor使用过程中,用JQ提交表单时,获取不到编辑器的内容

    首先要说明的是.在使用提交button直接提交时.编辑器的内容是能够正常获取的,而使用 jq或js ,如$("#form").submit(),提交时,则编辑器的内容是无法获取的. ...

  7. JavaScript基本类型与引用类型

    前面已经说过,JavaScript变量是松散类型,它可以保存任何类型的值.变量的值以及数据类型可以在脚本的生命周期内发生改变.变量包含两种不同类型的值:基本类型和引用类型.基本类型值的是简单的数据段, ...

  8. grails Domian对象转JSON去class以及自己定义字段的最佳方式

    grails:2.4.x IDE:Intellij IDEA 13.x grails的Domain对象之间假设存在环形引用.直接使用as JSON仅仅会输出关联对象的id.而且假设使用deep也会报错 ...

  9. ToolBar修改返回按钮图标

    使用Toolbar时,有时因为不同的手机设备,不能使用系统默认的主题样式或者图标,必须指定特定的资源,防止APP在不同设备上的效果不一样! 我在使用Toolbar时,把这个布局作为一个公共的了,所以修 ...

  10. 使用Kotlin如何startActivity

    没错,就是这么简单的一个功能,不过由于初学kotlin,所以找了很久才找到如何写,所以还是贴出来给需要的人吧,上代码: startActivity(Intent(MainActivity@this, ...