SlideShare a Scribd company logo
Android + JSON-RPC
shibuya.apk #10
About Me
Shinobu Okano
@operandoOS
Mercari, Inc.
Souzoh, Inc.
Android + JSON-RPC
shinobu.apk #3
やります!!
Androidについて語る!
shinobu.apk #1 を開催しました!
http://tech.mercari.com/entry/2016/02/12/122918
shinobu.apk #2 のパネルディスカッション
録音データとShow Notesを公開しました!
http://hack-it-iron.hatenablog.com/entry/
2016/04/20/124823
http://shinobu-apk.connpass.com/event/40202/
Join!!
shinobu.apk #3
JSON-RPC??
JSON-RPC
“JSON-RPC is a stateless, light-weight
remote procedure call (RPC) protocol.”
JSON-RPC spec
http://www.jsonrpc.org/specification
RPC
• gRPC
• http://www.grpc.io/
• Go Conference 2016 SpringでgRPCの現状について
発表してきました
• http://tech.mercari.com/entry/
2016/04/27/145227
JSON-RPC 2.0
JSON-RPC
HTTP bodyのJSONでリクエストを記述する
JSON-RPC Request
{
"jsonrpc": "2.0",
"method": "subtract",
"params": [
42,
23
],
"id": 1
}
JSON-RPC Response
{
"jsonrpc": "2.0",
"result": 19,
"id": 1
}
JSON-RPC Batch
1回の通信で複数のリクエストを送れる
JSON-RPC Request
[
{
"id": 1,
"jsonrpc": "2.0",
"method": "shibuya.apk",
"params": { ... }
},
{
"id": 2,
"jsonrpc": "2.0",
"method": "shinobu.apk",
"params": { ... }
}
]
JSON-RPC Response
[
{
"id": 1,
"jsonrpc": "2.0",
"result": { ... }
},
{
"id": 2,
"jsonrpc": "2.0",
"result": { ... }
}
]
何に使うの??
何に使うの??
何に使うの??
• タイムラインの投稿を取得
• 現在地の座標を住所に変換する
• バナーを取得する
以下のリクエストが1回のリクエストでできる
GET /home??
複数の処理をまとめたAPIは
仕様が壊れやすい
JSON-RPC Batch
• APIは個々の処理をメソッドとして定義
• クライアント側で個々の処理を1つの

リクエストにまとめて呼び出す
JSON-RPC Request
[
{
"id": 1,
"jsonrpc": "2.0",
"method": "GetTimeline",
"params": { ... }
},
{
"id": 2,
"jsonrpc": "2.0",
"method": "GetBanner",
"params": { ... }
}
]
JSON-RPC Response
[
{
"id": 1,
"jsonrpc": "2.0",
"result": { ... }
},
{
"id": 2,
"jsonrpc": "2.0",
"result": { ... }
}
]
よさそう!!
じゃAndroidで実装するか!!
OkHttp使って書いてみる Request
OkHttpClient client;
JSONObject json = new JSONObject();
JsonArray params = new JsonArray();
json.put("method","subtract");
params.put(42);
params.put(23);
json.put("params",params);
RequestBody requestBody = RequestBody.create(MEDIA_TYPE,
json.toString().getBytes());
Request request = new Request.Builder()
.url("https://....")
.post(requestBody)
.build();
Response response = client.newCall(request).execute();
OkHttp使って書いてみる Response
Response response = client.newCall(request).execute();
// ... isSuccessfulのチェックとか...
ResponseBody value = response.body();
JSONObject j = new JSONObject(value.string());
int result = j.getInt("result");// return 19
これイケてますかね??
イケてないですよね...
いい感じのLibraryあるんじゃね…
検索検索
あまりない??
• jsonrpc4j
• https://github.com/briandilley/jsonrpc4j
• Batchに対応してない??
• retrofit-jsonrpc
• https://github.com/segmentio/retrofit-jsonrpc
• Batchに対応してない??
途方に暮れる日々...
あーなんでこんなAPIに
なってるんだ...
うぅ…僕はわるくない...
(。-ω-)
そうも言ってられない...
そうだ!
自分で作ればいいんだ!
作ってみた
※当日までにコードが公開できませんでした

