[Salesforce]apex Rest APIでPOSTでデータを送信する

getでは送信したデータはすぐに取得できたのですが、
postでの送信方法とデータ取得方法がわからずに迷走しまいした。
結論は、送信側の話、だったのですが。

GETの場合は以下のコードで取得可能でした。
簡単。

送信データ

?userid=123&name=hoge

apex

@RestResource(urlMapping='/GetDataSample/test')

global with sharing class GetDataSampleAPI {
    @HttpGet
    global static String doGet(){
        RestRequest req = RestContext.request;
        String userid = req.params.get('userid');
        String name = req.params.get('hoge');
    }
}

実は、POSTの場合も、apexのコードは全く同じで取得する事が出来ました。
以下、取得出来たコードです。

@RestResource(urlMapping='/GetDataSample/test')

global with sharing class GetDataSampleAPI {
    @HttpPost
    global static String doPost(){
        RestRequest req = RestContext.request;
        String userid = req.params.get('userid');
        String name = req.params.get('hoge');
    }
}

ただし、送信する際にヘッダーを正しく指定してやったり、送信形式に注意してやる必要がありました。
PHPのcurlで実装していたのですが、大いに迷走していたのは、salesforce側の話ではなく、
PHPでの送信方法の問題でしたとさ…。

送信出来たコード
(このライブラリを使用して送信する前提)

$url = "$oauth->instance_url/services/apexrest/GetDataSample/test";
$curl = curl_init($url);

$POST_DATA = array(
    'userid' => '123',
    'hoge' => 'fugafuga'
);

curl_setopt($curl, CURLOPT_POST, TRUE);
curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($POST_DATA));
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-type: application/x-www-form-urlencoded;charset=UTF-8', "Authorization: OAuth " . $oauth->access_token));

$output= curl_exec($curl);
curl_close($curl);

ポイントは以下の2つです。

1)
Content-typeを、application/x-www-form-urlencodedという、POSTでデータを送信する際の標準タイプを指定しています。
通常はデフォルトでこれなのですが、salesforceのAPIにPOSTする場合は明示的に指定してやる必要があるようです。(たぶん)
ちなみに、apex restは、multipart/form-dataタイプはサポートしていないようです。

2)
1のタイプで指定してやると、送信するデータはuserid=123&hoge=fugafugaのように、GETと同じ形で取得できるようになるようです。
なので送信する際にそのような形に変換してやる必要があるようで、それが以下の記述となります。

curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($POST_DATA));

参考

PHP小ネタ – PHPのcurlでPOST – Qiita

   このエントリーをはてなブックマークに追加