Entertainer Engineering

人を楽しませられる技術者を目指すあおかびんのブログ

XamarinのASP.NET MVCフレームワークを使ってWeb APIサーバーを作った話

どうもこんにちは、aokabinです。

今回はXamarinのASP.NET MVCフレームワークを使ってWeb APIサーバーを作った話をしたいと思います。(タイトルのまんま)

しかし資料が少なすぎて非常に困った。

Xamarinをインストールして、開発環境が整っている事前提で話を進めていきたいと思います。

手順としてはこんな感じ↓
1.XamarinでASP.NET MVC を選択してプロジェクトを作る
2.ハンドラーの作り方というか付け方と言うか
3.POSTで受け取ったデータをJson形式でデータを返す

1.
これはそのまま描いてあるように、

Xamarinのファイル>新規>ソリューション

にてC#の欄からASP.NETの「ASP.NET MVC Project」を選択してプロジェクトをクリエイト。
すると色々なファイルやらフォルダやらがまとめて出て来るかと思います。
とりあえず、この時点で一回実行してみましょう。

もし、System.Web.Mvcがうんたらというエラーが出てきたら、
Project名(master)>Project名>参照>From Packages>System.Web.Mvcのところにカーソルを持っていき、パッケージの左側にある歯車ボタンをおして、「最新の状態に更新」を選んでおきましょう。

他のでエラーが出ているならそれを更新してみましょう。
更新してもダメならもう一回だけプロジェクトを作り直して更新し直して見てください。
それでは次に再生ボタンを押して実行してみましょう。

うまく実行できたらブラウザが立ち上がって、簡単なHTMLが表示されるはずです。
ここまできたら次にいきましょう!

2.
ハンドラーというのは、URIでリクエストを送るときに使われる
http://hogehoge.com/こことか/そのまたこことか/index.html
のことですね、多分。

その辺りを設定するために、一度確認しておきましょう。

Xamarinのソリューションビュー部分から「Views」というものを探し出してみてください。その中に「Home」というフォルダがあって、「Index.aspx」というファイルがあるはずです。
それでは、プログラムを実行して、立ち上がったページのURIに/Home/Indexと追記してみてください。(http://127.0.0.1:8080/Home/Index)

すると、遷移する前と同じ画面が表示されたかと思います。

どうなっているのかを説明するために、次はソリューションビューの中から「Controllers」というフォルダを探してください。
そこには「HomeController.cs」というファイルがあるかと思います。その中身を見てみると、次のようなソースコードが見つかるかと思います。

public ActionResult Index () {
    var mvcName = typeof(Controller).Assembly.GetName ();
    var isMono = Type.GetType ("Mono.Runtime") != null;
    ViewData ["Version"] = mvcName.Version.Major;
    ViewData ["Runtime"] = isMono ? "Mono" : ".NET";
    return View ();
}

実は、このIndex()という関数がHome/Indexで呼ばれるハンドラーとなっていた訳です。
ちなみに、このHomeというのは、ControllerのクラスであるHomeControllerクラスに属するという意味(たぶん)です。

それでは今回はこのIndex関数をPostリクエストからJsonデータを返すようにいじってみましょう。

3.
先ほどのIndex関数の上に[HttpPost]を追記してみましょう。
続いてActionResult→JsonResultに変更。
POSTリクエストで受け取った値は、次のような関数で受け取る事ができます。

string name = Request.Form.Get("name");

これはname変数の中に、POSTリクエストで受け取ったinputのnameが"name"のものの値を入れる、という意味です。(ややこしい)
ここでaokabinは、一度string型でJSON形式っぽく書いてreturnさせています。しかし、絶対もっといいやり方があると思う。

string returnJson = "{name : " + name + "}";
return Json(returnJson);

こんな感じのコードになります。

[HttpPost]
public JsonResult Index () {
    string name = Request.Form.Get ("name");
    string returnJson = "{name:" + name + "}";
    return Json(returnJson);
}

最後のJson(returnJson)は、結果をJson形式にキャストするという関数になります。たしか、Json.NETとかのパッケージを入れなきゃいけなかったかもしれない。

パッケージの入れ方は調べれば出てくるんですが、プロジェクト>Add Packagesを選んで、トグルがOfficial NuGet Galleryになっていれば、検索ボックスから検索してAdd Packageできると思います。

そんなトグルがなければ、一番したまでスクロールして、パッケージ>Sourcesを選択して、追加:名前「Official NuGet Gallery」、URL「https://www.nuget.org/api/v2」にしてAdd Sourceして、念のためXamarinを再起動してください。うまくいっていればプロジェクト>Add Packagesを選ぶとOfficial NuGet Galleryが出てきているはずです。

うまくいってなければググってくだされ。

Viewsが無いからPostできないじゃん!
という方のために、以下のコマンドをご用意致しました!

curl -F "name=YourName" http://localhost:8080/Home/Index

よかったらterminal開いて打ち込んでみてください。
いい結果が得られる事を期待しています!
というわけで、ASPAPIサーバー作りでした。

それではまた。

bundle installが通らなくて困った話

どうもこんにちはaokabinです。

railsを使ってドットインストールのチュートリアルをやろうと思ったところ

rails new myapp

を実行したところ

To eliminate this warning, please install libyaml and reinstall your ruby.

こんなエラーが出てきました。

libyamlがないならinstallしてやろうと思い、

brew install libyaml

を実行したところ

Warning: libyaml-0.1.6 already installed

おいお前入っとるやないけ!!

ふとrubyのバージョンが悪いのかとおもいrbenvで入っているモノを色々いじっていると、チュートリアルで使っている2.0.0-p247をinstallしたときにyamlをinstallするような動きを始めました。

んで、installが終わったところでバージョンを変えずに(使用時のバージョンは2.0.0-p451)でbundle installしたところ動きました…。

さっきまで入ってたyamlは一体…?

とりあえずメモ

rbenvでrubyのバージョンが切り替わらない時

どうも、aokabinです。

rbenvでバージョン管理、凄い便利ですよね(実力不足で活かした事無いけど)

この間rbenvを導入したらどうもバージョンが切り替わらなかったのでメモ

rbenv global 2.1.1
rbenv version
2.0.0hogehoge
rbenv local --unset
rbenv rehash

2.0.0になってた時は「は?」ってなったけど
rbenv local --unsetでlocalの保存を削除したらちゃんと動いてくれました

超単純…