前言
最近寫一個項目,需要在android中模擬ajax發送請求,功能並不複雜,使用java.net.HttpURLConnection就可以實現該功能
經過整理,將代碼精簡如下
kotlin版本
/**
* @Description: 對ajax的請求服務,進行了封裝,可以簡單實現前端的ajax功能
* @Param:
* @return:
* @Author: Heiheihie
* @Date: 19-8-26
**/
public fun ajax(
url: String,
type: String,
data: ByteArray?,
dataType: String?,
contentType: String?,
cache: Boolean
): ByteArray {
var connection: HttpURLConnection? = null
var reader: InputStream? = null
var writer: OutputStream? = null
val recdata: ByteArray
try {
var url = URL(url)
connection = url.openConnection() as HttpURLConnection
connection.requestMethod = type.toUpperCase()
//此請求參數必須設置
dataType?.let {
connection.setRequestProperty("dataType", dataType)
}
contentType?.let {
connection.setRequestProperty("Content-Type", "application/json")
}
connection.defaultUseCaches = cache
connection.connectTimeout = 5 * 1000
connection.readTimeout = 5 * 1000
connection.connect()
//GET請求不需要上傳數據
if (!"GET".equals(connection.requestMethod)) {
writer = BufferedOutputStream(connection.outputStream)
data?.let {
//將數據發出
writer.write(data)
writer.flush()
}
}
reader = BufferedInputStream(connection.inputStream)
//讀取全部的數據
recdata = reader.readBytes()
} catch (e: IOException) {
e.printStackTrace()
return byteArrayOf()
} catch (ex: Exception) {
ex.printStackTrace()
return byteArrayOf()
} finally {
reader?.let {
try {
it.close()
} catch (exInner: Exception) {
exInner.printStackTrace()
}
}
writer?.let {
it.close()
}
connection?.disconnect()
}
return recdata
}
java版本的代碼,可以參考着進行改寫
使用示例
//url是ajax所連接的mapper位點,msg是需要發出的數據
fun ajax_post_unknow(url: String, msg: String): String {
var rec = ajax(url, "POST", msg.toByteArray(), "json", null, false)
return rec.toString(Charset.defaultCharset())
}
注意,有些時候接收字符串數據的時候,直接使用了ByteArray.toString()方法,得到的是@xxxx的類實地信息,正確做法是使用ByteArray.toString(Charset.defaultCharset())。具體哪種字符編碼格式,需要自己確定。
同理,發送數據的時候,對字符串msg.toByteArray(Charset.defaultCharset()),同樣需要根據自己工程的情況來確定。