Android 中使用 Kotlin 的简单 HTTP 请求示例
Simple HTTP request example in Android using Kotlin
我是 Android 使用 Kotlin 进行开发的新手,我正在努力寻找任何有用的文档,了解如何使用当前最佳实践创建简单的 GET 和 POST 请求。我来自 Angular 开发,我们使用 RxJS 进行了反应式开发。
通常我会创建一个服务文件来保存我所有的请求函数,然后我会在任何组件中使用该服务并订阅可观察对象。
在 Android 你会怎么做?是否有必须创建的事物的良好开始示例。乍一看,一切都那么复杂和过度设计
您所获得的最佳实践只是通过网络调用的基础知识并使用 Android Studio 创建一些演示应用程序。
如果您想单击开始,请按照本教程进行操作
Kotlin 中的简单网络调用
https://www.androidhire.com/retrofit-tutorial-in-kotlin/
此外,我想建议请为 GET 和 POST 请求创建一些演示应用程序,然后将这些示例合并到您的项目中。
你可以使用类似的东西:
internal inner class RequestTask : AsyncTask<String?, String?, String?>() {
override fun doInBackground(vararg params: String?): String? {
val httpclient: HttpClient = DefaultHttpClient()
val response: HttpResponse
var responseString: String? = null
try {
response = httpclient.execute(HttpGet(uri[0]))
val statusLine = response.statusLine
if (statusLine.statusCode == HttpStatus.SC_OK) {
val out = ByteArrayOutputStream()
response.entity.writeTo(out)
responseString = out.toString()
out.close()
} else {
//Closes the connection.
response.entity.content.close()
throw IOException(statusLine.reasonPhrase)
}
} catch (e: ClientProtocolException) {
//TODO Handle problems..
} catch (e: IOException) {
//TODO Handle problems..
}
return responseString
}
override fun onPostExecute(result: String?) {
super.onPostExecute(result)
//Do anything with response..
}
}
和电话:
RequestTask().execute("https://v6.exchangerate-api.com/v6/")
sdk 23 不再支持 HttpClient
。您必须使用 URLConnection
或降级到 sdk 22 (compile 'com.android.support:appcompat-v7:22.2.0'
)
如果您需要 sdk 23,请将其添加到您的 gradle:
android {
useLibrary 'org.apache.http.legacy'
}
您也可以尝试下载并包含 HttpClient.jar directly into your project or use OkHttp 而不是
我建议你使用 OkHttp
的官方推荐,或者更简单的 Fuel
库,它还有使用流行的 Json 将响应反序列化为对象的绑定 / ProtoBuf 库。
燃料 示例:
// Coroutines way:
// both are equivalent
val (request, response, result) = Fuel.get("https://httpbin.org/ip").awaitStringResponseResult()
val (request, response, result) = "https://httpbin.org/ip".httpGet().awaitStringResponseResult()
// process the response further:
result.fold(
{ data -> println(data) /* "{"origin":"127.0.0.1"}" */ },
{ error -> println("An error of type ${error.exception} happened: ${error.message}") }
)
// Or coroutines way + no callback style:
try {
println(Fuel.get("https://httpbin.org/ip").awaitString()) // "{"origin":"127.0.0.1"}"
} catch(exception: Exception) {
println("A network request exception was thrown: ${exception.message}")
}
// Or non-coroutine way / callback style:
val httpAsync = "https://httpbin.org/get"
.httpGet()
.responseString { request, response, result ->
when (result) {
is Result.Failure -> {
val ex = result.getException()
println(ex)
}
is Result.Success -> {
val data = result.get()
println(data)
}
}
}
httpAsync.join()
OkHttp 示例:
val request = Request.Builder()
.url("http://publicobject.com/helloworld.txt")
.build()
// Coroutines not supported directly, use the basic Callback way:
client.newCall(request).enqueue(object : Callback {
override fun onFailure(call: Call, e: IOException) {
e.printStackTrace()
}
override fun onResponse(call: Call, response: Response) {
response.use {
if (!response.isSuccessful) throw IOException("Unexpected code $response")
for ((name, value) in response.headers) {
println("$name: $value")
}
println(response.body!!.string())
}
}
})
我是 Android 使用 Kotlin 进行开发的新手,我正在努力寻找任何有用的文档,了解如何使用当前最佳实践创建简单的 GET 和 POST 请求。我来自 Angular 开发,我们使用 RxJS 进行了反应式开发。
通常我会创建一个服务文件来保存我所有的请求函数,然后我会在任何组件中使用该服务并订阅可观察对象。
在 Android 你会怎么做?是否有必须创建的事物的良好开始示例。乍一看,一切都那么复杂和过度设计
您所获得的最佳实践只是通过网络调用的基础知识并使用 Android Studio 创建一些演示应用程序。
如果您想单击开始,请按照本教程进行操作
Kotlin 中的简单网络调用
https://www.androidhire.com/retrofit-tutorial-in-kotlin/
此外,我想建议请为 GET 和 POST 请求创建一些演示应用程序,然后将这些示例合并到您的项目中。
你可以使用类似的东西:
internal inner class RequestTask : AsyncTask<String?, String?, String?>() {
override fun doInBackground(vararg params: String?): String? {
val httpclient: HttpClient = DefaultHttpClient()
val response: HttpResponse
var responseString: String? = null
try {
response = httpclient.execute(HttpGet(uri[0]))
val statusLine = response.statusLine
if (statusLine.statusCode == HttpStatus.SC_OK) {
val out = ByteArrayOutputStream()
response.entity.writeTo(out)
responseString = out.toString()
out.close()
} else {
//Closes the connection.
response.entity.content.close()
throw IOException(statusLine.reasonPhrase)
}
} catch (e: ClientProtocolException) {
//TODO Handle problems..
} catch (e: IOException) {
//TODO Handle problems..
}
return responseString
}
override fun onPostExecute(result: String?) {
super.onPostExecute(result)
//Do anything with response..
}
}
和电话:
RequestTask().execute("https://v6.exchangerate-api.com/v6/")
sdk 23 不再支持 HttpClient
。您必须使用 URLConnection
或降级到 sdk 22 (compile 'com.android.support:appcompat-v7:22.2.0'
)
如果您需要 sdk 23,请将其添加到您的 gradle:
android {
useLibrary 'org.apache.http.legacy'
}
您也可以尝试下载并包含 HttpClient.jar directly into your project or use OkHttp 而不是
我建议你使用 OkHttp
的官方推荐,或者更简单的 Fuel
库,它还有使用流行的 Json 将响应反序列化为对象的绑定 / ProtoBuf 库。
燃料 示例:
// Coroutines way:
// both are equivalent
val (request, response, result) = Fuel.get("https://httpbin.org/ip").awaitStringResponseResult()
val (request, response, result) = "https://httpbin.org/ip".httpGet().awaitStringResponseResult()
// process the response further:
result.fold(
{ data -> println(data) /* "{"origin":"127.0.0.1"}" */ },
{ error -> println("An error of type ${error.exception} happened: ${error.message}") }
)
// Or coroutines way + no callback style:
try {
println(Fuel.get("https://httpbin.org/ip").awaitString()) // "{"origin":"127.0.0.1"}"
} catch(exception: Exception) {
println("A network request exception was thrown: ${exception.message}")
}
// Or non-coroutine way / callback style:
val httpAsync = "https://httpbin.org/get"
.httpGet()
.responseString { request, response, result ->
when (result) {
is Result.Failure -> {
val ex = result.getException()
println(ex)
}
is Result.Success -> {
val data = result.get()
println(data)
}
}
}
httpAsync.join()
OkHttp 示例:
val request = Request.Builder()
.url("http://publicobject.com/helloworld.txt")
.build()
// Coroutines not supported directly, use the basic Callback way:
client.newCall(request).enqueue(object : Callback {
override fun onFailure(call: Call, e: IOException) {
e.printStackTrace()
}
override fun onResponse(call: Call, response: Response) {
response.use {
if (!response.isSuccessful) throw IOException("Unexpected code $response")
for ((name, value) in response.headers) {
println("$name: $value")
}
println(response.body!!.string())
}
}
})