由於近期網上搜索了很多Android連接到http的方法, 可是2013年以前的方法現在都不能用了,要么報錯,要么被遺棄,歲月留下來的東西只能自己整理了。
其實很簡單,就一個HttpUtil通用類。可以實現Get和Post方法,其他東西,里面可以隨便改改,基本就這樣吧。
參數的話,我用了一個 strUrlPath網址、params鍵值對、encode編碼(如utf-8)。
package Util
import android.os.Handler
import android.os.Message
import android.view.View
import android.widget.Button
import java.io.BufferedReader
import java.io.ByteArrayOutputStream
import java.io.IOException
import java.io.InputStream
import java.io.InputStreamReader
import java.io.OutputStream
import java.net.HttpURLConnection
import java.net.MalformedURLException
import java.net.URL
import java.net.URLEncoder
/**
* Created by Jason_Jan on 2017/7/5.
*/
object HttpUtil {
private var handler: Handler? = null
private var my_result: String? = null
fun httpGet(strUrlPath: String, params: Map<String, String>, encode: String): String {
var strUrlPath = strUrlPath
/* byte[] data = getRequestData(params, encode).toString().getBytes();//獲得請求體*/
/* String target="http://emb.mobi/register";*/
var result: String? = null
val append_url = getRequestData(params, encode).toString()
strUrlPath = strUrlPath + "?" + append_url
try {
val url = URL(strUrlPath)
val urlConn = url.openConnection() as HttpURLConnection
urlConn.connectTimeout = 5000//超時時間
urlConn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded")//設置頭部信息,其實沒什么用
//主角開始登場,不注意就是幾個小時的調試,輸入流
val `in` = InputStreamReader(urlConn.inputStream)
val buffer = BufferedReader(`in`)
var inputLine: String? = null
//循環逐行讀取輸入流中的內容
result = ""//每次清空數據
while (buffer.readLine().apply { inputLine = this } != null) {
result += inputLine!! + "\n"
}
`in`.close()
urlConn.disconnect()
} catch (e: MalformedURLException) {
e.printStackTrace()
} catch (ioe: IOException) {
ioe.printStackTrace()
return "err:" + ioe.message.toString()
}
return result!!
}
private fun getRequestData(params: Map<String, String>, encode: String): StringBuffer {
val stringBuffer = StringBuffer() //存儲封裝好的請求體信息
try {
for ((key, value) in params) {
stringBuffer.append(key)
.append("=")
.append(URLEncoder.encode(value, encode))
.append("&")
}
stringBuffer.deleteCharAt(stringBuffer.length - 1) //刪除最后的一個"&"
} catch (e: Exception) {
e.printStackTrace()
}
return stringBuffer
}
fun httpPost(strUrlPath: String, params: Map<String, String>, encode: String): String {
val data = getRequestData(params, encode).toString().toByteArray()
try {
val url = URL(strUrlPath)
val http = url.openConnection() as HttpURLConnection
http.connectTimeout = 5000
http.doInput = true
http.doOutput = true
http.requestMethod = "POST"
http.useCaches = false//使用post方式不能用緩存
//設置請求體的類型是文本類型
http.setRequestProperty("Content-Type", "application/x-www-form-urlencoded")
//設置請求體的長度
http.setRequestProperty("Content-Length", data.size.toString())
//獲得輸出流,向服務器寫入數據
val out = http.outputStream
out.write(data)
val response = http.responseCode
if (response == HttpURLConnection.HTTP_OK) {
val inputStream = http.inputStream
return dealResponseResult(inputStream)
}
} catch (ioe: IOException) {
ioe.printStackTrace()
return "err:" + ioe.message.toString()
}
return "-1"
}
fun dealResponseResult(inputStream: InputStream): String {
var resultData: String? = null //存儲處理結果
val byteArrayOutputStream = ByteArrayOutputStream()
val data = ByteArray(1024)
var len = 0
try {
while (inputStream.read(data).apply { len = this } != -1) {
byteArrayOutputStream.write(data, 0, len)
}
} catch (e: IOException) {
e.printStackTrace()
}
resultData = String(byteArrayOutputStream.toByteArray())
return resultData
}
}
使用方式很簡單--HttpUtil.方法名(參數),返回一個string,之后用Json解析工具來解析。
其次重中之重,安卓網絡連接有點坑。下面從兩個方面談談。
1.getoutputstream這里,一直報錯。解決方案:build.gradle
compile 'com.squareup.retrofit:retrofit:1.8.0'
compile 'com.squareup.okhttp:okhttp:2.1.0'
compile 'com.squareup.okhttp:okhttp-urlconnection:2.1.0'
2.其次,在AndroidManifest.xml中
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />