前回までのあらすじ
実践 APIって何なのか? の続きです。
前回は、Salesforceが公開しているAPIリファレンスを見て、「取引先を1件作る」ときのURLとメソッド(POST)とJSONの形を確認しました。今回は、その通信をコマンドラインから実際に行います。
今回行ったこと
- Salesforce CLI から、Salesforceに取引先を1件作る
- Python とターミナルのコマンドで、Salesforceに取引先を1件作る
Salesforce CLI から作る
Salesforce CLI が入っていて、対象のorgにログインできていることが前提です。確認は次です。
sf org list
Status が Connected なら、次で取引先を作れます。
sf data create record -s Account -v "Name='学習用テスト' Phone='03-0000-0000'" -o <対象のorg>
成功すると、だいたい次のように出ます。
Successfully created record: 001xxxxxxxxxxxx
このコマンドには POST も URL も書いてありません。ただし、やっていることは前回見た通信と同じです。CLIが、公開されているURLにPOSTしてくれています。自分ではリファレンスの1行を書いていません。
Pythonでスクリプトを書き、ターミナルから作る
こちらは、前回のリファレンスどおりに自分でPOSTします。pythonファイルは作らずpytonのインストールされている前提でpython3 -c で、ターミナルから実行します。
POSTするときは、access token を環境変数 SF_ACCESS_TOKEN に入れておきます。ターミナルで次を実行します。中の sf は Salesforce CLI で、token を取っています。export で、同じターミナルの環境変数に入れます。
export SF_ACCESS_TOKEN="$(sf org auth show-access-token -o <対象のorg> --no-prompt --json | python3 -c 'import sys,json; print(json.load(sys.stdin)["result"]["accessToken"])')"
中身は出さず、入ったことだけ確認します。
python3 -c "import os; t=os.environ.get('SF_ACCESS_TOKEN',''); print('len:', len(t))"
len が大きな数字なら入っています。result ごと入れると dict になってしまい、401(Unauthorized)になります。入れるのは result["accessToken"] の文字列だけです。
コマンド内のorgの(My Domain)は 普段ログインに使っているURLです。
sf org display -o <対象のorg> --json の result.instanceUrl でも出てきます。
{My Domain} のところを、自分のorgのURLに置き換えてください。
url に入れている文字列は、前回の記事で見た APIリファレンス の通信先そのものです。Qiitaのコードブロックでは1行だけ色を付けられないので、コメントで示しています。
python3 -c "
import json, os, urllib.request
# 前の export で環境変数に入れた token を使う
token = os.environ['SF_ACCESS_TOKEN']
# 前回のリファレンス: POST /services/data/vXX.X/sobjects/Account/
url = 'https://{My Domain}/services/data/v67.0/sobjects/Account/'
# JSONのキーは Account の項目API名(Name は必須、Phone は任意)
body = json.dumps({'Name': 'RESTから', 'Phone': '03-2222-2222'}).encode()
# Request は送らず、URL・本文・ヘッダ・POST を束ねた入れ物を作る。req は request の略
req = urllib.request.Request(
url,
data=body,
headers={
'Authorization': 'Bearer ' + token,
'Content-Type': 'application/json',
},
# リファレンスではレコード追加の方法が POST。ここでメソッドを指定する
method='POST',
)
# urlopen が実際に送る。res は response(返事)の略
with urllib.request.urlopen(req) as res:
print(res.status)
print(res.read().decode())
"
成功すると、次のように出ます。
201
{"id":"001xxxxxxxxxxxx","success":true,"errors":[]}
201 は「作れた」という番号です。id が新しい取引先のIDです。orgの画面でも、そのレコードを確認できます。
前回見た次の1行を、自分で送っています。
POST https://{My Domain}/services/data/vXX.X/sobjects/Account/
UIのSalesforce環境からもレコードができているか確かめてください。
ヘッダの Content-Type: application/json が「JSONで送る」という宣言です。Authorization: Bearer … が通行証です。
二つの方法の違い
どちらも、Salesforceが公開しているAPIを使っています。違いは自分でPOSTを書いているかどうかです。
| Salesforce CLI | Python(ターミナル) | |
|---|---|---|
| 自分が見ているもの | sf data create record |
URL、POST、JSON、Bearer |
| POSTを書いているか | 書いていない(CLIが書く) | 書いている |
| 成功したときに出るもの | Successfully created record: 001... |
201 と id
|
次は、同じ「取引先を1件作る」を、PythonファイルとHTMLファイルから行います。