kotlin

52. (android开发)使用HTTP与服务器交互,解决gb

2017-12-25  本文已影响76人  厚土火焱

kotlin android与服务器通过HTTP交互,使用HttpURLConnection、inputStream、bufferedReader,获取指定网址的内容。这里需要解决编码问题。虽然大多数网站都使用utf-8了,也有为数不少的网站使用其他的编码格式,比如:2345.com使用的是 gb2312。这没有什么问题,我们只要在获取内容的时候,对编码格式采用正确的参数就可以了。
看个例子,我们在界面上增加三个组件:EditView、Button、TextView
分别用来做地址输入、访问激发、获取内容显示

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.cofox.mykt.myweather.HttpToServerActivity">

    <EditText
        android:id="@+id/edttxtURL"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10"
        android:hint="输入网址"
        android:inputType="textPersonName" />
<LinearLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">

    <Button
        android:id="@+id/btnRequestResponse2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="获取2" />

</LinearLayout>
    <ScrollView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
        <TextView
            android:id="@+id/ttviewResponse"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    </ScrollView>
</LinearLayout>

界面

在 onCreate 中添加如下代码

btnRequestResponse2.setOnClickListener {
            Thread {
                try {
                    var txt = ""
                    if (edttxtURL.text.toString().length == 0){
                        txt = "www.2345.com/?k329188"
                    }else{
                        txt = edttxtURL.text.toString()
                    }

                    val url = URL("https://"+txt)
                    //获取 HttpUrlConnection 实例
                    val connection = url.openConnection() as HttpURLConnection
                    connection.requestMethod = "GET"
                    connection.connectTimeout = 10000
                    connection.readTimeout = 10000
                    val inputStream = connection.inputStream
                    var reader = inputStream.bufferedReader(charset("gb2312"))
                    var response = StringBuilder()
                    while (true){
                        val line = reader.readLine()
                        if (line == null){
                            break
                        }
                        response.append(line)
                    }
                    reader.close()
                    connection.disconnect()
                    runOnUiThread { ttviewResponse.text = response.toString() }
                } catch (e: Exception) {
                    throw e
                }
            }.start()
        }

var reader = inputStream.bufferedReader(charset("gb2312")) 是以行为单位,读取服务器的反馈数据,并且按照括号内的编码格式。如果你在括号内空白,会默认为 uft-8 格式。当然使用 Charsets.ISO_8859_1 这样的东西来替代 charset("gb2312"),只要你确定他们和你要访问的网站编码格式一致。
代码中的
var txt = ""
if (edttxtURL.text.toString().length == 0){
txt = "www.2345.com/?k329188"
}else{
txt = edttxtURL.text.toString()
}
应该比较好理解,就是如果没有填写网址的话,就用 2345网站地址来代替。
还需要注意
connection.requestMethod = "GET"
GET必须大写。

charset("gb2312")是kotlin的写法,熟悉java的人可能更容易理解的是Charset.forName("gb2312")。当然这里需要的是一个 Charset 类型的参数,所以写成 Charsets.ISO_8859_1这样的也是可以的。

上一篇下一篇

猜你喜欢

热点阅读