Kotlin HttpURLConnection与服务器交互实现方法详解
作者:ui不是我画的 发布时间:2022-11-22 02:12:00
1.查询(get)-调用的时候记得开线程
GET一般用于获取/查询资源信息
val sb = StringBuffer()
try {
val url = URL(url)
val conn = url.openConnection() as HttpURLConnection
conn.requestMethod = "GET"
conn.connectTimeout = 5000
val code = conn.responseCode
if (code == 200) {
val `is` = conn.inputStream
val b = ByteArray(1024)
var len: Int
while (`is`.read(b).also { len = it } != -1) {
sb.append(String(b, 0, len, Charset.forName("UTF-8")))
}
`is`.close()
conn.disconnect()
Log.e("TAG","sb==${sb.toString()}")
} else {
Log.e("TAG","code==${code.toString()}")
}
} catch (var1: Exception) {
Log.e("TAG","Exception==${var1.message}")
}
2.改(post)
post向指定资源提交数据进行处理请求(提交表单、上传文件),又可能导致新的资源的建立或原有资源的修改。
val sb = StringBuffer()
object : Thread() {
override fun run() {
super.run()
try {
val url = URL(urlPath)
val conn = url.openConnection() as HttpURLConnection
conn.doOutput = true
conn.requestMethod = "POST"
conn.connectTimeout = 5000
conn.doInput = true
conn.useCaches = false
conn.setRequestProperty("Connection", "Keep-Alive")
conn.setRequestProperty("Charset", "UTF-8")
conn.setRequestProperty("Content-Type", "application/json; charset=UTF-8")
conn.setRequestProperty("accept", "application/json")
conn.setRequestProperty("appid", mAPP_ID)
conn.setRequestProperty("ts", time)
conn.setRequestProperty("sign", sign)
Log.e(TAG, "Json:$Json")
if (Json != null && !TextUtils.isEmpty(Json)) {
val writebytes = Json.toByteArray()
conn.setRequestProperty("Content-Length", writebytes.size.toString())
val outwritestream = conn.outputStream
outwritestream.write(Json.toByteArray())
outwritestream.flush()
outwritestream.close()
}
val code = conn.responseCode
if (code == 200) {
val `is` = conn.inputStream
val b = ByteArray(1024)
var len: Int
while (`is`.read(b).also { len = it } != -1) {
sb.append(String(b, 0, len, Charset.forName("UTF-8")))
}
`is`.close()
conn.disconnect()
Log.w(TAG, "TXPost sb====$sb")
} else {
Log.w(TAG, "TXPost code====$code")
}
} catch (var1: Exception) {
Log.w(TAG, "TXPost Exception====$var1")
}
}
}.start()
设置请求头:
1.基本headers 这四句一般没有特殊需求的话,都是需要的
conn.setRequestProperty("Connection", "Keep-Alive")
conn.setRequestProperty("Charset", "UTF-8")
conn.setRequestProperty("Content-Type", "application/json; charset=UTF-8")
conn.setRequestProperty("accept", "application/json")
2.特殊headers 这些是客户端与服务通信服务器所需的headers
conn.setRequestProperty("appid", mAPP_ID)
conn.setRequestProperty("ts", time)
conn.setRequestProperty("sign", sign)
Headers:
HTTP是“Hypertext Transfer Protocol”的所写,整个万维网都在使用这种协议,几乎你在浏览器里看到的大部分内容都是通过http协议来传输的.
HTTP Headers是HTTP请求和相应的核心,它承载了关于客户端浏览器,请求页面,服务器等相关的信息.
设置body(请求内容)
if (Json != null && !TextUtils.isEmpty(Json)) {
val writebytes = Json.toByteArray()
conn.setRequestProperty("Content-Length", writebytes.size.toString())
val outwritestream = conn.outputStream
outwritestream.write(Json.toByteArray())
outwritestream.flush()
outwritestream.close()
}
有时候开发的时候你能看到一个名叫token的东西,这个玩意是后台自定义的东西,有时候可以放在请求头,有时候可以放在body里面,具体可以看协议
3.增(PUT)
PUT:这个方法比较少见。HTML表单也不支持这个。本质上来讲, PUT和POST极为相似,都是向服务器发送数据,但它们之间有一个重要区别,PUT通常指定了资源的存放位置,而POST则没有,POST的数据存放位置由服务器自己决定。
val url = URL(urlPath)
val connection = url.openConnection() as HttpURLConnection
val outputStream = connection.outputStream
val inputStream = FileInputStream(file)
object : Thread() {
override fun run() {
super.run()
try {
connection.doOutput = true
connection.useCaches = false
connection.setRequestProperty("Accept-Charset", "utf-8")
connection.setRequestProperty("Connection", "keep-alive")
connection.setRequestProperty(
"Content-Type",
"multipart/form-data;boundary=fengexian===="
)
connection.setRequestProperty("Accept", "application/json")
connection.connect()
val bytes = ByteArray(
getFileOrFilesSize(file.absolutePath).toInt()
)
var length: Int
while (inputStream.read(bytes).also { length = it } != -1) {
outputStream.write(bytes, 0, length)
}
outputStream.flush()
val response = connection.inputStream
val reader = InputStreamReader(response)
while (reader.read() != -1) {
String(bytes, Charset.forName("UTF-8"))
}
if (connection.responseCode == 200) {
Log.w("TAG", "connection===${connection.responseMessage}")
} else {
Log.w("TAG", "responseCode===${connection.responseCode}")
}
} catch (var13: IOException) {
Log.w("TAG", "IOException===${var13.message}")
} finally {
try {
outputStream.close()
inputStream.close()
connection.disconnect()
} catch (var12: IOException) {
var12.printStackTrace()
}
}
}
}.start()
4.删(DELETE请求)
DELETE:删除某一个资源。基本上这个也很少见,我只在像亚马逊s3之类的服务器见过!
val sb = StringBuffer()
var uri: URL? = null
var con: HttpURLConnection? = null
try {
uri = URL(url)
con = uri.openConnection() as HttpURLConnection
con.requestMethod = "DELETE"
con.doOutput = true
con.doInput = true
con.connectTimeout = 60000 //60 secs
con.readTimeout = 60000 //60 secs
val code = con.responseCode
if (code == 200) {
val `is` = con.inputStream
val b = ByteArray(1024)
var len: Int
while (`is`.read(b).also { len = it } != -1) {
sb.append(String(b, 0, len, Charset.forName("UTF-8")))
}
`is`.close()
con.disconnect()
Log.w("TAG", "sb===${sb}")
} else {
Log.w("TAG", "code===$[code]")
}
} catch (e: Exception) {
Log.w("TAG", "Exception===${e.message}")
}
来源:https://blog.csdn.net/qq_36333309/article/details/127026738


