Salesforce SOAP 接口集成服务(二)

在 Salesforce SOAP 接口集成服务 一文中,主要讲述了如何调用外部服务器的SOAP接口,那么该如何开放Salesforce内部SOAP接口给外部系统呢?
Apex类方法作为自定义SOAP Web服务调用公开,允许外部应用程序调用Apex Web服务以在Salesforce中执行操作,很简单
  • 定义class为global
  • Method 使用关键字 webservice 声明
  • webservice 声明的method需要声明为static
  • Method返回值不能是:Map/Set
  • webservice 声明的变量不能标记为static
global class MyWebService {
    webservice static Id makeContact(String contactLastName, Account a) {
        Contact c = new Contact(lastName = contactLastName, AccountId = a.Id);
        insert c;
        return c.id;
    }
}

第一步:在开放Apex类方法作为SOAP Web服务时,需要在Sales force → Setup → API, 根据需求选择一个合适的WSDL文件,这里我们选择Partner WSDL

Tips:Salesforce提供WSDL(Web Service Description Language)文件。它们被称为“企业WSDL”和“合作伙伴WSDL”。 WSDL是一个XML文档,其中包含有关如何使用Web服务进行通信的标准说明(Salesforce API作为Web服务公开)。 WSDL被开发人员用来帮助创建Salesforce集成件。一个典型的过程涉及使用开发环境(例如,Eclipse for Java或Visual Studio for .Net)使用WSDL,并生成在集成中引用的类

参考链接:Differences between Salesforce provided WSDL files

/*********************************************
企业WSDL
1.企业WSDL是强类型的。
2.企业WSDL绑定(绑定)到Salesforce的特定配置(即特定组织的Salesforce配置)。
3.如果对组织的Salesforce配置进行了修改(例如,自定义字段或自定义对象),则Enterprise WSDL会更改。

由于上述原因,企业WSDL主要面向客户

WSDL合作伙伴
1.合作伙伴WSDL是松散键入的。
2.合作伙伴WSDL可用于反映/询问Salesforce的任何配置(即,任何组织的Salesforce配置)。
3.合作伙伴WSDL是静态的,因此,如果对组织的Salesforce配置进行了修改,则WSDL不会更改。

由于上述原因,合作伙伴WSDL主要用于合作伙伴

**********************************************/

第二步:然后我们来创建一个WebServie类: GenerateContact

/**
 * 
 * @Author:Ricardo
 * @Time:2020-04-21
 * @function:test SOAP Method
 * 
 * **/
global class GenerateContact {
    webservice static string createcontactinorganisationsecond(string firstname,string lastname,string title,string cemail){
        contact con = new contact();
        con.FirstName = firstname;
        con.LastName = lastname;
        con.Title = title;
        con.email = cemail;
        insert con;
        return 'success';
    }
}

第三步:将我们的WebService类生成WSDL文件,然后保存起来

 完成这几步之后,我们登录另一个Sales force账户,参照Salesforce SOAP 接口集成服务这篇博客中,关于如何引入外部SOAP接口的描述,将上面的俩WSDL文件导入系统.

需要注意的一个,我在尝试引入Partner WSDL文件时,遇到一个异常:

根据错误描述,我发现WSDL文件中有anyType这种元素,解决办法就是用文本编辑器将所有的anyType替换成String即可.

在上传GenerateContact.xml时,修改下类名称,方便使用

在生成的SOAP_GenerateContact和partnerSoapSforceCom中查找endpoint_x,并将其添加到remote site(远程站点)中

 OK,上述步骤都搞定之后呢,我们就可以从尝试调用这个SOAP方法了,代码如下

partnerSoapSforceCom.Soap mypartnersoap = new partnerSoapSforceCom.Soap();
partnerSoapSforceCom.LoginResult  partnerloginresult = mypartnersoap.login('child-system-username','child-system-password + child-system-SecurityToken');
SOAP_GenerateContact.SessionHeader_element webservicesessionheader = new SOAP_GenerateContact.SessionHeader_element();
webservicesessionheader.sessionId = partnerloginresult.sessionId; 

SOAP_GenerateContact.GenerateContact generateContact = new SOAP_GenerateContact.GenerateContact();
generateContact.SessionHeader = webservicesessionheader; 
String result = generateContact.createcontactinorganisationsecond('first','last','contactTitle','blog@test.com');
system.debug('result:' + result );

在控制台中执行这段代码,然后在我们的子系统中,就能找到这条通过接口创建的数据记录了

 这篇博客主要记录SOAP API的登录以及简单的插入数据,更多功能可以查询Sales force官方给出的SOAP API的文档

 参考文档:

SOAP API Call Limits

SOAP APEX API

原文地址:https://www.cnblogs.com/luqinghua/p/12632156.html