美文网首页Kotlin开发指南禅与计算机程序设计艺术Kotlin编程
53. (android开发)使用OkHttp向服务器提交数据的

53. (android开发)使用OkHttp向服务器提交数据的

作者: 厚土火焱 | 来源:发表于2017-12-28 22:33 被阅读49次

android客户端向服务端提交数据,在HTTP协议下,可以采用get或post方法。
首先构造一个界面
由于我要访问的服务器地址是IP地址,就需要一个能够包含IP变化带来的动态情况。所以采用了NumberPicker方式,用四个这样的组件构成服务器地址选择器。


IP选择器

再有一个填写附加信息的地方,和两个按钮,一个按钮使用GET方法,一个按钮使用POST方法。


操作界面
局域网测试,服务端IP为 192.168.1.105
所以界面的设置文件是这样的
<?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.OkHttpActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <NumberPicker
            android:id="@+id/ip_n1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:focusable="true"
            android:focusableInTouchMode="true"></NumberPicker>

        <NumberPicker
            android:id="@+id/ip_n2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:focusable="true"
            android:focusableInTouchMode="true"></NumberPicker>

        <NumberPicker
            android:id="@+id/ip_n3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:focusable="true"
            android:focusableInTouchMode="true"></NumberPicker>

        <NumberPicker
            android:id="@+id/ip_n4"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:focusable="true"
            android:focusableInTouchMode="true"></NumberPicker>

    </LinearLayout>

    <EditText
        android:id="@+id/edttxtURL"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="输入传送信息" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:scrollbars="horizontal">

        <Button
            android:id="@+id/btnOkHttpResponseGet"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="OkHttp发送请求和获取响应(GET)"
            android:textAllCaps="false" />

        <Button
            android:id="@+id/btnOkHttpResponsePost"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="OkHttp发送请求和获取响应(POST)"
            android:textAllCaps="false" />

    </LinearLayout>

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

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

</LinearLayout>

设置服务端IP地址的默认值和IP地址拼串。
设置4个NumberPicker的最大最小值和当前值。

    //设置访问服务端IP
    var serverIp = "192.168.1.105"
    val ipMinNumber = 0
    val ipMaxNumber = 255

    fun setServerIp(i0:String,i1:String,i2:String,i3:String) {
        serverIp = i0 + "." + i1 + "." + i2 + "." + i3
    }

在onCreate代码中,

        ip_n1.minValue = ipMinNumber
        ip_n1.maxValue = ipMaxNumber
        ip_n1.value = 192
        ip_n2.minValue = ipMinNumber
        ip_n2.maxValue = ipMaxNumber
        ip_n2.value = 168
        ip_n3.minValue = ipMinNumber
        ip_n3.maxValue = ipMaxNumber
        ip_n3.value = 1
        ip_n4.minValue = ipMinNumber
        ip_n4.maxValue = ipMaxNumber
        ip_n4.value = 105

        ip_n1.setOnValueChangedListener { numberPicker, i, j ->
            ip_n1.value = j
            setServerIp(ip_n1.value.toString(),ip_n2.value.toString(),ip_n3.value.toString(),ip_n4.value.toString())
        }
        ip_n2.setOnValueChangedListener { numberPicker, i, j ->
            ip_n2.value = j
            setServerIp(ip_n1.value.toString(),ip_n2.value.toString(),ip_n3.value.toString(),ip_n4.value.toString())
        }
        ip_n3.setOnValueChangedListener { numberPicker, i, j ->
            ip_n3.value = j
            setServerIp(ip_n1.value.toString(),ip_n2.value.toString(),ip_n3.value.toString(),ip_n4.value.toString())
        }
        ip_n4.setOnValueChangedListener { numberPicker, i, j ->
            ip_n4.value = j
            setServerIp(ip_n1.value.toString(),ip_n2.value.toString(),ip_n3.value.toString(),ip_n4.value.toString())
        }

这段代码还是很有优化空间的,但这次就这么用吧。
get方法传递数据相对简单,因为如果有数据要传的话,也是拼串。所以就不写详细的拼的过程了,只是将来记得写完整的拼好的服务端地址。

        //get方式发送数据
        btnOkHttpResponseGet.setOnClickListener {
            Thread {
                try {
                    val client = OkHttpClient()

                    //设置目标网络地址
                    val request = Request.Builder().url("http://" + serverIp).build()
                    //向服务端发送请求
                    val response = client.newCall(request).execute()
                    //获取响应数据
                    val responseStr = response.body()?.string()

                    runOnUiThread { ttviewResponse.text = responseStr }
                } catch (e: Exception) {
                    runOnUiThread { Toast.makeText(this, e.message, Toast.LENGTH_LONG).show() }
                }
            }.start()

        }

post方法相比get来说,要写一个FormBody

        //post方式发送数据
        btnOkHttpResponsePost.setOnClickListener {
            Thread {
                try {
                    var str = ""
                    str = edttxtURL.text.toString()
                    //封装post请求数据
                    val requestBody = FormBody.Builder()
                            .add("name", "Joel" + str)
                            .add("age", "27")
                            .build()
                    val client = OkHttpClient()
                    val request = Request.Builder().url("http://" + serverIp).post(requestBody).build()
                    val response = client.newCall(request).execute()
                    val responseStr = response.body()?.string()
                    runOnUiThread { ttviewResponse.text = responseStr }
                } catch (e: Exception) {
                    runOnUiThread { Toast.makeText(this, e.message, Toast.LENGTH_LONG).show() }
                }
            }.start()
        }
界面

相关文章

网友评论

    本文标题:53. (android开发)使用OkHttp向服务器提交数据的

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