検証環境
この記事の内容は、以下の環境で検証しました。
- Intellij IDEA ULTIMATE 2017.2
- Kotlin 1.1.61
- Fuel 1.12.0
- Java 1.8
- Gradle Projectで作成
はじめに
昨今のAndroidアプリは、HTTP通信をよく行います。
AndroidアプリをKotlinで実装するのであれば、HTTP通信をの実装で、どのようなライブラリーが有効なのかを知っておく必要があります。
Javaで開発していた時はOkHttpで十分なのですが、OkHttpはKotlinに対応しておらずKotlinでは扱いにくい状態です。Kotlinの公式サイトを確認してみると、HTTP通信ライブラリーを紹介しているので、せめて紹介されているライブラリーは確認したくて本記事を書きました。
(参考:https://kotlinlang.org/docs/resources.html )
目標
FuelライブラリーとJavaのHttpURLConnectionで同じ処理を記述し、実装の違いを確認する。
Fuel
Fuelとは
Fuelとは、KotlinとAndroid用のHTTP通信ライブラリーです。
HTTP通信が基本的な機能ですが、GSONと連携などが行え、JSONの解析が用意に行えたりもします。
準備
Fuelを使用するため、Gradleに以下を追記します。
repositories {
jcenter()
}
dependencies {
compile 'com.github.kittinunf.fuel:fuel:1.12.0'
}
実装例
実際にFuelを使用した例は、以下の通りです。
package jp.co.casareal.fuel
import com.github.kittinunf.fuel.httpGet
import com.github.kittinunf.result.Result
fun main(args: Array<String>) {
// 非同期処理
"https://www.casareal.co.jp/".httpGet().response { request, response, result ->
when (result) {
is Result.Success -> {
// レスポンスボディを表示
println("非同期処理の結果:" + String(response.data))
}
is Result.Failure -> {
println("通信に失敗しました。")
}
}
}
// 同期処理
val triple = "https://www.casareal.co.jp/".httpGet().response()
// レスポンスボディを表示
println("同期処理の結果:" + String(triple.second.data))
}
解説
Fuelを使用するには、下記の形式で記述します。
"URLを記述".httpXXX().response関数 or responseString関数
- httpXXXには、GetやPostなどのHTTPメソッドを記述します。
- response関数やresponseString関数の引数にラムダ式を記述すると、非同期処理になります。
- response関数やresponseString関数の引数にラムダ式を記述しないと、同期処理になります。
HTTP通信の結果によって処理を分ける場合は、以下の形式で記述します。
when (result) {
is Result.Success -> {
// レスポンスボディを表示
println("非同期処理の結果:" + String(response.data))
}
is Result.Failure -> {
println("通信に失敗しました。")
}
}
- HTTP通信の結果は、resultに格納されています。
- HTTP通信が正常に行えると、resultにはSuccessが格納されています。
- HTTP通信が正常に行えないと、resultにはFailureが格納されています。
HttpURLConnection
HttpURLConnectionとは
HttpURLConnectionとは、Javaが提供しているクラスの1つです。HTTP 固有の機能をサポートするしているクラスです。
詳細:https://docs.oracle.com/javase/jp/6/api/java/net/HttpURLConnection.html
実装例
HttpURLConnectionクラスを使用した実装例は、以下の通りです。
通信部分の処理は、関数化しています。
package jp.co.casareal.fuel
import java.net.HttpURLConnection
import java.net.URL
import jdk.nashorn.internal.runtime.ScriptingFunctions.readLine
import java.io.InputStreamReader
import java.io.BufferedReader
import java.lang.Exception
fun main(args: Array<String>) {
// 非同期処理
val thread = Thread() {
println("非同期処理の結果:${connectionCasareal()}")
}.start()
// 同期処理
val result = connectionCasareal()
println("同期処理の結果:${result}")
}
fun connectionCasareal(): String {
val requestUrl = "https://www.casareal.co.jp/"
// URLオブジェクトを生成
val url = URL(requestUrl)
val urlConnection = url.openConnection() as HttpURLConnection
urlConnection.requestMethod = "GET"
urlConnection.connect()
val br = BufferedReader(InputStreamReader(urlConnection.inputStream))
var line: String? = null
val sb = StringBuilder()
for (line in br.readLines()) {
line?.let { sb.append(line) }
}
br.close()
return sb.toString()
}
まとめ
百聞は一見に如かずではないですが、Fuelを使用することにより、コードがシンプルになり可読性が向上しています。
次回は・・・
FuelとGSONの連携について書きたいと思っています。