android客户端向服务端提交数据,在HTTP协议下,可以采用get或post方法。
首先构造一个界面
由于我要访问的服务器地址是IP地址,就需要一个能够包含IP变化带来的动态情况。所以采用了NumberPicker方式,用四个这样的组件构成服务器地址选择器。
再有一个填写附加信息的地方,和两个按钮,一个按钮使用GET方法,一个按钮使用POST方法。
局域网测试,服务端IP为 192.168.1.105
所以界面的设置文件是这样的
设置服务端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()
}