via pixabay.com
はじめに
こんにちは!テラスカイのS.Kです!
突然ですが、Salesforce開発を行っていく中で度々耳にするSOAP APIについてご存知でしょうか?
・「聞いたことだけはある…」
・「大まかには知っているけど、触ったことはない…」
本ブログでは上記のような方を対象に、堅い説明を噛み砕きつつ、最初のハードル超えをサポートするべくSOAP API入門として解説していきます!
入門とはいえ多少のプログラミング知識が必要となりますので、頑張っていきましょう!
突然ですが、Salesforce開発を行っていく中で度々耳にするSOAP APIについてご存知でしょうか?
・「聞いたことだけはある…」
・「大まかには知っているけど、触ったことはない…」
本ブログでは上記のような方を対象に、堅い説明を噛み砕きつつ、最初のハードル超えをサポートするべくSOAP API入門として解説していきます!
入門とはいえ多少のプログラミング知識が必要となりますので、頑張っていきましょう!
SOAP APIとは
Webサービス間でデータ通信を行う際に使用される、Simple Object Access Protocolの略称です。
特徴としては、リクエストとレスポンスのやり取りがXML形式で行われる点にあります。XMLは構造化された形式であるため、やり取りする内容がXML内に厳格に定義されています。大まかには、対向システムで呼び出したいサービス名とそのパラメーターを、Bodyに記載していく形式となります。(参考:図1)
なお、SOAPのデータ通信は一般的なプロトコルのHTTPやHTTPSが使用されているため、幅広いシステムで使用可能となります。
特徴としては、リクエストとレスポンスのやり取りがXML形式で行われる点にあります。XMLは構造化された形式であるため、やり取りする内容がXML内に厳格に定義されています。大まかには、対向システムで呼び出したいサービス名とそのパラメーターを、Bodyに記載していく形式となります。(参考:図1)
なお、SOAPのデータ通信は一般的なプロトコルのHTTPやHTTPSが使用されているため、幅広いシステムで使用可能となります。
図1. SOAP APIのデータ通信イメージ
では、具体的にどのようなデータを用意して、どのように通信を行うのでしょうか?
実際のイメージを持っていただくべく、XMLデータを用意してSOAP通信の流れをPythonで確認しましょう!
実際のイメージを持っていただくべく、XMLデータを用意してSOAP通信の流れをPythonで確認しましょう!
【実践】XMLデータのやり取りでレコードを作ってみよう(Python)
XMLデータの流れをイメージしていただくため、Pythonから取引先レコードを作成するプログラムを作成しました。
大まかな流れとしては以下の通りです。
- Loginリクエスト(XML)を使用しSalesforceにログイン ※ユーザー名とパスワードは適宜修正してください
- 作成する取引先のリクエストXMLデータを作成
- 2のXMLと1のレスポンス情報を使用し、取引先作成リクエストを送信
import requests import xml.etree.ElementTree as ET # 1.salesforceのサービスを利用するためにまずログイン endpoint = "https://login.salesforce.com/services/Soap/u/64.0" username = "hogehoge_UserName" password = "piyopiyo_Password" login_headers = { "Content-Type": "text/xml; charset=UTF-8", "SOAPAction": "login" } login_body = f"""<?xml version="1.0" encoding="UTF-8"?><env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <env:Body> <m:login xmlns:m="urn:partner.soap.sforce.com" xmlns:sobj="urn:sobject.partner.soap.sforce.com"> <m:username>{username}</m:username> <m:password>{password}</m:password> </m:login> </env:Body> </env:Envelope>""" #ログインのレスポンスから、サービス利用のために必要な情報(sessionIdとserverURL)を取得 response = requests.post(endpoint, headers=login_headers, data=login_body) root = ET.fromstring(response.text) # レスポンスXMLの解析 namespaces = { 'soapenv': 'http://schemas.xmlsoap.org/soap/envelope/', 'sf': 'urn:partner.soap.sforce.com' } # sessionId を取得 session_id = root.find('.//sf:sessionId', namespaces).text # serverUrl を取得 server_url = root.find('.//sf:serverUrl', namespaces).text print(f'Session Id: {session_id}') print(f'Server_url: {server_url}') # createサービスを使用し、取引先を作成 createAcc_headers = { "Content-Type": "text/xml; charset=UTF-8", "SOAPAction": "create" } # 2. 作成する取引先の内容をXMLで記載 createAcc_body = f"""<?xml version="1.0" encoding="UTF-8"?><env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <env:Header> <SessionHeader xmlns="urn:partner.soap.sforce.com"> <sessionId>{session_id}</sessionId> </SessionHeader> </env:Header> <env:Body> <m:create xmlns:m="urn:partner.soap.sforce.com" xmlns:sobj="urn:sobject.partner.soap.sforce.com"> <m:sObjects> <sobj:type xsi:type="xsd:string">Account</sobj:type> <sobj:Name xsi:type="xsd:string">Test Account from Python XML</sobj:Name> </m:sObjects> </m:create> </env:Body> </env:Envelope>""" #3.取引先の作成リクエスト create_res = requests.post(server_url, headers=createAcc_headers, data=createAcc_body) print(create_res.status_code) print(create_res.text)
createAccFromSOAPxml.py
上記プログラム(ceateAccFromSOAPxml.py)を実行すると図2の取引先が作成されます。
図2. createAccFromSOAPxml.pyで作成された取引先
SOAP APIがXML形式のデータでやり取りをすることが分かりました。しかし、どんなXMLを記載すれば対向システムのサービスを呼び出せるのでしょうか?その仕様が書かれているファイルが、Web Services Description Language(WSDL)です(上節のXMLはSalesforce Partner WSDLを参考に作成しました)。
SalesforceのSOAP APIを使用する際は、Salesforce「設定」>「API」 からWSDLを取得できます(図3)。さまざまなWSLDが用意されておりますが、今回はPartner WSDLを使用しレコードを作成しています。それぞれの簡単な説明は後述します。
SalesforceのSOAP APIを使用する際は、Salesforce「設定」>「API」 からWSDLを取得できます(図3)。さまざまなWSLDが用意されておりますが、今回はPartner WSDLを使用しレコードを作成しています。それぞれの簡単な説明は後述します。
図3. Salesforce WSDLファイルの取得方法
Salesforce APIの種類
今回、SalesforceのSOAP APIを使用してレコードを作成しましたが、他のAPIを使用することでさまざまなサービスを受けることが可能です。例えばメタデータAPIでは、オブジェクトのカスタム項目を作成することができます。
WSDL | API | 使用用途 |
---|---|---|
Enterprise WSDL | SOAP API | レコードの操作(作成、更新、削除)、SOQLの実行、メタデータの参照など
(1つの組織専用)
|
Partnaer WSDL | レコードの操作(作成、更新、削除)、SOQLの実行、メタデータの参照など
(複数の組織で使用可能)
|
|
Apex WSDL | - | 別システムが組織のApexコードを実行する |
Metadata WSDL | Metadata API | メタデータの参照、メタデータのデプロイ(項目作成も可能)など |
Tooling WSDL | Tooling API | 開発者向け。Apexのコンパイルやテストを実行する |
代理認証 WSDL | - | 別システムからSalesforce環境に代理ログインする |
Salesforceが提供するAPIの詳細についてより詳しく知りたい方は下記ブログをご参照ください。
「SalesforceのAPIを知って連携ツールを使いこなそう 【第1回】」
SOAPの話とは逸れますが、Salesforce APIを利用した業務効率化手法として、TerraSky Baseのブログ「Pythonで実現する業務自動化 カスタム項目一括作成 【前編】」で紹介されているアプリケーションを使用することで、CSVに記載した項目を一括で作成できます。こちらのアプリで使用されているPythonライブラリ「simple-salesforce」は内部的にREST APIが使用されております。
「SalesforceのAPIを知って連携ツールを使いこなそう 【第1回】」
SOAPの話とは逸れますが、Salesforce APIを利用した業務効率化手法として、TerraSky Baseのブログ「Pythonで実現する業務自動化 カスタム項目一括作成 【前編】」で紹介されているアプリケーションを使用することで、CSVに記載した項目を一括で作成できます。こちらのアプリで使用されているPythonライブラリ「simple-salesforce」は内部的にREST APIが使用されております。
おまけ ~Minecraftからレコード作成~
今回学んだSalesforce SOAP APIを使用することで、Salesforce以外のシステムやプログラムからSalesforceを操作できることが分かりました。そこで、ここではその例として、MinecraftからSalesforceを操作してみました!
MinecraftのJava版では、Javaを使用することでMODを作成できます。細かい説明は省きますが、Salesforce Partner WSDLをJavacでコンパイルすると、JavaのライブラリとしてSalesforce SOAP APIを使用することができます。今回は、看板で名前をつけた村を取引先とするMODを作成しました。
MinecraftのJava版では、Javaを使用することでMODを作成できます。細かい説明は省きますが、Salesforce Partner WSDLをJavacでコンパイルすると、JavaのライブラリとしてSalesforce SOAP APIを使用することができます。今回は、看板で名前をつけた村を取引先とするMODを作成しました。
図4. 看板の設置をトリガーに取引先が作成
Minecraft内の行動をSalesforceで管理することが可能となりました。今回は簡単なデモとなりましたが、工夫次第では「村人を取引先責任者にする」とか、「村人との交易を商談で管理する」などさまざまな展望がありますね!
実際にAPIに触ると理解度が飛躍的に上がるので、興味があればぜひいろいろ触ってみてください!
実際にAPIに触ると理解度が飛躍的に上がるので、興味があればぜひいろいろ触ってみてください!
おわりに
いかがでしたでしょうか。今回SOAP APIを例に使い方を学びましたが、使用するWSDLを変えることで、SOAP経由のさまざまなSalesforce APIを使用することが可能です。APIの使い方次第で作業効率が上がり開発スピードの大幅な向上も見込まれるので、ぜひこの機会にさまざまなAPIに触れてみましょう!
参考
・Zeep「Python SOAP client」: https://docs.python-zeep.org/en/master/
・Salesforce Help「どのAPIを使用するか」:https://help.salesforce.com/s/articleView?id=platform.integrate_what_is_api.htm&type=5
・SalesforceのAPIを知って連携ツールを使いこなそう 【第1回】:https://base.terrasky.co.jp/articles/3KYyA
・Github「simple-salesforce」:https://github.com/simple-salesforce/simple-salesforce
・Salesforce Developers SOAP API 開発者ガイド「SOAP API について」:https://developer.salesforce.com/docs/atlas.ja-jp.api.meta/api/sforce_api_quickstart_intro.htm
・Salesforce Help「どのAPIを使用するか」:https://help.salesforce.com/s/articleView?id=platform.integrate_what_is_api.htm&type=5
・SalesforceのAPIを知って連携ツールを使いこなそう 【第1回】:https://base.terrasky.co.jp/articles/3KYyA
・Github「simple-salesforce」:https://github.com/simple-salesforce/simple-salesforce
・Salesforce Developers SOAP API 開発者ガイド「SOAP API について」:https://developer.salesforce.com/docs/atlas.ja-jp.api.meta/api/sforce_api_quickstart_intro.htm