LoginSignup
4

More than 5 years have passed since last update.

Ruby からSalesforce REST APIを実行する (databasedotcomを使用してSalesforceカスタムオブジェクトへレコードを追加する)

Last updated at Posted at 2016-12-19

はじめに

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
/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
/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 = テストオブジェクト)に以下のようにレコードが追加されました。

スクリーンショット 2016-12-20 2.54.37.png

スクリーンショット 2016-12-20 2.56.49.png


以上になります。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4