Android Kotlin 连接 http

摘要:
最近,网络上搜索了许多将Android连接到http的方法,但2013年之前的方法现在无法使用。它们要么报告错误,要么被放弃。岁月留下的东西只能自己整理。事实上,它非常简单,只是一个HttpUtil通用类。对于参数,我使用strUrlPath URL、params键值对和编码代码。“+append_urltry{valurl=URLvalrlConn=url.openConnection()asHttpURLConnectionurlConn.connectTimeout=5000//timeouturlConn.setRequestProperty//设置标头信息,这是没有用的。//主角开始出现。如果你不注意它,只需要几个小时的调试。输入流val`in`=InputStreamReadervalbuffer=BufferedReadervarinputLine:String=null/循环逐行读取输入流中的内容result=“”//每次在(buffer.readLine()期间清除数据。应用{inputLine=this}!

  由于近期网上搜索了很多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!! + "
"
            }


            `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》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇lodash 移除假值数组 compactHOWTO:InstallShield制作的安装包中如何获得用户选择的安装语言下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

C#调用WPS将文档转换成pdf进行预览

vs启动项目可以生成wps实例 本地iis部署的站点却不行 原因是vs是管理员权限,而iis没有权限 解决方法 启动IIS,应用程序池-“选定的应用程序池”-高级设置-进程模型-标识:设置为管理员账号administrator     代码 1.安装WPS 2016 专业版 2.方法一:在项目中引用etapi.dll,wpsapi.dll,wpp...

SQL字符串处理函数

select语句中只能使用sql函数对字段进行操作(链接sql server), select 字段1 from 表1 where 字段1.IndexOf("云")=1;这条语句不对的原因是indexof()函数不是sql函数,改成sql对应的函数就可以了。left()是sql函数。select 字段1 from 表1 where charindex('云...

使用vs自带的性能诊断工具

visual studio是个强大的集成开发环境,内置了程序性能诊断工具。下面通过两段代码进行介绍。 static void Main( string[] args) { Test1(); Test2(); Console.ReadKey();...

C#6.0语言规范(十二) 数组

数组是一种数据结构,包含许多通过计算索引访问的变量。包含在数组中的变量(也称为数组的元素)都是相同的类型,这种类型称为数组的元素类型。 数组具有确定与每个数组元素相关联的索引数的等级。数组的等级也称为数组的维度。秩为1的数组称为一维数组。秩大于1的数组称为多维数组。特定大小的多维阵列通常被称为二维阵列,三维阵列等。 数组的每个维度具有相关联的长度,该长度是...

java 添加properties文件读写

import java.io.InputStream; import java.util.Properties; /** * @author guoxiang * */ public class Config { private static Config instance = null; private Propert...

Spring中RestTemplate的使用方法

一、REST 在互联网中,我们会通过请求url来对网络上的资源做增删改查等动作,这里的请求包含两部分:动词,主要包括增、删、改、查;名词,就是网络中的各种资源。传统的非REST风格的请求方式是把动词和名词全都放在url中。例如,对设备的操作可能是这样的:添加设备:http://test/device/add删除设备:http://test/device/d...