Upgrade to Pro — share decks privately, control downloads, hide ads and more …

5分で作るモックサーバー

 5分で作るモックサーバー

DroidKaigi.collect { #[email protected] } の 5分LTで発表しました

satsukies

July 08, 2023
Tweet

More Decks by satsukies

Other Decks in Programming

Transcript

  1. 5分で作るモックサーバー
    DroidKaigi.collect { #[email protected] }
    satsukies

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  12. 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)
    }

    View Slide

  13. 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)
    }

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide