美文网首页kotlin
52. (android开发)使用HTTP与服务器交互,解决gb

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

作者: 厚土火焱 | 来源:发表于2017-12-25 23:37 被阅读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这样的也是可以的。

    相关文章

      网友评论

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

        本文链接:https://www.haomeiwen.com/subject/rogrgxtx.html