我可以通过顶点代码配置新的远程站点设置吗?

时间:2019-12-31 06:30:26

标签: xcode salesforce integration

是否可以通过apex代码创建远程站点设置?

设置->新远程->名称-> url->活动->保存 此步骤想使用远程站点创建。

2 个答案:

答案 0 :(得分:0)

不是本机的。远程站点设置是系统配置(元数据)的一部分,其中大多数不能通过运行Apex的插入/更新/删除来修改。那很危险。想象一下代码添加了一些恶意站点(将其列入白名单),向其中发送了一些敏感数据,然后删除了设置...

在部署过程中会使用黑客调用Metadata API,Tooling API等东西。例如,您可以设计一个REST标注,以创建RemoteProxy记录(工具API)或RemoteSiteSetting(元数据API)。您可以自己制作XML,也可以查看Andy Fawcett的库中对Metadata API的Apex调用:https://github.com/financialforcedev/apex-mdapi尚未亲自使用过,但我听说不错。

不幸的是,这有点麻烦,要从Apex中调用任一API(甚至是“ self”,也要访问此SF服务器),则需要现有的远程站点设置,或者命名凭证。再次-Andy F.演示了一个利用javascript制作第一个远程站点的黑客。因此它不是100%自动的,但是很好,在您需要的每个沙箱中访问1个类似config的Visualforce页面并不是世界末日...

不确定为什么要标记此。我不是Mac人士,但是如果您在部署过程中使某些东西自动化之后,使用一些脚本快速创建演示组织/沙盒,那么您应该考虑使用SF Ant Migration Tool或SFDX命令。

答案 1 :(得分:0)

是的,非常常用的Metadata Service API可以实现。 可从Salesforce here获得。通过异步(即@future)方法执行此操作,还可以从Aura或LWC中执行此操作。如果您不包装标注,则会出现以下错误:

"FATAL_ERROR System.CalloutException: Web service callout failed: WebService returned a SOAP Fault: INVALID_SESSION_ID: This session is not valid for use with the API faultcode=sf:INVALID_SESSION_ID faultactor="

下面的代码改编自此blog

future(callout=true)
public static void createRemoteSite(String fullName, String url) {
    //Metadata Service
    MetadataService.MetadataPort service = new MetadataService.MetadataPort();
    service.SessionHeader = new MetadataService.SessionHeader_element();
    service.SessionHeader.sessionId = UserInfo.getSessionId();

    //Metadata for remote site settings
    MetadataService.RemoteSiteSetting remoteSiteSettings = new MetadataService.RemoteSiteSetting();
    remoteSiteSettings.fullName = fullName;
    remoteSiteSettings.url = url;
    remoteSiteSettings.description = 'Remote site settings created from apex';
    remoteSiteSettings.isActive = true;
    remoteSiteSettings.disableProtocolSecurity = false;
    MetadataService.SaveResult[] results = service.createMetadata(
      new List<MetadataService.Metadata>{ remoteSiteSettings }
    );

    for (MetadataService.SaveResult result : results) {
      if (result.success) {
        //Success
        System.debug(result);
      } else {
        //Failed
        System.debug(result.errors[0].message);
      }
    }
  }

有关无效会话ID here的信息。