Android Kotlin 連接 http


 

  由於近期網上搜索了很多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" />  

  

  

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM