在Salesforce中可以創建Web Service供外部系統調用,並且可以以SOAP或者REST方式向外提供調用接口,接下來的內容將詳細講述一下用SOAP的方式創建Web Service並且用Asp.net的程序進行簡單的調用。
1):在Salesforce中創建如下Class
【注:要想使其成為web service,那么class一定要定義成global的,具體的方法要用 webService static 修飾】
【代碼中省略了GenerateAccountFromXmlInfo方法的具體實現,細節請看:http://www.cnblogs.com/mingmingruyuedlut/p/3497646.html 】
global class SFAccountWebService { webService static string UpsertAccount(String accountXmlInfo) { Account currentAcc = GenerateAccountFromXmlInfo(accountXmlInfo); try { Account acc = [Select Id From Account a Where AccountNumber =: currentAcc.AccountNumber]; if(acc != null){ currentAcc.Id = acc.Id; } upsert currentAcc; return 'true'; } catch(exception ex){ return 'false'; } } private static Account GenerateAccountFromXmlInfo(String accountXmlInfo){ Account currentAcc = new Account(); // Parse the xml info to generate the Account Object return currentAcc; } }
2):在保存好上述的class之后,我們到setup --> build --> develop --> apex classes 中找到剛剛保存的class,我們會發現在對應的Action中有WSDL這個選項,此選項就是Salesforce默認所提供的將Web Service的class轉化成WSDL文件。如下圖所示
3):點擊上圖的WSDL按鈕,會看到如下界面,這里顯示的是生成的WSDL文件的詳細信息,我們點擊鼠標右鍵,將此文件保存到本地,這里姑且取名為SFAccountWebService.wsdl
4):我們可以簡單的創建一個WebApplication的project,如下圖所示,點擊Reference后進行Add Web Reference
5):接上圖,在URL的輸入框中選擇我們剛剛生成的WSDL文件,填寫好右下角的Web Service Name,然后點擊Add Reference按鈕,這樣我們就已經應用到了我們所剛剛生成的Web Service,是不是很簡單呢~~
6):由於我們是通過外部系統去訪問Salesforce內部的資源,那么不可逃避的首先便是認證,也就是說,我們必須首先通過Salesforce的認證,獲取登陸用戶的SessionId,然后此SessionId將作為此后每次訪問Salesforce內部資源的認證標識,只有這樣我們才能順利調用到我們對外開放的Web Service。
如何在外部系統進行登陸認證獲取對應的SessionId呢?這就涉及到了Salesforce默認提供的另外一個Web Service,如下圖所示:
【setup --> build --> develop --> api --> partner wsdl --> generate partner wsdl】
7):將此WSDL文件以相同的方式保存到本地,這里姑且取名為 SFCommonService.wsdl
8):在對應Web Application的project中以相同的方式引用此文件
9):可以簡單的看一下最終的引用狀態,如下圖所示
10):如何進行調用對應的Web Service呢? 請看如下代碼
【login方法的兩個參數是:用戶名和密碼。注:這里的密碼是 用戶密碼 + 所對應的token】
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using TestSFWebServiceApplication.SFCommonWebService; using TestSFWebServiceApplication.SFAccountWebService; namespace TestSFWebServiceApplication { public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { //Call login function to get the session id SforceService sfService = new SforceService(); LoginResult result = sfService.login(@"******************", @"***********************"); string currentSessionId = result.sessionId; //Call our web service function string accountXmlInfo = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><Accounts><Account><AccountName>WebServiceTest001</AccountName><AccountNumber>AAA000-009</AccountNumber></Account></Accounts>"; SFAccountWebServiceService sfAccountService = new SFAccountWebServiceService(); SFAccountWebService.SessionHeader sfAccountHeader = new SFAccountWebService.SessionHeader(); sfAccountHeader.sessionId = currentSessionId; sfAccountService.SessionHeaderValue = sfAccountHeader; string upsertResult = sfAccountService.UpsertAccount(accountXmlInfo); } } }
11):那么在Salesforce中如何引用外部系統所提供的Web Service呢?請看下圖,將外部的WSDL文件生成Salesforce中所對應的Class
之后的具體調用這里就不詳細列舉了,請看如下鏈接:http://www.cnblogs.com/mingmingruyuedlut/p/3512262.html
更多內容請看如下鏈接:
http://shivasoft.in/blog/salesforce/consume-salesforce-web-service-in-c-net-application/
12):當然了我們可以創建對應的Rest Service供外部系統調用
12.1):在Salesforce中創建對應的Class,代碼如下所示
@RestResource(urlMapping='/SFEricSunTestRestService') global class SFEricSunTestRestService { @HttpGet global static string GetTestRestInfo(){ string testInfo = 'Hello Rest Service.'; return testInfo; } }
這里的標識為 @RestResource(urlMapping='/.....') 這樣所形成的Rest Service Uri 格式為 https://cs5.salesforce.com/services/apexrest/SFEricSunTestRestService
Http 的 GET 和 DELETE 方法不支持傳遞參數
12.2):在外部系統調用上面的Rest Service(Get 方法),代碼如下所示
private void TestSFRestService() { SforceService sfService = new SforceService(); LoginResult result = sfService.login(@"......", @"......"); string currentSessionId = result.sessionId; string restServiceURI = @"https://cs5.salesforce.com/services/apexrest/SFEricSunTestRestService"; WebRequest request = WebRequest.Create(restServiceURI); request.Method = "GET"; //request.ContentType = "application/xml"; request.Headers.Add("Authorization:Bearer " + currentSessionId); WebResponse response = request.GetResponse(); if (response != null) { StreamReader reader = new StreamReader(response.GetResponseStream()); string msg = reader.ReadToEnd(); } }
12.3):也可以進一步擴展,代碼如下
@RestResource(urlMapping='/SFEricSunTestRestService/*') global class SFEricSunTestRestService { @HttpDelete global static string doDelete() { RestRequest req = RestContext.request; String name = req.requestURI.substring(req.requestURI.lastIndexOf('/')+1); return 'Delete ' + name; } @HttpGet global static string doGet() { RestRequest req = RestContext.request; String name = req.requestURI.substring(req.requestURI.lastIndexOf('/')+1); return 'Get ' + name; } @HttpPost global static String doPost(String name, String age) { return 'Post' + name + ' ' + age; } }
12.4):在外部系統調用上面的Rest Service,代碼如下所示
private void TestSFRestService() { SforceService sfService = new SforceService(); LoginResult result = sfService.login(@"....", @"...."); string currentSessionId = result.sessionId; string restServiceURI = @"https://cs5.salesforce.com/services/apexrest/SFEricSunTestRestService/MyName"; WebRequest request = WebRequest.Create(restServiceURI); request.Method = "GET"; //request.ContentType = "application/xml"; request.Headers.Add("Authorization:Bearer " + currentSessionId); WebResponse response = request.GetResponse(); if (response != null) { StreamReader reader = new StreamReader(response.GetResponseStream()); string msg = reader.ReadToEnd(); } }
這是對GET方法的調用,我們將Name放在了Url的最后面傳遞給Service中,如果想調用Delete的方法,那么將request.Method = "GET";修改成為request.Method = "DELETE";
這里的Post方法有些特殊,需要傳遞name和age參數(實質是就是將實參加入到request的body中一起發到目的端去請求),調用代碼如下所示
這里提供了SOUP UI的截圖如下所示:
12.5):如果我們想在Salesforce內部去調用對應的Rest Service,那么可以用如下方式
https://developer.salesforce.com/forums/#!/feedtype=SINGLE_QUESTION_SEARCH_RESULT&id=906F000000099zbIAA
更加詳細的信息請看如下鏈接:
http://www.salesforce.com/us/developer/docs/apexcode/index_Left.htm#CSHID=apex_web_services_methods.htm|StartTopic=Content%2Fapex_web_services_methods.htm|SkinName=webhelp
https://developer.salesforce.com/page/Creating_REST_APIs_using_Apex_REST