SNS(AWS)のHTTPハンドラーとしてforce.com Sitesを使おうと思って、Visualforce + Apexで試行錯誤したものの、PageReferenceのgetParametersはhttpのrequestBodyを取ってくるわけじゃなく、key=value形式のパラメータしか取ってこれません。つまりVFを使った方法だとJSONをrequestBodyに持ってくるようなSNSのNotificationには対応していません。
そもそも、上記の方法だとPOSTとGETの見分けもつけれないので、そこら辺もダメです。
で、色々とWeb上を探していたらSites + Apex REST APIでいけるらしいことが判明。
- http://www.wadewegner.com/2013/03/creating-anonymous-rest-apis-with-salesforce-com/
- http://www.mkpartners.com/support/Exposing-Apex-REST-Web-Servies-via-Force-com-Sites
- http://blogs.developerforce.com/developer-relations/2012/02/quick-tip-public-restful-web-services-on-force-com-sites.html
SNSのCreateSubscriptionで[https://[SitsDomain]/services/apexrest/MyRestContextExample]に対してPOSTの検証を行いました。
@RestResource(urlMapping='/MyRestContextExample/*')
global with sharing class MyRestContextExample {
@HttpPost
global static Boolean doPost() {
RestRequest req = RestContext.request;
RestResponse res = RestContext.response;
system.debug(req.requestBody.ToString());
system.debug(req.headers);
system.debug(req.params);
system.debug(req.resourcePath);
return true;
}
}
結果、ちゃんとheaderの値も取ってこれて、requestBodyもjson形式でちゃんと取得できてました。
素晴らしい!っていうかこれ裏ワザですかね?ApexのReferenceでは引っかからなかった…。
注意点としては、本来OAuth認証でAuthorizationヘッダを設定しないとできないような操作がサイトゲストユーザとして認証を必要とせずにできてしまうので、万が一URL等を第三者に知られてしまっても悪影響を及ぼさないようなセキュアな設計が必要になります。
headerもrequestBodyも使い放題で、自前Signatureとかも容易に出来ちゃいます。