すいません🙇
作る前に考えたこと
• 毎回同じ処理は書きたくない
• リクエストの型が決まればレスポンスの型が決まる
• リクエストとレスポンスを型で定義
• Batch リクエストをいい感じに受け取りたい
• Rxとか使っちゃう??
• 特定の通信ライブラリに依存しない
JSON-RPCのクライアント実装で大変だったこと
• Batch リクエストの受け取り方
• エラーハンドリング
• Retrofitの恩恵が受けられない…
レスポンスのパターン
• OK 1つのレスポンス
• OK 複数のレスポンス(2,3つ)
• NG 全レスポンスエラー
• NG 一部のレスポンスエラー
Batch リクエストの受け取り方
• 複数のリクエストを作る
• 作ったリクエストをまとめてAPIに投げる
• 複数のレスポンスが返ってくる
• ハンドリングしてレスポンスを通知する
複数のレスポンス...??
複数のレスポンス...??
• List<Object> ??
• List<?> ??
• List<JSONObject> ??
どれもイケてない
そうだ...Tuple💪だ!!
💪
筋肉 2つ 💪💪
@Getter
public class Pair<F, S> {
private final F first;
private final S second;
private Pair(F first, S second) {
this.first = first;
this.second = second;
}
public static <F, S> Pair<F, S> create(F first, S second) {
return new Pair<>(first, second);
}
}
筋肉 3つ 💪💪💪
@Getter
public class Triplet<F, S, T> {
private final F first;
private final S second;
private final T thread;
private Triplet(F first, S second, T thread) {
this.first = first;
this.second = second;
this.thread = thread;
}
public static <F, S, T> Triplet<F, S, T> create(F first, S second, T
thread) {
return new Triplet<>(first, second, thread);
}
}
複数のリクエストを作る
// リクエストとレスポンスをクラスとして定義
// リクエスト : GetBanner レスポンス : GetBanner
class GetBannerResponse {
String url;
}
// リクエストの型が決まればレスポンスの型が決まる = RequestType<レスポンスの型>
class GetBanner extends RequestType<GetBannerResponse> {
@Override
public String getMethod() {
return "GetBanner";
}
@Override
protected Class<GetBannerResponse> getResponseType() {
return GetBannerResponse.class;
}
}
複数のリクエストを作る
// 同じように別APIのリクエストとレスポンスをクラスとして定義
// リクエスト : GetTimeline レスポンス : GetTimelineResponse
class GetTimelineResponse {
List<Item> items;
}
class GetTimeline extends RequestType<GetTimelineResponse> {
private final long timelineId;
GetTimeline(long timelineId) {
this.timelineId = timelineId;
}
@Override
public String getMethod() {
return "GetTimeline";
}
@Override
protected Class<GetTimelineResponse> getResponseType() {
return GetTimelineResponse.class;
}
}
作ったリクエストをまとめてAPIに投げる
GetTimeline getTimeline = new GetTimeline(1);
GetBanner getBanner = new GetBanner();
RxApiClient rxApiClient = new RxApiClient();
// Observable<Pair<GetBannerResponse, GetTimelineResponse>>
が返ってくる
rxApiClient.responseFrom(getTimeline,getBanner)
....
リクエストのクラスはJSONになって
HTTP bodyに設定される
[
{
"params": {
"timelineId": 1
},
"method": "GetTimeline",
"jsonrpc": "2.0",
"id": "1"
},
{
"params": {},
"method": "GetBanner",
"jsonrpc": "2.0",
"id": "2"
}
]
複数のレスポンスが返ってくる + 

ハンドリングしてレスポンスを通知する
// 複数のレスポンスTupleに包んでRxに流す
// responseFrom内でTupleに包む処理をしてる
rxApiClient.responseFrom(getTimeline, getBanner)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<Pair<GetTimelineResponse, GetBannerResponse>>() {
@Override
public void call(Pair<GetTimelineResponse, GetBannerResponse> pair) {
// Tupleからレスポンスを取り出す
pair.getFirst(); // return GetTimelineResponse
pair.getSecond(); // retrun GetBannerResponse
}
});
Thanks!

More Related Content

PPT
シンボリックリンクを探る
PDF
raspi + soracom #pakeana33
ODP
LibreOffice 4 under NetBSD with pkgsrc
ODP
とっとるびー(2回目)発表資料
PDF
shinobu.apk #3
PDF
OnActivityResult - おまえら!もうonActivityResultでswitchとif書く時代は終わりだぞ!
PDF
Kotlinでマッチョする話
シンボリックリンクを探る
raspi + soracom #pakeana33
LibreOffice 4 under NetBSD with pkgsrc
とっとるびー(2回目)発表資料
shinobu.apk #3
OnActivityResult - おまえら!もうonActivityResultでswitchとif書く時代は終わりだぞ!
Kotlinでマッチョする話

Viewers also liked (20)

PDF
まったりAndroid Framework Code Reading #3
PDF
shinobu.apk #2
PDF
Gradle PluginとCIと俺
PDF
Inside Android N
PDF
まったりAndroid Framework Code Reading #4
PDF
Lightweight-Stream-APIのあるAndroidアプリ開発
PDF
Goodbye progress dialog mess on Android
PDF
Kotlinにお触り
PDF
Android Framework Code Readingのしおり ver 1.2
PDF
Androidの世界を離れて異文化留学してみた
PDF
Android Framework Code Readingのしおり ver 1.1
PDF
RxSwiftでの実装練習の記録ノートとはじめの一歩
PPTX
Kotlin 使いになりました
PDF
ElasticBeanstalk で新規事業を爆速ローンチする
PDF
Android Studio 2.3 New Features
PDF
Activity Transition Animation #potatotips 33
PDF
DroidKaigiアプリをSpoonで全画面スクショするぞい\(^o^)/
PPTX
Android json parser tutorial – example
PPTX
Retrofit2 &OkHttp 
でAndroidのHTTP通信が快適だにゃん
PPTX
[Growth hack]RakutenTravel App Development
まったりAndroid Framework Code Reading #3
shinobu.apk #2
Gradle PluginとCIと俺
Inside Android N
まったりAndroid Framework Code Reading #4
Lightweight-Stream-APIのあるAndroidアプリ開発
Goodbye progress dialog mess on Android
Kotlinにお触り
Android Framework Code Readingのしおり ver 1.2
Androidの世界を離れて異文化留学してみた
Android Framework Code Readingのしおり ver 1.1
RxSwiftでの実装練習の記録ノートとはじめの一歩
Kotlin 使いになりました
ElasticBeanstalk で新規事業を爆速ローンチする
Android Studio 2.3 New Features
Activity Transition Animation #potatotips 33
DroidKaigiアプリをSpoonで全画面スクショするぞい\(^o^)/
Android json parser tutorial – example
Retrofit2 &OkHttp 
でAndroidのHTTP通信が快適だにゃん
[Growth hack]RakutenTravel App Development
Ad

