2016年5月31日火曜日

RESTコントロールを使いこなそう!(3)

RESTコントロールを使いこなそう 連載

前回はGETメソッドの実装を行いました。

今回は、POSTメソッドで文書の登録を行う実装を説明します。

リクエストボディの取得

GETはリソース(情報)の取得に使用するので、リクエストでサーバーに渡す情報は少ない場合が多いです。ですので、URLパラメータで事足ります。

しかし、POSTなど文書の保存や更新に関しては、多くの情報をサーバーに送る必要があります。 URLパラメータに情報を入れると、URLが長大になってサーバーが受け取れなくなってしまう可能性があります。

通常、POSTでデータを送る場合は、HTTPリクエストのボディと呼ばれるところに値を入れます。

ボディに入れる値は、Web画面のフォーム値やJSONのようなプレーンテキスト、ファイルのアップロードであればバイナリデータなどです。今回は、この連載の1回めで説明したように、JSON文字列がボディに入っていることを想定するAPIにします。

Content Type の設定

HTTPリクエストのボディに JSON が入っていることを前提とするので、RESTコントロールのプロパティ"requestContentType"に"application/json"を指定します。

これは連載第1回目で指定しました。

content-type

リクエストボディのJSONを取得する

通常だと、リクエストボディの値を取得してJSONとして解釈し、オブジェクトに置き換える必要があります。

RESTコントロールを利用すると、"requestVar"プロパティに任意の変数名を指定するだけで、その処理を行ってくれます。

例えば、"requestVar"プロパティに"json"という値を設定します。

HTTPのリクエストボディが下記とすると、

// リクエストJSON
{
  "name": "kenji ebihara",
  "tag": "xpages",
  "title": "XPagesでOnsenUIが使いたいよ"
}

サーバーサイドJSでは、下記のようにリクエストのデータにアクセスできます。

// サーバーサイドJS
print(json.name); // kenji ebihara
print(json.tag); // xpages

非常に簡単にリクエストの情報を扱えますね。

POSTの処理を書く

"doPost"プロパティに処理を書きます。

GETの時と同じように、主要な処理はスクリプトライブラリに書きましょう。

var QuestionApi = {
 GetList: function(category){
        //省略:前回の GetList の処理
    Create: function(inputObj){
  var qaDb = session.getDatabase('','ebihara/qa9.nsf');
        var doc = qaDb.createDocument();
        //実際には、入力値の検証が必要
        doc.replaceItemValue('form', 'question');
        doc.replaceItemValue('name', inputObj.name);
        doc.replaceItemValue('tag', inputObj.tag);
        doc.replaceItemValue('title', inputObj.title);
        doc.save(false,false);
        var result = {
            result: true,
            message: ""
        };
        return toJson(result);
    }
}

この例ではCreate関数を定義しています。文書の内容が入った"inputObj"を引数としています。

戻り値は、"result"にtrueが入ったJSONが返されます。

ここでは省きましたが、実際には入力値の検証を行って、NGであれば"result"をfalseとして、messageにその原因等を返すのが良いでしょう。

doPostの内容は下記になります。

return QuestionApi.Create(json);

上で説明したように、"requestVar"に"json"と指定したことにより、リクエストのJSONがオブジェクト化されて"json"というオブジェクトが自動的に生成されるので、それを上の関数の引数に渡しています。

そして戻り値の結果のJSON文字列を返しています。

次回は

RESTサービスを書いただけではつまらないので、実際にRESTコンソールアプリを使って、動作確認してみたいを思います。

0 件のコメント:

コメントを投稿