はじめに
Salesforceに対して、様々な操作を行えるSalesforce REST APIというものがあります。
Salesforce REST APIを使用する事で、RubyからSalesforceカスタムオブジェクトにレコードを追加したり、レコードを取得したりといった操作が可能です。
RubyからSalesforce REST APIを実行する事で、Salesforceカスタムオブジェクトにレコードを追加するサンプルプログラムを記します。
また、Salesforceカスタムオブジェクトに登録したレコード一覧を表示するサンプルプログラムも合わせて記します。
実行環境
RubyからSalesforce REST APIを呼び出す環境については、以下の手順を参考にして、AWS EC2インスタンス(Amazon Linux)に作成しました。
http://qiita.com/na0AaooQ/items/d7f814b184c6c1bd9d9c
レコード追加対象のSalesforceカスタムオブジェクト(カスタムオブジェクト名: QuickStart__c)については、以下の手順で作成したものを使用します。また、EC2インスタンスからSalesforce REST APIを呼び出す為のSalesforce OAuth設定も以下をご参照下さい。
http://qiita.com/na0AaooQ/items/157c28a80948c4b97bed
Salesforce REST API接続に使用したRubyのGem
RubyからSalesforce REST APIの呼び出しについては、RubyのGemである 「databasedotcom」を使用させて頂きました。ありがとうございました。
https://github.com/heroku/databasedotcom
※どうやら現在、Salesforceへの接続時に使用が推奨されているGemは「databasedotcom」ではなく「restforce」らしいです。後日こちらのGemを使ったSalesforceへの接続も検証してみる予定です。
https://github.com/ejholmes/restforce
↓
2017年3月11日 追記
「restforce」を使用してSalesforceカスタムオブジェクトへレコード追加する方法を以下にまとめました。
http://qiita.com/na0AaooQ/items/bf9a33d76b7120522389
今回の例では「databasedotcom」を使用してSalesforceへ接続します。
EC2インスタンス(Amazon Linux)へのRubyインストール
(1) EC2インスタンス(Amazon Linux)にRubyをインストールします。
以下の手順でEC2インスタンス(Amazon Linux)にRubyをインストールします。
EC2インスタンス(Amazon Linux)へのdatabasedotcom(Gem)インストール
(2) .bashrcにSalesforce REST API接続用の設定を追加します。
[ec2-user@example-ruby-sinatra-server ~]$ cp -p /home/ec2-user/.bashrc /home/ec2-user/.bashrc.ORG
[ec2-user@example-ruby-sinatra-server ~]$ diff /home/ec2-user/.bashrc /home/ec2-user/.bashrc.ORG
[ec2-user@example-ruby-sinatra-server ~]$
[ec2-user@example-ruby-sinatra-server ~]$ vi /home/ec2-user/.bashrc
(末尾に以下を追加する)
### Sandbox環境へ接続する場合のAPIエンドポイント
##export DATABASEDOTCOM_HOST="test.salesforce.com"
### 本番環境へ接続する場合のAPIエンドポイント
export DATABASEDOTCOM_HOST="login.salesforce.com"
export DATABASEDOTCOM_CLIENT_ID="前述の「コンシューマ鍵」(OAuthコンシューマキー)を記載します。"
export DATABASEDOTCOM_CLIENT_SECRET="前述の「コンシューマの秘密」(OAuthコンシューマシークレット)を記載します。"
export DATABASEDOTCOM_CLIENT_USERNAME="salesforce_api_testuser@**********.salesforce.example.com"
export DATABASEDOTCOM_CLIENT_AUTHENTICATE_PASSWORD="APIを有効化しているSalesforceユーザアカウントのパスワードを記載します。"
(3) .bashrcに追加した環境変数を読み込みます。
[ec2-user@example-ruby-sinatra-server ~]$ source /home/ec2-user/.bashrc
[ec2-user@example-ruby-sinatra-server ~]$
(4) EC2インスタンス(Amazon Linux)に/home/ec2-user/select_salesforce_api_testディレクトリを作成し、databasedotcom(Gem)をインストールします。
今回の例では、レコード追加とレコード表示プログラムを各ディレクトリに作成していく事にします。
プログラム内容 | 作成するディレクトリ名 |
---|---|
カスタムオブジェクトにレコードを追加するプログラム | /home/ec2-user/insert_salesforce_api_test |
カスタムオブジェクトのレコードを表示するプログラム | /home/ec2-user/select_salesforce_api_test |
[ec2-user@example-ruby-sinatra-server ~]$ hostname
example-ruby-sinatra-server
[ec2-user@example-ruby-sinatra-server ~]$ id
uid=500(ec2-user) gid=500(ec2-user) groups=500(ec2-user),10(wheel)
[ec2-user@example-ruby-sinatra-server ~]$ pwd
/home/ec2-user
[ec2-user@example-ruby-sinatra-server ~]$ mkdir /home/ec2-user/select_salesforce_api_test
[ec2-user@example-ruby-sinatra-server ~]$ cd /home/ec2-user/select_salesforce_api_test
[ec2-user@example-ruby-sinatra-server select_salesforce_api_test]$ pwd
/home/ec2-user/select_salesforce_api_test
[ec2-user@example-ruby-sinatra-server select_salesforce_api_test]$ ls -lrta /home/ec2-user/select_salesforce_api_test/
合計 8
drwx------ 5 ec2-user ec2-user 4096 12月 20 01:00 ..
drwxrwxr-x 2 ec2-user ec2-user 4096 12月 20 01:00 .
[ec2-user@example-ruby-sinatra-server select_salesforce_api_test]$
Gemfileを作成します。
[ec2-user@example-ruby-sinatra-server select_salesforce_api_test]$ bundle init
Writing new Gemfile to /home/ec2-user/select_salesforce_api_test/Gemfile
[ec2-user@example-ruby-sinatra-server select_salesforce_api_test]$
[ec2-user@example-ruby-sinatra-server select_salesforce_api_test]$ ls -lrta /home/ec2-user/select_salesforce_api_test/
合計 12
drwx------ 5 ec2-user ec2-user 4096 12月 20 01:00 ..
-rw-r--r-- 1 ec2-user ec2-user 75 12月 20 01:00 Gemfile
drwxrwxr-x 2 ec2-user ec2-user 4096 12月 20 01:00 .
[ec2-user@example-ruby-sinatra-server select_salesforce_api_test]$
念の為、Gemfileをバックアップします。
[ec2-user@example-ruby-sinatra-server select_salesforce_api_test]$ cp -p /home/ec2-user/select_salesforce_api_test/Gemfile /home/ec2-user/select_salesforce_api_test/Gemfile.ORG
[ec2-user@example-ruby-sinatra-server select_salesforce_api_test]$ diff /home/ec2-user/select_salesforce_api_test/Gemfile /home/ec2-user/select_salesforce_api_test/Gemfile.ORG
[ec2-user@example-ruby-sinatra-server select_salesforce_api_test]$
[ec2-user@example-ruby-sinatra-server select_salesforce_api_test]$ cat /home/ec2-user/select_salesforce_api_test/Gemfile
# frozen_string_literal: true
source "https://rubygems.org"
# gem "rails"
[ec2-user@example-ruby-sinatra-server select_salesforce_api_test]$
Gemfileにdatabasedotcom( https://github.com/heroku/databasedotcom )を追記します。
[ec2-user@example-ruby-sinatra-server select_salesforce_api_test]$ echo 'gem "databasedotcom"' >> /home/ec2-user/select_salesforce_api_test/Gemfile
[ec2-user@example-ruby-sinatra-server select_salesforce_api_test]$
[ec2-user@example-ruby-sinatra-server select_salesforce_api_test]$ cat /home/ec2-user/select_salesforce_api_test/Gemfile
# frozen_string_literal: true
source "https://rubygems.org"
# gem "rails"
gem "databasedotcom"
[ec2-user@example-ruby-sinatra-server select_salesforce_api_test]$
[ec2-user@example-ruby-sinatra-server select_salesforce_api_test]$ diff /home/ec2-user/select_salesforce_api_test/Gemfile /home/ec2-user/select_salesforce_api_test/Gemfile.ORG
5d4
< gem "databasedotcom"
[ec2-user@example-ruby-sinatra-server select_salesforce_api_test]$
databasedotcom(Gem)がまだインストールされていない事を確認します。
[ec2-user@example-ruby-sinatra-server select_salesforce_api_test]$ bundle list
Could not find gem 'databasedotcom' in any of the gem sources listed in your Gemfile or available on this machine.
[ec2-user@example-ruby-sinatra-server select_salesforce_api_test]$
[ec2-user@example-ruby-sinatra-server select_salesforce_api_test]$ bundle list | grep databasedotcom
Could not find gem 'databasedotcom' in any of the gem sources listed in your Gemfile or available on this machine.
[ec2-user@example-ruby-sinatra-server select_salesforce_api_test]$
databasedotcom(Gem)をインストールします。
[ec2-user@example-ruby-sinatra-server select_salesforce_api_test]$ pwd
/home/ec2-user/select_salesforce_api_test
[ec2-user@example-ruby-sinatra-server select_salesforce_api_test]$ bundle install --path vendor/bundle
Fetching gem metadata from https://rubygems.org/..............
Fetching version metadata from https://rubygems.org/.
Resolving dependencies...
Installing concurrent-ruby 1.0.3
Installing i18n 0.7.0
Installing minitest 5.10.1
Installing thread_safe 0.3.5
Installing json 2.0.2 with native extensions
Installing multipart-post 2.0.0
Using bundler 1.13.2
Installing tzinfo 1.2.2
Installing activesupport 5.0.0.1
Installing databasedotcom 1.3.5
Bundle complete! 1 Gemfile dependency, 10 gems now installed.
Bundled gems are installed into ./vendor/bundle.
[ec2-user@example-ruby-sinatra-server select_salesforce_api_test]$
databasedotcom(Gem)がインストールされた事を確認します。
[ec2-user@example-ruby-sinatra-server select_salesforce_api_test]$ bundle list | grep databasedotcom
* databasedotcom (1.3.5)
[ec2-user@example-ruby-sinatra-server select_salesforce_api_test]$
[ec2-user@example-ruby-sinatra-server select_salesforce_api_test]$ bundle list
Gems included by the bundle:
* activesupport (5.0.0.1)
* bundler (1.13.2)
* concurrent-ruby (1.0.3)
* databasedotcom (1.3.5)
* i18n (0.7.0)
* json (2.0.2)
* minitest (5.10.1)
* multipart-post (2.0.0)
* thread_safe (0.3.5)
* tzinfo (1.2.2)
[ec2-user@example-ruby-sinatra-server select_salesforce_api_test]$
[ec2-user@example-ruby-sinatra-server select_salesforce_api_test]$ pwd
/home/ec2-user/select_salesforce_api_test
[ec2-user@example-ruby-sinatra-server select_salesforce_api_test]$ ls -lrta /home/ec2-user/select_salesforce_api_test/
合計 28
drwx------ 5 ec2-user ec2-user 4096 12月 20 01:00 ..
-rw-r--r-- 1 ec2-user ec2-user 75 12月 20 01:00 Gemfile.ORG
-rw-r--r-- 1 ec2-user ec2-user 96 12月 20 01:01 Gemfile
drwxrwxr-x 2 ec2-user ec2-user 4096 12月 20 01:01 .bundle
drwxrwxr-x 3 ec2-user ec2-user 4096 12月 20 01:01 vendor
-rw-rw-r-- 1 ec2-user ec2-user 524 12月 20 01:02 Gemfile.lock
drwxrwxr-x 4 ec2-user ec2-user 4096 12月 20 01:02 .
[ec2-user@example-ruby-sinatra-server select_salesforce_api_test]$
(5) EC2インスタンス(Amazon Linux)に/home/ec2-user/insert_salesforce_api_testディレクトリを作成し、databasedotcom(Gem)をインストールします。
[ec2-user@example-ruby-sinatra-server ~]$ mkdir /home/ec2-user/insert_salesforce_api_test
[ec2-user@example-ruby-sinatra-server ~]$ cd /home/ec2-user/insert_salesforce_api_test
[ec2-user@example-ruby-sinatra-server insert_salesforce_api_test]$
[ec2-user@example-ruby-sinatra-server insert_salesforce_api_test]$ pwd
/home/ec2-user/insert_salesforce_api_test
[ec2-user@example-ruby-sinatra-server insert_salesforce_api_test]$
前述の手順(4)を参考にして、databasedotcom(Gem)をインストールします。
[ec2-user@example-ruby-sinatra-server insert_salesforce_api_test]$ ls -lrta /home/ec2-user/insert_salesforce_api_test/
合計 32
-rw-r--r-- 1 ec2-user ec2-user 75 12月 20 01:00 Gemfile.ORG
-rw-r--r-- 1 ec2-user ec2-user 96 12月 20 01:01 Gemfile
drwxrwxr-x 2 ec2-user ec2-user 4096 12月 20 01:01 .bundle
drwxrwxr-x 3 ec2-user ec2-user 4096 12月 20 01:01 vendor
-rw-rw-r-- 1 ec2-user ec2-user 524 12月 20 01:02 Gemfile.lock
drwx------ 6 ec2-user ec2-user 4096 12月 20 02:19 ..
drwxrwxr-x 4 ec2-user ec2-user 4096 12月 20 02:35 .
[ec2-user@example-ruby-sinatra-server insert_salesforce_api_test]$
[ec2-user@example-ruby-sinatra-server insert_salesforce_api_test]$ bundle list | grep databasedotcom
* databasedotcom (1.3.5)
[ec2-user@example-ruby-sinatra-server insert_salesforce_api_test]$
[ec2-user@example-ruby-sinatra-server insert_salesforce_api_test]$ bundle list
Gems included by the bundle:
* activesupport (5.0.0.1)
* bundler (1.13.2)
* concurrent-ruby (1.0.3)
* databasedotcom (1.3.5)
* i18n (0.7.0)
* json (2.0.2)
* minitest (5.10.1)
* multipart-post (2.0.0)
* thread_safe (0.3.5)
* tzinfo (1.2.2)
[ec2-user@example-ruby-sinatra-server insert_salesforce_api_test]$
RubyからSalesforce REST APIを実行してSalesforceカスタムオブジェクトのレコードを表示する
Rubyからdatabasedotcom(Gem)経由でSalesforce REST APIを呼び出し、Salesforceカスタムオブジェクトのレコードを表示します。
Salesforceカスタムオブジェクト「テストオブジェクト」(例としてオブジェクト名が QuickStart__c であるとします)のレコードを表示するRubyプログラムを作成します。
これを実行すると、Salesforceカスタムオブジェクトに登録されているレコードを表示出来ます。
[ec2-user@example-ruby-sinatra-server ~]$ cd /home/ec2-user/select_salesforce_api_test/
[ec2-user@example-ruby-sinatra-server select_salesforce_api_test]$ pwd
/home/ec2-user/select_salesforce_api_test
[ec2-user@example-ruby-sinatra-server select_salesforce_api_test]$
[ec2-user@example-ruby-sinatra-server select_salesforce_api_test]$ ls -lrta /home/ec2-user/select_salesforce_api_test/
合計 32
-rw-r--r-- 1 ec2-user ec2-user 75 12月 20 01:00 Gemfile.ORG
-rw-r--r-- 1 ec2-user ec2-user 96 12月 20 01:01 Gemfile
drwxrwxr-x 2 ec2-user ec2-user 4096 12月 20 01:01 .bundle
drwxrwxr-x 3 ec2-user ec2-user 4096 12月 20 01:01 vendor
-rw-rw-r-- 1 ec2-user ec2-user 524 12月 20 01:02 Gemfile.lock
drwxrwxr-x 4 ec2-user ec2-user 4096 12月 20 01:32 .
drwx------ 6 ec2-user ec2-user 4096 12月 20 02:19 ..
[ec2-user@example-ruby-sinatra-server select_salesforce_api_test]$
[ec2-user@example-ruby-sinatra-server select_salesforce_api_test]$ vi /home/ec2-user/select_salesforce_api_test/select_salesforce_api_test.rb
#!/bin/env ruby
#
require 'bundler/setup'
require 'databasedotcom'
# Salesforce接続用インスタンス作成
client = Databasedotcom::Client.new :host => ENV['DATABASEDOTCOM_HOST'], :client_id => ENV['DATABASEDOTCOM_CLIENT_ID'], :client_secret => ENV['DATABASEDOTCOM_CLIENT_SECRET']
# Salesforce認証
client.authenticate :username => ENV['DATABASEDOTCOM_CLIENT_USERNAME'], :password => ENV['DATABASEDOTCOM_CLIENT_AUTHENTICATE_PASSWORD']
# Salesforceカスタムオブジェクトに登録されているレコード一覧を表示
client.query("SELECT user_name__c, user_email__c, create_date__c FROM QuickStart__c").each do|record|
p "#{record.user_name__c} : #{record.user_email__c} #{record.create_date__c}"
end
Rubyプログラムを実行すると、Salesforceカスタムオブジェクトに登録されているレコードを表示出来ます。
[ec2-user@example-ruby-sinatra-server select_salesforce_api_test]$ ruby /home/ec2-user/select_salesforce_api_test/select_salesforce_api_test.rb
(中略)
"testname_20160906_042126 : testname_20160906_042126@hoge.example.com 2016-09-06"
"testname_20160906_044112 : testname_20160906_044112@hoge.example.com 2016-09-06"
[ec2-user@example-ruby-sinatra-server select_salesforce_api_test]$
RubyからSalesforce REST APIを実行してSalesforceカスタムオブジェクトにレコードを追加する
Rubyからdatabasedotcom(Gem)経由でSalesforce REST APIを呼び出し、Salesforceカスタムオブジェクトにレコードを追加します。
Salesforceカスタムオブジェクト「テストオブジェクト」(例としてオブジェクト名が QuickStart__c であるとします)にレコードを追加するRubyプログラムを作成します。
これを実行すると、Salesforceカスタムオブジェクトへレコードを追加出来ます。
[ec2-user@example-ruby-sinatra-server ~]$ cd /home/ec2-user/insert_salesforce_api_test/
[ec2-user@example-ruby-sinatra-server insert_salesforce_api_test]$ pwd
/home/ec2-user/insert_salesforce_api_test
[ec2-user@example-ruby-sinatra-server insert_salesforce_api_test]$ ls -lrta /home/ec2-user/insert_salesforce_api_test/
合計 32
-rw-r--r-- 1 ec2-user ec2-user 75 12月 20 01:00 Gemfile.ORG
-rw-r--r-- 1 ec2-user ec2-user 96 12月 20 01:01 Gemfile
drwxrwxr-x 2 ec2-user ec2-user 4096 12月 20 01:01 .bundle
drwxrwxr-x 3 ec2-user ec2-user 4096 12月 20 01:01 vendor
-rw-rw-r-- 1 ec2-user ec2-user 524 12月 20 01:02 Gemfile.lock
-rw-rw-r-- 1 ec2-user ec2-user 1204 12月 20 02:19 insert_salesforce_api_test.rb
drwx------ 6 ec2-user ec2-user 4096 12月 20 02:19 ..
drwxrwxr-x 4 ec2-user ec2-user 4096 12月 20 02:35 .
[ec2-user@example-ruby-sinatra-server insert_salesforce_api_test]$
[ec2-user@example-ruby-sinatra-server insert_salesforce_api_test]$ vi /home/ec2-user/insert_salesforce_api_test/insert_salesforce_api_test.rb
#!/bin/env ruby
require 'bundler/setup'
require 'databasedotcom'
require 'date'
# Salesforce接続用インスタンス作成
client = Databasedotcom::Client.new :host => ENV['DATABASEDOTCOM_HOST'], :client_id => ENV['DATABASEDOTCOM_CLIENT_ID'], :client_secret => ENV['DATABASEDOTCOM_CLIENT_SECRET']
# Salesforce認証
client.authenticate :username => ENV['DATABASEDOTCOM_CLIENT_USERNAME'], :password => ENV['DATABASEDOTCOM_CLIENT_AUTHENTICATE_PASSWORD']
now = Time.now
create_date = now.strftime("%Y-%m-%d")
insert_time = now.strftime("%Y%m%d_%H%M%S")
insert_name = "testname_Ruby_" + insert_time
insert_email = insert_name + "@hoge.example.com"
# Salesforceカスタムオブジェクトにレコードを登録する
client.create(
'QuickStart__c',
'user_name__c' => insert_name,
'user_email__c' => insert_email,
'create_date__c' => create_date
)
# Salesforceカスタムオブジェクトに登録されているレコード一覧を表示
client.query("SELECT user_name__c, user_email__c, create_date__c FROM QuickStart__c").each do|record|
p "#{record.user_name__c} : #{record.user_email__c} #{record.create_date__c}"
end
Rubyプログラムを実行すると、Salesforceカスタムオブジェクトにレコードを追加出来ます。
[ec2-user@example-ruby-sinatra-server insert_salesforce_api_test]$ ruby /home/ec2-user/insert_salesforce_api_test/insert_salesforce_api_test.rb
(中略)
"testname_20160906_042126 : testname_20160906_042126@hoge.example.com 2016-09-06"
"testname_20160906_044112 : testname_20160906_044112@hoge.example.com 2016-09-06"
"testname_Ruby_20161220_023830 : testname_Ruby_20161220_023830@hoge.example.com 2016-12-20"
"testname_Ruby_20161220_023911 : testname_Ruby_20161220_023911@hoge.example.com 2016-12-20"
[ec2-user@example-ruby-sinatra-server insert_salesforce_api_test]$
Salesforceカスタムオブジェクトに追加されたレコード
前述のRubyプログラムを実行する事で、Salesforceカスタムオブジェクト(QuickStart__c = テストオブジェクト)に以下のようにレコードが追加されました。
以上になります。