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

mhd8tkvw  于 2023-08-07  发布在  其他
关注(0)|答案(3)|浏览(100)

有没有办法通过apex代码创建远程站点设置?
setup->new remote->name->url->active->保存
使用远程站点创建所需的这些步骤。

sulc1iza

sulc1iza1#

不是天生的。远程站点设置是系统配置(元数据)的一部分,其中大部分不能通过从Apex运行插入/更新/删除来修改。那太危险了想象一下,添加一些恶意站点(将其列入白名单),发送一些敏感数据,然后删除设置的代码...
在部署过程中调用Metadata API、Tooling API等都有一些技巧。例如,您可以创建一个创建RemoteProxy记录(工具API)或RemoteSiteSetting(元数据API)的REST callout。您可以自己制作XML,或者查看Andy福塞特的库,以获取对Metadata API的Apex调用:https://github.com/financialforcedev/apex-mdapi没有亲自使用它,但我听说好东西。
可悲的是,这是一种鸡和蛋的情况--要从Apex调用任何一个API(甚至调用“self”,调用你已经在使用的SF服务器)--你需要一个现有的远程站点设置或命名凭据。再次-安迪F。演示了一个从JavaScript创建第一个远程站点的方法。所以这不是100%自动的,但是,在你需要的每个沙箱中访问1个配置类Visualforce页面并不是世界末日。

我不知道你为什么要写xcode。我不是一个Mac的人,但如果你在部署过程中自动化的东西,快速创建演示组织/沙箱与一些脚本,那么也许你应该看看SF蚂蚁迁移工具或SFDX命令。

8e2ybdfx

8e2ybdfx2#

是的,可以使用元数据服务API,这是非常常用的。它可以从Salesforce here获得。在async(即@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的信息。

2ul0zpep

2ul0zpep3#

下面是一个通过元数据API创建远程站点设置的脚本,无需MetadataService。

createRemoteSiteSetting(new Map<String, String>{
    'fullName' => 'TEST', // remote site setting name
    'description' => '', // description
    'url' => 'https://domain.invalid' // remote site URL      
});

/* SCRIPT */
final static String API_VERSION = '58';

public void createRemoteSiteSetting(Map<String, String> settingMap) {
    String endpoint = Url.getOrgDomainUrl().toExternalForm() + '/services/Soap/m/' + API_VERSION + '/';
    HttpRequest req = new HttpRequest();
    req.setEndpoint(endpoint);
    req.setMethod('POST');
    req.setHeader('SOAPAction', 'create');
    req.setHeader('Content-Type', 'text/xml');
    String body = generateEnvelope(settingMap);
    System.debug(body);
    req.setBody(body);
    HttpResponse response = new Http().send(req);
    System.debug('response status code: ' + response.getStatusCode());
    System.debug('response: ' + response.getBody());
}

public String generateEnvelope(Map<String, String> settingMap) {
    return '<?xml version="1.0" encoding="UTF-8"?>\n' +
            '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:apex="http://soap.sforce.com/2006/08/apex" xmlns:cmd="http://soap.sforce.com/2006/04/metadata" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">\n' +
            '    <soapenv:Header>\n' +
            '        <cmd:SessionHeader>\n' +
            '            <cmd:sessionId>' + UserInfo.getSessionId() + '</cmd:sessionId>\n' +
            '        </cmd:SessionHeader>\n' +
            '    </soapenv:Header>\n' +
            '    <soapenv:Body>\n' +
            '        <create xmlns="http://soap.sforce.com/2006/04/metadata">\n' +
            '            <metadata xsi:type="RemoteSiteSetting">\n' +
            '                <fullName>' + settingMap.get('fullName') + '</fullName>\n' +
            '                <description>' + settingMap.get('description') + '</description>\n' +
            '                <disableProtocolSecurity>false</disableProtocolSecurity>\n' +
            '                <isActive>true</isActive>\n' +
            '                <url>' + settingMap.get('url') + '</url>\n' +
            '            </metadata>\n' +
            '        </create>\n' +
            '    </soapenv:Body>\n' +
            '</soapenv:Envelope>';
}

字符串

相关问题