0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

コマンドラインからAPIにPOSTする

0
Posted at

前回までのあらすじ

実践 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> --jsonresult.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... 201id

次は、同じ「取引先を1件作る」を、PythonファイルとHTMLファイルから行います。

0
0
0

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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?