Similar to Android + JSON-RPC (20)

PDF
Twitter sphere of #twitter4j #twtr_hack
PDF
Knockout を用いた Firefox OS アプリケーションの開発
PDF
勉強会force#4 Chatter Integration
PDF
Let's begin WebRTC
PPTX
Develop Web Application with Node.js + Express
PDF
Microsoft Graph API Library for Go
PDF
Dart のコード自動生成の仕組みと、コード自動生成のパッケージを自作する方法について
PDF
OSSから学ぶSwift実践テクニック
PDF
RとWeb API
PPTX
Gunosy Go lang study #6 net http url
PPT
実社会で進められているサービスとLOD
PPTX
Google I/O 2016 報告会
PDF
WordBench京都 9月号:kintone×WordPressハンズオン
PDF
ハンズオン勉強会 はじめてのJavaScriptとSPARQL
PDF
Real world android akka
PPT
PHP, Now and Then 2011
PDF
JSONでメール送信 | HTTP API Server ``Haineko''/YAPC::Asia Tokyo 2013 LT Day2
PDF
var RAC3 = ReactiveCocoa + Swift @ ReactiveCocoa Tokyo #rac_tokyo 10/18
KEY
第5回LinkedData勉強会@yayamamo
PPTX
Pub/Sub model, msm, and asio
Twitter sphere of #twitter4j #twtr_hack
Knockout を用いた Firefox OS アプリケーションの開発
勉強会force#4 Chatter Integration
Let's begin WebRTC
Develop Web Application with Node.js + Express
Microsoft Graph API Library for Go
Dart のコード自動生成の仕組みと、コード自動生成のパッケージを自作する方法について
OSSから学ぶSwift実践テクニック
RとWeb API
Gunosy Go lang study #6 net http url
実社会で進められているサービスとLOD
Google I/O 2016 報告会
WordBench京都 9月号:kintone×WordPressハンズオン
ハンズオン勉強会 はじめてのJavaScriptとSPARQL
Real world android akka
PHP, Now and Then 2011
JSONでメール送信 | HTTP API Server ``Haineko''/YAPC::Asia Tokyo 2013 LT Day2
var RAC3 = ReactiveCocoa + Swift @ ReactiveCocoa Tokyo #rac_tokyo 10/18
第5回LinkedData勉強会@yayamamo
Pub/Sub model, msm, and asio
Ad

More from Shinobu Okano (17)

PDF
Gradle PluginとTwitterとズン ドコ キ・ヨ・シ!
PDF
ChromeとAndroidの過去・現在・未来
PDF
Android Dev Tools Knowledge
PDF
shinobu.apk #1
PDF
ChromeとAndroidの 過去・現在・未来 ver 0.1
PDF
5分で資料作ってSlideShareにアップロードする錬金術
PDF
Logcatの話
PDF
GarumとMeteoriteと私 3nd Edition ver0.04
PDF
Android Framework Code Readingのしおり
PDF
まったりAndroid framework code reading #2
PDF
隕石という名のスクリーンショットをSlackに落下させる話
PDF
Upload a screenshot to Slack
PDF
JobScheduler Code Reading
PDF
はじめる前に知っておきたいAndroidアプリ開発のポイント
PDF
『メルカリ』のアップデート監視 を支える(かもしれない)技術
PDF
Screenshots Test spoon + espresso
PDF
App Permissions
Gradle PluginとTwitterとズン ドコ キ・ヨ・シ!
ChromeとAndroidの過去・現在・未来
Android Dev Tools Knowledge
shinobu.apk #1
ChromeとAndroidの 過去・現在・未来 ver 0.1
5分で資料作ってSlideShareにアップロードする錬金術
Logcatの話
GarumとMeteoriteと私 3nd Edition ver0.04
Android Framework Code Readingのしおり
まったりAndroid framework code reading #2
隕石という名のスクリーンショットをSlackに落下させる話
Upload a screenshot to Slack
JobScheduler Code Reading
はじめる前に知っておきたいAndroidアプリ開発のポイント
『メルカリ』のアップデート監視 を支える(かもしれない)技術
Screenshots Test spoon + espresso
App Permissions

Android + JSON-RPC