質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

解決済

2回答

2644閲覧

API通信を行うとき引数として渡すデータクラスを可変にしたい

koala2

総合スコア24

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

0グッド

0クリップ

投稿2019/06/13 09:42

API通信を行う関数(以下)を作成しました。

kotlin

1 // API通信(POST) 2 fun conAPI(url: String, req:dtLoginRequest , onSuccess: (json: JSONObject) -> Unit, onFailed: () -> Unit) { 3 4 val moshi = Moshi.Builder().add(KotlinJsonAdapterFactory()).build() 5 val requestAdapter = moshi.adapter(dtLoginRequest::class.java) 6 val header: HashMap<String, String> = hashMapOf("Content-Type" to "application/json") 7 8 Fuel.post(url).header(header).body(requestAdapter.toJson(req)) 9 10 .responseJson() { request, response, result -> 11 12 when (result) { 13 is Result.Success -> { 14 try { 15 onSuccess.invoke(result.value.obj()) 16 } catch (e: Exception) { 17 onFailed.invoke() 18 } 19 20 } 21 is Result.Failure -> { 22 println(result) 23 onFailed.invoke() 24 } 25 } 26 } 27 }

第二引数 req は自作したdata classです。
上記のコードで確かにAPI通信を行えるのですが、
引数がdtLoginRequest固定になっているため他のAPI通信をする場合
同じコードを複数書くことになってしまいます。

どうにかして汎用性の高いコードにしたいと考えているのですがどのようにすれば良いでしょうか?

ご回答よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

ジェネリクスメソッドとして定義すれば汎用的なメソッドになります。
reifiedキーワードを用いることで、具象型パラメータ(T::class.java) にもアクセスすることが可能です。

kotlin

1inline fun <reified T> conAPI(url: String, req: T, onSuccess: (json: JSONObject) -> Unit, onFailed: () -> Unit) { 2 val moshi = Moshi.Builder().add(KotlinJsonAdapterFactory()).build() 3 val requestAdapter = moshi.adapter(T::class.java) 4 val header: HashMap<String, String> = hashMapOf("Content-Type" to "application/json") 5 6 Fuel.post(url).header(header).body(requestAdapter.toJson(req)) 7 ...

投稿2019/06/16 14:08

kakajika

総合スコア3131

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

koala2

2019/06/17 03:43

上記の方法で期待する動きが実現できました。 ジェネリクスメソッドというものを知らなかったので大変勉強になりました。 ありがとうございます。
guest

0

reqdtLoginRequest 固定にしたくないということでしたら、かわりにJSON文字列として受けるようにしてはどうでしょうか。

kotlin

1fun conAPI(url: String, req: String, onSuccess: (json: JSONObject) -> Unit, onFailed: () -> Unit) { 2 // 略 3 Fuel.post(url).header(header).body(req) // reqの中身は自作data classをJSON文字列にしたもの 4 .responseJson() { request, response, result -> 5 // 略

kotlin

1// conAPIを使うときは 2val moshi = Moshi.Builder().add(KotlinJsonAdapterFactory()).build() 3val requestAdapter = moshi.adapter(dtLoginRequest::class.java) 4conAPI("POST先のURL", requestAdapter.toJson(req), //以下略

投稿2019/06/13 10:53

alg

総合スコア2019

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問