Perl で Salesforce
藤原 俊一郎 <fujiwara@cpan.org>
Salesforce とは
CRM をクラウドで提供する
昔 ASP
今 SAAS == Software as a Service
こんな画面
PAAS?
Platform as a Service
クラウド上に独自のアプリケーションを構築
- Custom Object
- RDB のようなテーブル
- APEX code
- Java のような言語
Force.com Sites
エンドユーザ向けの公開サイトが作れる
2009年6月リリース
https://eco-points.secure.force.com/WebFormInput2
↑共用 SSL のみ (今のところ)
独自 SSL でやりたい
普通にサイトを立てる
SOAP API で Salesforce と接続
Perl で API を叩く
旺文社 えいごであそぼ http://eigodeasobo.com/
購入申し込みフォーム https://eigodeasobo.com/form...
User | | HTTPS | [ eigodeasobo.com ] | | SOAP over HTTPS | (( Salesforce ))
Perl から API を使う
- Salesforce
- DBD::Salesforce
- WWW::Salesforce
WWW::Salesforce 以外は 2006 年以降更新なし
login()
use WWW::Salesforce;
$sf = WWW::Salesforce->login(
username => $user,
password => $password . $token,
);
create()
$response = $sf->create(
type => "Person__c",
firstName__c => "Shunichiro",
lastName__c => "Fujiwara",
);
$result = $response->valueof("//createResponse/result");
{
success => 'true',
id => 'a0270000005C01VAAS',
}
retrieve()
$response = $sf->retrieve(
type => "Person__c",
fields => "Id, firstName__c, lastName__c",
ids => [ "a0270000005C01VAAS" ],
);
$result = $response->valueof("//retrieveResponse/result");
bless( {
Id => [ 'a0270000005C01VAAS', 'a0270000005C01VAAS' ],
type => 'Person__c',
firstName__c => 'Shunichiro',
lastName__c => 'Fujiwara',
}, 'sObject' );
update(), delete()
略
Key Value Store?
No!
SOQL
SQL に似た問い合わせ言語
query()
$soql = "SELECT
firstName__c, lastName__c
Company__r.Name
FROM Person__c
WHERE lastName__c='Fujiwara'";
$response = $sf->query( query => $soql );
@records = $response->valueof(
"//queryResponse/result/records"
);
bless( {
type => 'Person__c',
firstName__c => 'Shunichiro',
lastName__c => 'Fujiwara',
Company__r' => bless( {
Name => 'Topicmaker',
type => 'Company__c'
}, 'sObject' ),
}, 'sObject' );
参照項目で JOIN
ハマりどころ
- 型
- API 回数制限と速度
- query で取得できる上限
- 安定性
型
ユーザ定義オブジェクトは型を明示
WWW::Salesforce::Constants->register_type(
"Person__c", "firstName__c", "xsd:string",
);
API 回数制限と速度
- 5000回 / user / day
- 超過すると(APIで)なにもできない
- user 増やすと課金増
- 200~300 ms / req
接続を使いまわす
login()
結果にセッションID
シリアライズ可能
cache して使いまわす
接続確認しない
$sf->getServerTimestamp()
成功しても次は??
無駄なのでやらない
一度に複数レコードを扱う
retrieve( ids => \@id )
upsert()
- 存在すれば update
- 存在しなければ create
cache する
すべてのオブジェクトに unique id
query()
で取得できる上限
- 2000件
queryMore()
で「さっきの続き」
$response = $sf->query( query => $soql );
$locator = $response->valueof("//queryLocator");
$sf->queryMore( queryLocator => $locator );
安定性
- サーバはアメリカ
- 時々繋がらない
更新は job queue で
TheSchwartz, Q4M, Q4Pg::Lite etc...
計画メンテナンスへの対処
24時間 365日無停止 ではない
月1回程度、数時間停止
まとめ
- Salesforce は API で Perl から使える
- RDB 風に扱える
- 運用で頑張る><