Slide 1

Slide 1 text

5分で作るモックサーバー DroidKaigi.collect { #5@Nagoya } satsukies

Slide 2

Slide 2 text

自己紹介 ● @satsukies (さつき) ○ twitter / github ● 前職: CyberAgent / ABEMA ○ Androidアプリエンジニア ● 現職: 株式会社DeployGate ○ Androidアプリエンジニア ○ フロントエンド/バックエンドもやってます

Slide 3

Slide 3 text

こういうこと、ありませんか ● API繋ぎこみしたい!! ○ だけど、バックエンドも同時開発進行中ですぐにできない...! ● エッジケースとか デバッグしたい!! ○ 任意 レスポンスをアプリに受け取らせてみたい ○ だけど正攻法だと思ったよりも大変かも...!

Slide 4

Slide 4 text

goでサーバー立てれ 意外とサクッといけるかも?

Slide 5

Slide 5 text

● OkHttp + RetrofitでAPI呼び出し 実装をしているAndroid App ● インターネットに繋がっているPC ○ 今回 MacOS環境で検証しています ● ちょっと試してみたいと思える心 必要なも

Slide 6

Slide 6 text

1. 開発環境を整えよう まず golangでコードがかける環境を用意しましょう すでにHomebrewを導入していれ 以下 1行実行でOK VS CodeやIntelliJ GoLandなど IDEがあるとちょっと楽 $ brew install go

Slide 7

Slide 7 text

2. go環境 構築 まず 作業用 ディレクトリを用意して移動 $ mkdir mock-server $ cd /path/to/mock-server

Slide 8

Slide 8 text

2. go環境 構築 go moduleを新規作成して、必要なファイルを生成しておきます $ go mod init mock-server go: creating new go.mod: module echo-server $ touch main.go response.json

Slide 9

Slide 9 text

$ ls go.mod main.go response.json 2. go環境 構築 ここまで作業すると、3つ ファイルが存在する状態になる ずです

Slide 10

Slide 10 text

3. 返したいレスポンスをJSONファイルに記述 生成しておいたresponse.jsonにJSONを記述する // response.json { "id": 12345, "message": "This message is send by mock-server" }

Slide 11

Slide 11 text

4. main.goにサーバー実装を記述 net/httpパッケージを使うと、とっても簡単に実装できます // main.go func main() { http.HandleFunc("/", handleRequest) http.ListenAndServe(":8080", nil) }

Slide 12

Slide 12 text

4. main.goにサーバー実装を記述 JSONファイルを読み出して、中身をそ ままWriteしちゃいます // main.go func handleRequest(w http.ResponseWriter, r *http.Request) { byteArray, _ := ioutil.ReadFile("response.json") w.Header().Set("Content-Type", "application/json; charset=utf-8") w.Write(byteArray) }

Slide 13

Slide 13 text

JSONファイルを読み出して、中身をそ ままWriteしちゃいます package main import ( "io/ioutil" "net/http" ) func main() { http.HandleFunc("/", handleRequest) http.ListenAndServe(":8080", nil) } func handleRequest(w http.ResponseWriter, r *http.Request) { byteArray, _ := ioutil.ReadFile("response.json") w.Header().Set("Content-Type", "application/json; charset=utf-8") w.Write(byteArray) }

Slide 14

Slide 14 text

5. 実際に動かしてみる go アプリケーション 動かす も簡単 $ go run main.go

Slide 15

Slide 15 text

5. 実際に動かしてみる localhost:8080 にアクセスすると....

Slide 16

Slide 16 text

6. ngrokを使って外部公開しよう ngrokというサービスを使うと、手元 環境を簡単に公開できます https://ngrok.com/

Slide 17

Slide 17 text

6. ngrokを使って外部公開しよう ngrok インストールもHomebrew経由で簡単にできます $ brew install ngrok // token追加 $ ngrok config add-authtoken {your_auth_token}

Slide 18

Slide 18 text

6. ngrokを使って外部公開しよう WebからSignUp後に提供されるコマンドを使ってログインすると使える $ brew install ngrok // token追加 $ ngrok config add-authtoken {your_auth_token}

Slide 19

Slide 19 text

6. ngrokを使って外部公開しよう ngrok http {port} で起動できます $ ngrok http 8080

Slide 20

Slide 20 text

7. Android Appを修正 Retrofit annotationに 相対/絶対パス以外に完全なURLも渡せる(!)

Slide 21

Slide 21 text

7. Android Appを修正 Retrofit annotationに 相対/絶対パス以外に完全なURLも渡せる A relative or absolute path, or full URL of the endpoint.

Slide 22

Slide 22 text

7. Android Appを修正 Retrofit annotationに 相対/絶対パス以外に完全なURLも渡せる @GET("/hoge") override suspend fun hoge(): HogeResponse { … } @GET("https://sample.com/foo") override suspend fun foo(): FooResponse { … }

Slide 23

Slide 23 text

7. Android Appを修正 Retrofit annotationに渡しているAPI pathをngrok URLで置き換える // before @GET("/hoge") override suspend fun hoge(): HogeResponse { … }

Slide 24

Slide 24 text

7. Android Appを修正 Retrofit annotationに渡しているAPI pathをngrok URLで置き換える // after @GET(“https://xxxx-yy-zzz.ngrok-free.app”) override suspend fun hoge(): HogeResponse { … }

Slide 25

Slide 25 text

超簡易的なモックサーバが これで動かせます🎉

Slide 26

Slide 26 text

まとめ ● Retrofitで呼び出し先を指定する方法 相対パスだけで ない ○ 絶対パス、完全URLも使える ● Goを使って簡易的なモックサーバーがサクッと作れる ○ 複雑で ない用途であれ 扱いやすいかも?! ● ngrokを活用することで簡単に外部公開できる ○ あくまでテスト用途にしておき、重要なデータ 扱わない ○ 有料プランで固定 URLやIP制限などもできる