GoMobileで作ったModuleとその周辺のサンプルコード
Go Java
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
GomobileAndroidSample
httpRequest
server
README.md

README.md

GoMobileSample

GoMobileで作ったModuleとその周辺のサンプルコード

構成

  • GomobileAndroidSample Androidのソースコード
  • httpRequest Androidに組み込むGomobileで作ったmoduleとコード
  • server リクエストを受け取るサーバーのソースコード

以下LTで使った資料

GoMobileでModuleを作った話

株式会社アスクリード 水谷 健太

Twitter : @mizutani0222 Facebook : kenta.mizutani.56 Androidエンジニア PHPとかちょっとかじってる

なんで?

iOSとAndroidで共通化できたらいいなって思った iOSのライブラリ作れたら、iOS覚える気になると思った

やったこと

WebAPIを呼び出して、受け取ったJSONを返す

これだけ!

良かったこと

サーバー側のAPIが出来てなくても、ライブラリで適当な戻り値を返してあげれば、Android本体のコードにまったく影響がなかった。

ビビってること

まだ実験段階なので、やっぱりやめたとか言われたら泣ける

苦労したこと

検索しづらい

郷ひろみ公式 GO- MOBILEとか出てくる スクリーンショット 2016-03-14 22.19.53.png (636.1 kB)

これだけ!

本当に苦労したこと

publicなメソッドの引数や戻り値に配列が渡せないこと

サンプルコード

リクエストのパラメーターを指定するところ

func SetParams(name string, val string) {
	params[name] = val;
}

リクエストパラメーターを設定

func HttpPost(api_url string) string {
	// 送信用パラメーターを作成
	bparams := &bytes.Buffer{}
	writer := multipart.NewWriter(bparams)

	// パラメーターを書き込んでいく
	for key, val := range params {
		fmt.Println(key + ":" + val)
		file, err := os.Open(val)
		// エラーだった場合ファイルではない
		if err != nil {
			// 通常のパラメーターとして書き込み
			_ = writer.WriteField(key, val)
		} else {
			fmt.Println("is File")
			// ファイルとして書き込み
			part, err := writer.CreateFormFile(key, filepath.Base(val))
			if err != nil {
				return getErrorJSON(901, "ファイルの送信に失敗しました")
			}
			_, err = io.Copy(part, file)
		}
	}
	err := writer.Close()

リクエストを作る

	req, err := http.NewRequest(
        "POST",
        getHttpUrl(api_url),
        bparams)

	if err != nil {
		return getErrorJSON(903, "通信に失敗しました")
	}

ヘッダーの設定

	// 持続接続を設定
	req.Header.Set("Connection", "Keep-Alive")

	// Content-Type 設定
	req.Header.Add("Content-Type", writer.FormDataContentType())

    // Basic認証がある場合はコメントを外す
//    req.Header.Add("Authorization", getBasicAuth(auth_id, auth_pass))

送信部分

    // タイムアウトを15秒に設定
    client := &http.Client{ Timeout: time.Duration(15 * time.Second) }
    resp, err := client.Do(req)
    if err != nil {
    	fmt.Println(err.Error())
    	return getErrorJSON(500, err.Error())
    }

    defer resp.Body.Close()

受け取った情報をチェック

	body, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		fmt.Println(err.Error())
		return getErrorJSON(904, err.Error())
	}

	// ステータスによるエラーハンドリング(正常終了じゃなければ)
	if resp.StatusCode != http.StatusOK {
		fmt.Printf("%d", resp.StatusCode)
		return getErrorJSON(resp.StatusCode, resp.Status)
    }

	return string(body)
}

Androidに組み込む

  1. メニュー File > New > New Module... を選択、Import .JAR/.AAR Package でライブラリのモジュールを作る。
  2. メニュー File > Project Structure... を選択、 ライブラリを使用するアプリケーションのモジュールを選択し、 「Dependencies」のタブを開き、 プラス記号「+」アイコンを押し「Module Dependency」を選ぶ。 手順1で追加したモジュールを選択。

コード

switch (v.getId()) {
    // リクエスト1ボタンが押された
    case R.id.request1_btn:
        PostSample.SetParams("param1", param1.getText().toString());
        response.setText(PostSample.HttpPost("/apisample"));
         break;
    // リクエスト2ボタンが押された
    case R.id.request2_btn:
        PostSample.SetParams("param2", param2.getText().toString());
        response.setText(PostSample.HttpPost("/apisample"));
         break;
}

こんな感じの画面

Screenshot_2016-03-15-19-39-13.png (85.5 kB)

動いた!

Screenshot_2016-03-15-19-15-22.png (90.5 kB)

なんかおかしい

Screenshot_2016-03-15-19-15-22.png (120.2 kB)

param1が消えてない!

これは、一回セットすると、アプリ落とすまで消えないんだね。 なるほど。

じゃあ

API呼び出す前に必ず初期化だ

// とにかく最初に呼び出す
func Initialize() {
	params = map[string]string{}
}

Androidも修正

switch (v.getId()) {
    // リクエスト1ボタンが押された
    case R.id.request1_btn:
        PostSample.Initialize();   // ここ追加
        PostSample.SetParams("param1", param1.getText().toString());
        response.setText(PostSample.HttpPost("/apisample"));
         break;
    // リクエスト2ボタンが押された
    case R.id.request2_btn:
        PostSample.Initialize();  // ここ追加
        PostSample.SetParams("param2", param2.getText().toString());
        response.setText(PostSample.HttpPost("/apisample"));
         break;
}

できた

Screenshot_2016-03-15-19-23-35.png (113.6 kB)

iOSに追加

担当者の方、頑張って下さい!

frameworkってファイルができるみたいです。

まとめ

超簡単に導入できた!

コードや資料は
Githubに置いときましたー

Github : https://github.com/kmizutani0222/GoMobileSample

参考