52. (android开发)使用HTTP与服务器交互,解决gb
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这样的也是可以的。