猜你喜欢
- 1. 子类的构造函数如果要引用super的话,必须把super放在函数的首位class Base {Base() {System.out.p
- 前言有时候我们开发时会发现有些方法调用非常多,但它的默认的调用方法却要传很多参数进去而且还得记得调用具体的写法,比如Toast,不止要调用m
- 记一下学习单例模式的笔记:单例就是要保证该类仅有一个实例。实现完全封闭的单例(外部不能new)其实就要两点要求:全局访问:需要一个该类型的全
- 本文实例为大家分享了Android端实现文件上传的具体代码,供大家参考,具体内容如下1)、新建一个Android项目命名为androidUp
- 本文实例为大家分享了C#实现控制台飞行棋小游戏的具体代码,供大家参考,具体内容如下using System;using System.Col
- java 中链表的定义与使用方法Java实现链表主要依靠引用传递,引用可以理解为地址,链表的遍历多使用递归,这里我存在一个疑问同一个类的不同
- datagridview手动添加行数据我在做软件模型界面时,通过功能按钮触发显示的datagridview中,为了方便,需要一些数据,仅写死
- 启动命令:java -jar weichi-1.0.0.jar将命令打印到1.log上 java -jar weichi-1.0.0.jar
- 一、前言 高斯混合模型(Gaussian Mixture Model)简称GMM,是一种业界广泛使用的聚类算法。它是多个高斯分布函
- 我们从jdk8说起。主要是四个随机数生成器。神马?有四个?接下来我们简单说下这几个类的使用场景,来了解其中的细微差别,和api设计者的良苦用
- 目录一、Java 类加载过程1、字节码编译2、加载3、连接4、初始化总结一、Java 类加载过程1、字节码编译编写好 Java 源码 Stu
- 如今,企业级应用程序的常见场景是同时支持HTTP和HTTPS两种协议,这篇文章考虑如何让Spring Boot应用程序同时支持HTTP和HT
- 一、项目简述本系统主要实现的功能有: 学生以及老师的注册登录,在线考试,错题查询,学生管理,问题管理,错题管理,错题查询,分数查询,试卷管
- 上一篇:Android 10 App启动分析之进程创建篇(一)上一篇文章,我们探讨了App启动过程中进程创建及初始化的流程,这篇文章我们接着
- 一、进程线和程的概念线程: 一个线程是一个独立的执行流,每个线程之间都可以按照顺讯执行自己的代码. 多个线程之间 “同时
- 本文实例为大家分享了java指定精确小数位的具体代码,供大家参考,具体内容如下java代码:public class App2 {publi
- Java Double相加出现的怪事问题的提出编译运行下面这个程序会看到什么public class test { public stati
- 工具方法:本文的目的是把json串转成map键值对存储,而且只存储叶节点的数据maven 引用jar包版本:<dependency&g
- 本文实例讲述了Android编程基于距离传感器控制手机屏幕熄灭的方法。分享给大家供大家参考,具体如下:在现实生活中,打电话的时候手机挨着自己
- 1、使用AsyncTask异步任务实现,调用publishProgress()方法刷新进度来实现(已优化)public class MyAs