這篇SOAP相關(guān)文章是Salesforce開發(fā)教程(三)的補(bǔ)充凶赁,了解到不少同學(xué)在系統(tǒng)集成中會(huì)遇到各種各樣的問題厘贼,之前寫過一篇關(guān)于REST的相關(guān)文章使用Postman對(duì)Salesforce進(jìn)行接口測(cè)試,今天來簡(jiǎn)單介紹一下Salesforce中SOAP的實(shí)踐捌浩。
基礎(chǔ)知識(shí)
使用SOAP集成甩恼,必不可少的過程是需要服務(wù)端提供WSDL文件每瞒,消費(fèi)端通過定義了Web Service的WSDL文件偶摔,進(jìn)而與服務(wù)端發(fā)生通信暇唾;比如說現(xiàn)在有第三方應(yīng)用通過SOAP方式訪問某個(gè)Salesforce 組織的資源,可能會(huì)引申出下面三個(gè)問題:
- SF的WSDL文件在哪里?從哪可以獲瘸秸策州?
- 系統(tǒng)的配置如果發(fā)生變化,需要及時(shí)更新WSDL文件么宫仗?
- WSDL文件定義了SF端的Web Service够挂,是否意味著擁有了WSDL文件就可以任意操作SF了呢?
讓我們逐一來解釋一下锰什,首先下硕,SF提供了兩種WSDL文件丁逝,分別對(duì)應(yīng)不同業(yè)務(wù)場(chǎng)景汁胆,Enterprise WSDL是強(qiáng)類型的梭姓,不同組織的Enterprise WSDL文件是不同的,Enterprise WSDL代表的是具體Instance的資源(對(duì)象嫩码、字段誉尖、Web service等);而Partner WSDL是弱類型的铸题,不同SF組織的Partner WSDL文件是相同的铡恕。在大部分集成項(xiàng)目中,大家都會(huì)使用Enterprise WSDL文件來和指定的SF組織做集成丢间,如果需要和多個(gè)SF組織做集成探熔,使用Partner WSDL文件。那么回到上面例子提到的第一個(gè)問題烘挫,因?yàn)橐椭付⊿F組織做集成诀艰,所以我們選擇了Enterprise WSDL文件;接下來看第二個(gè)問題饮六,既然WSDL文件定義了SF組織的對(duì)象其垄、字段等配置,顯然如果這些配置SF端發(fā)生變化并且在代碼邏輯中引用了卤橄,那應(yīng)該及時(shí)的更新WSDL文件绿满,否則第三方應(yīng)用程序會(huì)出現(xiàn)異常。
前兩個(gè)問題已經(jīng)解決了窟扑,接下來看最后一個(gè)問題喇颁,想象一下,如果我們拿到了某個(gè)SF組織的WSDL文件嚎货,就可以對(duì)SF進(jìn)行任意操作无牵,這將是多么可怕的一件事情;其實(shí)在調(diào)用SF端服務(wù)之前厂抖,需要SF系統(tǒng)管理員提前設(shè)置好API User茎毁,那么在系統(tǒng)交互的過程中,Session Id可以保證會(huì)話是安全的忱辅,更為重要的是七蜘,我們可以通過Profile的設(shè)置,限制API User的權(quán)限墙懂,所以對(duì)第三個(gè)問題的擔(dān)憂是多余的橡卤。想必大家對(duì)SF中SOAP的使用有了初步的了解,接下來看一下具體在項(xiàng)目中的實(shí)際操作损搬。
SOAP UI的測(cè)試
前提準(zhǔn)備:
-
WSDL文件下載
Generate Enterprise WSDL
如果還沒有可以用于測(cè)試的SF Organization的同學(xué)碧库,請(qǐng)先注冊(cè)一個(gè)Developer Edition柜与。
- SOAP UI安裝
準(zhǔn)備工作完成后,接下來看一下怎樣利用SOAP UI調(diào)用SF的服務(wù)嵌灰,大體分為三個(gè)步驟:
-
新建SOAP項(xiàng)目弄匕,引入剛才下載的WSDL文件;
New SOAP Project
SOAP Binding
展開左邊的下拉列表沽瞭,可以看到一系列WSDL定義的操作迁匠,隨意打開其中某個(gè)文件,內(nèi)容包含了請(qǐng)求的地址和參數(shù)驹溃,接下來將調(diào)用這些操作城丧。
- 按照上面所說的,整個(gè)SOAP交互過程需要用到Session Id豌鹤,這一步會(huì)通過用戶名和密碼來獲取Session Id亡哄;
瀏覽上述下拉列表,找到Login操作布疙,將Request Body修改為以下內(nèi)容:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:enterprise.soap.sforce.com">
<soapenv:Header>
</soapenv:Header>
<soapenv:Body>
<urn:login>
<urn:username>Username</urn:username>
<urn:password>Password + Security Token</urn:password>
</urn:login>
</soapenv:Body>
</soapenv:Envelope>
注意這里需要用到Security Token蚊惯,可以在個(gè)人設(shè)置中Reset Token。按照上面的請(qǐng)求體發(fā)送后拐辽,會(huì)得到下面的Response Body:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns="urn:enterprise.soap.sforce.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<loginResponse>
<result>
<metadataServerUrl>https://xxxxxxx.my.salesforce.com/services/Soap/m/48.0/00D7F000006Mp0t</metadataServerUrl>
<passwordExpired>false</passwordExpired>
<sandbox>false</sandbox>
<serverUrl>https://xxxxxxx.my.salesforce.com/services/Soap/c/48.0/00D7F000006Mp0t/0DF7F000000L9uA</serverUrl>
<sessionId>xxxxxxx</sessionId>
<userId>0057F000002IwR4QAK</userId>
<userInfo>
<accessibilityMode>false</accessibilityMode>
...
</userInfo>
</result>
</loginResponse>
</soapenv:Body>
</soapenv:Envelope>
注意Session Id參數(shù)拣挪,當(dāng)我們拿到Session Id,隨后與SF的交互都需要這個(gè)Session Id俱诸,下面將嘗試通過SOAP在SF端新建一個(gè)Account菠劝。
- 利用上一步獲得的Session Id,調(diào)用Create方法睁搭,在SF端新建Account赶诊。
Request Body:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:enterprise.soap.sforce.com" xmlns:urn1="urn:sobject.enterprise.soap.sforce.com">
<soapenv:Header>
<urn:SessionHeader>
<urn:sessionId>056D7F000006Mp0t!AQUAQD__D71qXu54WOcHCtEHsi.F._QAi4eXSvs_ihHJn69dqAa3nVnBUhOgs_kO</urn:sessionId>
</urn:SessionHeader>
</soapenv:Header>
<soapenv:Body>
<urn:create>
<!--Zero or more repetitions:-->
<urn:sObjects xsi:type="urn1:Account" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<!--Zero or more repetitions:-->
<Name>Test Account From SOAP</Name>
<Accountnumber>000000</Accountnumber>
<Phone>123456789</Phone>
</urn:sObjects>
</urn:create>
</soapenv:Body>
</soapenv:Envelope>
Response Body:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns="urn:enterprise.soap.sforce.com">
<soapenv:Header>
<LimitInfoHeader>
<limitInfo>
<current>16</current>
<limit>15000</limit>
<type>API REQUESTS</type>
</limitInfo>
</LimitInfoHeader>
</soapenv:Header>
<soapenv:Body>
<createResponse>
<result>
<id>0017F00002TfEMtQAN</id>
<success>true</success>
</result>
</createResponse>
</soapenv:Body>
</soapenv:Envelope>
通過Response狀態(tài),可以看到創(chuàng)建成功了园骆,并且返回了Account的Id舔痪;讓我們來回顧一下上面做了哪些事情,首先通過Login方法獲取到了SF端的Session Id和Server Url锌唾,然后再調(diào)用Create方法創(chuàng)建了一個(gè)Account锄码;通常我們會(huì)用SOAP UI對(duì)web service進(jìn)行測(cè)試,然后再把WSDL文件提供給消費(fèi)者晌涕,當(dāng)消費(fèi)者拿到WSDL文件后怎么使用呢滋捶?接下來看一下怎樣在Java程序中調(diào)用WSDL定義的方法。
Java通過SOAP連接SF
這個(gè)配置工作可以參考SF官方文檔余黎,下面著重提到兩個(gè)部分重窟。
- WSDL file生成Java package
- 生成Java包的過程中,需要用到Web Services Connector惧财,注意保證wsc的版本與你所生成的wsdl文件的版本保持一致巡扇,比如這里我會(huì)選擇48.0的版本扭仁。
- 執(zhí)行生成jar包命令的過程中,可能會(huì)遇到的異常厅翔。
2.1. Permission Denied: /Users/xxx/xxx.jar
sudo chmod 777 /Users/xxx/xxx.jar
2.2. 缺少antlr.jar
Issue Message:
Exception in thread "main" java.lang.NoClassDefFoundError: org/antlr/runtime/CharStream
這個(gè)時(shí)候需要引入Antlr.jar乖坠。
到現(xiàn)在為止呢,我們將會(huì)用到下面5個(gè)文件:
控制臺(tái)執(zhí)行以下命令:
Input:
> java -classpath /Users/Bubba/Desktop/SOAPTest/antlr-4.8-complete.jar:/Users/Bubba/Desktop/SOAPTest/rhino-1.7.12.jar:/Users/Bubba/Desktop/SOAPTest/ST-4.3.jar:/Users/Bubba/Desktop/SOAPTest/force-wsc-48.0.0.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/lib/tools.jar com.sforce.ws.tools.wsdlc /Users/Bubba/Desktop/SOAPTest/SFEnterprise.wsdl /Users/Bubba/Desktop/SOAPTest/SFEnterprise.jar
Output:
[WSC][wsdlc.main:71]Generating Java files from schema ...
[WSC][wsdlc.main:71]Generated 956 java files.
[WSC][wsdlc.main:71]Compiling to target 1.8...
[WSC][wsdlc.main:71]Compiled 960 java files.
[WSC][wsdlc.main:71]Generating jar file ... /Users/Bubba/Desktop/SOAPTest/SFEnterprise.jar
[WSC][wsdlc.main:71]Generated jar file /Users/Bubba/Desktop/SOAPTest/SFEnterprise.jar
可以看到SFEnterprise.jar文件已經(jīng)成功生成知给,怎么能夠保證這個(gè)jar包是可用的呢瓤帚?讓我們來參考一下官網(wǎng)提供的例子 描姚。
- 驗(yàn)證SFEnterprise.jar
注意將wsc和生成的SFEnterprise.jar都引入到Java項(xiàng)目中涩赢。
SFSOAPTest.java
package wsc;
import com.sforce.soap.enterprise.Connector;//from SFEnterprise.jar
import com.sforce.soap.enterprise.EnterpriseConnection;
import com.sforce.ws.ConnectionException;// from wsc.jar
import com.sforce.ws.ConnectorConfig;
public class SFSOAPTest {
static final String USERNAME = "YOUR DEVORG USERNAME";
static final String PASSWORD = "YOUR DEVORG PASSWORD AND SECURITY TOKEN";
static EnterpriseConnection connection;
public static void main(String[] args) {
ConnectorConfig config = new ConnectorConfig();
config.setUsername(USERNAME);
config.setPassword(PASSWORD);
try {
connection = Connector.newConnection(config);
// display some current settings
System.out.println("Auth EndPoint: "+config.getAuthEndpoint());
System.out.println("Service EndPoint: "+config.getServiceEndpoint());
System.out.println("Username: "+config.getUsername());
System.out.println("SessionId: "+config.getSessionId());
} catch (ConnectionException e1) {
e1.printStackTrace();
}
}
}
執(zhí)行這段代碼后,如果能夠看到類似于下面的輸出轩勘,表示成功的拿到Session Id筒扒,那么意味著我們成功的踏出了第一步,接下來就可以用Session Id來和SF進(jìn)行交互绊寻。
Auth EndPoint: https://login.salesforce.com/services/Soap/c/48.0/0DF7F000000L9uA
Service EndPoint: https://brave-moose-421893-dev-ed.my.salesforce.com/services/Soap/c/48.0/00D7F000006Mp0t/0DF7F000000L9uA
Username: xxxbrave-moose-421893.com
SessionId: 00D7F000006Mp0t!AQUAQD__D71qXu54WOcHCtEHsi.F._QAi4eXSvs_ihHJn69dqAa3nVnBUhOgs_kOyIg4BPJ4ur0o_o9YfVliYpfGAZC5Wxxx
總結(jié)
通過本篇文章花墩,希望對(duì)大家在Salesforce中SOAP的實(shí)踐過程中有所幫助,文中有不足的地方澄步,多多指教冰蘑。