Android Kotlin 串連 http

來源:互聯網
上載者:User

標籤:安卓   服務   ringbuf   寫入   nec   好的   puts   htm   val   

 

  由於近期網上搜尋了很多Android串連到http的方法, 可是2013年以前的方法現在都不能用了,要麼報錯,要麼被遺棄,歲月留下來的東西只能自己整理了。

 

  其實很簡單,就一個HttpUtil通用類。可以實現Get和Post方法,其他東西,裡面可以隨便改改,基本就這樣吧。

 

  參數的話,我用了一個 strUrlPath網址、params索引值對、encode編碼(如utf-8)。

 

 

  

package Utilimport android.os.Handlerimport android.os.Messageimport android.view.Viewimport android.widget.Buttonimport java.io.BufferedReaderimport java.io.ByteArrayOutputStreamimport java.io.IOExceptionimport java.io.InputStreamimport java.io.InputStreamReaderimport java.io.OutputStreamimport java.net.HttpURLConnectionimport java.net.MalformedURLExceptionimport java.net.URLimport 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" />  

  

  

 

  

Android Kotlin 串連 http

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.