Help us understand the problem. What is going on with this article?

KotlinでHTTP通信(FuelとHttpURLConnection)

More than 1 year has passed since last update.

検証環境

この記事の内容は、以下の環境で検証しました。

  • 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とは

https://github.com/kittinunf/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の連携について書きたいと思っています。

naoi
casareal
システム開発/評価・検証支援/品質改善支援サービスと現場に即した実践的なIT研修サービスを提供しています。
https://www.casareal.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした