ApexRESTにてPOSTで送信された配列のデータを受け取る

RestApexを作成していて、配列でPOSTした値はどうやって取得するのかを調べてみた。

例えば、POSTでidというパラメータで送信した内容は以下のようにして取得可能。

RestRequest req = RestContext.request;
String id = req.params.get('id');

しかし配列だとこれでは取得できなかった。

送信データ

$value = [
  'hoge'=>['1', '2', '3']
];

受信

RestRequest req = RestContext.request;
String id = req.params.get('hoge');  //null

なので、どのようにしてデータがわたっているのかを出力させてみた。

送信したデータ

$value = [
  'id'=>'hoge',
  'arr'=>['1', '2', '3']
];

出力させたコード

RestRequest req = RestContext.request;
System.debug(req.params);

出力結果

{arr[0]=1, arr[1]=2, arr[2]=3, id=hoge}

どうやらちゃんとデータは受け取れているよう。
このreq.paramsで受け取るデータの型はMapになっているよう。
以下のように出来る。

RestRequest req = RestContext.request;
Map<String, String> p = req.params;

ということはキーを取得できるし、キーから中身を全て取り出す事もできる。


そんなわけで、かなり無理矢理だけど、指定したキーの中身を取り出す関数を作ってみた。
配列で受け取る場合はフォームではチェックボックス、SF上では複数選択リスト、になるので、
SFの形式に合わせて、;セミコロン区切りの文字列として返すようにした。

1
2
3
4
5
6
7
8
9
10
11
12
13
public String convertArrayPostData(Map<String, String> val, String target){
    String res = '';
    for(String sKey : val.keySet()){
        Integer c = sKey.indexOf('[');
        if(c == -1) continue;
        String key = sKey.left(c);
        if(key == target){
            res += val.get(sKey) + ';';
        }
    }
    if(res != '') res = res.removeEnd(';');
    return res;
}

上記のarrというキーのデータを取り出す場合は以下のように。

RestRequest req = RestContext.request;
Map<String, String> p = req.params;
String arrs = convertArrayPostData(p, 'arr');  //1;2;3
   このエントリーをはてなブックマークに追加