Salesforce中SOAP的實(shí)踐

這篇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柜与。

準(zhǔn)備工作完成后,接下來看一下怎樣利用SOAP UI調(diào)用SF的服務(wù)嵌灰,大體分為三個(gè)步驟:

  1. 新建SOAP項(xiàng)目弄匕,引入剛才下載的WSDL文件;


    New SOAP Project

    SOAP Binding

展開左邊的下拉列表沽瞭,可以看到一系列WSDL定義的操作迁匠,隨意打開其中某個(gè)文件,內(nèi)容包含了請(qǐng)求的地址和參數(shù)驹溃,接下來將調(diào)用這些操作城丧。

  1. 按照上面所說的,整個(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菠劝。

  1. 利用上一步獲得的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
  1. 生成Java包的過程中,需要用到Web Services Connector惧财,注意保證wsc的版本與你所生成的wsdl文件的版本保持一致巡扇,比如這里我會(huì)選擇48.0的版本扭仁。
  2. 執(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è)文件:

準(zhǔn)備工作

控制臺(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 Project

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í)踐過程中有所幫助,文中有不足的地方澄步,多多指教冰蘑。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市村缸,隨后出現(xiàn)的幾起案子祠肥,更是在濱河造成了極大的恐慌,老刑警劉巖梯皿,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件仇箱,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡东羹,警方通過查閱死者的電腦和手機(jī)剂桥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來属提,“玉大人权逗,你說我怎么就攤上這事≡┮椋” “怎么了斟薇?”我有些...
    開封第一講書人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)求类。 經(jīng)常有香客問我奔垦,道長(zhǎng),這世上最難降的妖魔是什么尸疆? 我笑而不...
    開封第一講書人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任椿猎,我火速辦了婚禮惶岭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘犯眠。我一直安慰自己按灶,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開白布筐咧。 她就那樣靜靜地躺著鸯旁,像睡著了一般。 火紅的嫁衣襯著肌膚如雪量蕊。 梳的紋絲不亂的頭發(fā)上铺罢,一...
    開封第一講書人閱讀 51,763評(píng)論 1 307
  • 那天,我揣著相機(jī)與錄音残炮,去河邊找鬼韭赘。 笑死,一個(gè)胖子當(dāng)著我的面吹牛势就,可吹牛的內(nèi)容都是我干的泉瞻。 我是一名探鬼主播,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼苞冯,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼袖牙!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起舅锄,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤鞭达,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后巧娱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體碉怔,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年禁添,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了撮胧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡老翘,死狀恐怖芹啥,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情铺峭,我是刑警寧澤墓怀,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站卫键,受9級(jí)特大地震影響傀履,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜莉炉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一钓账、第九天 我趴在偏房一處隱蔽的房頂上張望碴犬。 院中可真熱鬧,春花似錦梆暮、人聲如沸服协。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)偿荷。三九已至,卻和暖如春唠椭,著一層夾襖步出監(jiān)牢的瞬間跳纳,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工泪蔫, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留棒旗,地道東北人喘批。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓撩荣,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親饶深。 傳聞我的和親對(duì)象是個(gè)殘疾皇子餐曹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355