将 Apex 方法公开为 SOAP Web 服务

您可以将 Apex 方法公开为 SOAP Web 服务,以便外部应用程序 可以访问您的代码和应用程序。

若要公开 Apex 方法,请使用 Web 服务方法。

提示

  • Apex SOAP Web 服务允许外部应用程序调用 Apex 方法 通过 SOAP Web 服务。Apex 标注使 Apex 能够调用外部 Web 或 HTTP 服务业。
  • Apex REST API 将您的 Apex 类和方法公开为 REST Web 服务。请参阅将 Apex 类公开为 REST Web 服务。
  • Webservice 方法
  • 使用 Web 服务方法公开数据
  • 使用 webservice 关键字的注意事项
  • 重载 Web 服务方法

Webservice 方法

Apex 类方法可以公开为自定义 SOAP Web 服务调用。 这允许外部应用程序调用 Apex Web 服务来执行 Salesforce 中的操作。使用关键字来定义这些方法。webservice为 例:

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 类详细信息页面生成 WSDL,请执行以下操作:

webservice

  1. 在“设置”的应用程序中,在“快速”中输入“Apex Classes” “查找”框,然后选择“Apex 类”。
  2. 单击包含方法的类的名称。webservice
  3. 单击生成 WSDL

使用 Web 服务方法公开数据

调用自定义方法始终使用 system 上下文。因此,不会使用当前用户的凭据,并且任何具有访问权限的用户 这些方法可以使用其全部功能,而不管权限、字段级安全性或 共享规则。因此,使用关键字公开方法的开发人员应注意不要无意中暴露 任何敏感数据。webservicewebservice

警告

通过带有关键字的 API 公开的 Apex 类方法不强制执行对象权限,并且 默认情况下为字段级安全性。我们建议您使用适当的对象或 字段描述结果方法,用于检查当前用户对对象和字段的访问级别 Web Service 方法正在访问。请参阅 DescribeSObjectResult 类和 DescribeFieldResult 类。webservice

此外,共享规则(记录级访问) 仅当使用 keyword 声明类时才强制执行。此要求适用于所有 Apex 类,包括类 包含 WebService 方法。要强制执行 Web 服务方法的共享规则,请声明 包含这些方法和关键字的类。请参阅使用有共享、无共享和继承共享关键字。with sharingwith sharing

使用 webservice 关键字的注意事项

使用关键字时,请记住以下注意事项:

webservice

  • 使用关键字定义顶级 方法和外部类方法。不能使用关键字来定义类或内部类方法。webservicewebservice
  • 不能使用关键字来定义 接口,或定义接口的方法和变量。webservice
  • 系统定义的枚举不能在 Web 服务方法中使用。
  • 您不能在 触发。webservice
  • 包含用关键字定义的方法的所有类都必须声明为 .如果方法或内部类声明为 ,则还必须定义外部顶级类 如。webserviceglobalglobalglobal
  • 使用关键字定义的方法包括 本质上是全球性的。任何有权访问该类的 Apex 代码都可以使用这些方法。你 可以将关键字视为一种 access 修饰符,用于启用比 更多的访问。webservicewebserviceglobal
  • 将关键字用作 的任何方法定义为 。webservicestatic
  • 不能弃用托管包中的方法或变量 法典。webservice
  • 由于某些 Apex 元素没有 SOAP 类似物,因此使用关键字定义的方法不能采用以下方法 元素作为参数。虽然这些元素可以在方法中使用,但它们也 不能标记为返回值。webservice
    • 地图
    • 模式对象
    • Matcher 对象
    • 异常对象
  • 将关键字与 要作为 Web 服务的一部分公开的任何成员变量。不要标记这些 成员变量作为 。webservicestatic

调用 Apex SOAP Web 服务方法的注意事项:

  • Salesforce 拒绝对 Web 服务的访问,并拒绝来自具有受限访问权限的 AppExchange 包的请求。executeanonymous
  • 使用 API 版本 15.0 及更高版本保存(编译)的 Apex 类和触发器会生成 如果为字段分配的 String 值太长,则运行时错误。
  • 如果从API对密码过期或临时密码的用户进行登录调用, 不支持对自定义 Apex SOAP Web 服务方法的后续 API 调用,并导致 在INVALID_OPERATION_WITH_EXPIRED_PASSWORD错误中。重置用户的密码并制作 使用未过期的密码进行调用,以便能够调用 Apex Web 服务方法。

下面的示例演示一个包含 Web 服务成员变量和 Web 服务的类 方法:

global class SpecialAccounts {

  global class AccountInfo {
     webservice String AcctName;
     webservice Integer AcctNumber;
  }

  webservice static Account createAccount(AccountInfo info) {
    Account acct = new Account();
    acct.Name = info.AcctName;
    acct.AccountNumber = String.valueOf(info.AcctNumber);
    insert acct;
    return acct;
  }

  webservice static Id [] createAccounts(Account parent, 
       Account child, Account grandChild) {

        insert parent;
        child.parentId = parent.Id;
        insert child;
        grandChild.parentId = child.Id;
        insert grandChild;

        Id [] results = new Id[3];
        results[0] = parent.Id;
        results[1] = child.Id;
        results[2] = grandChild.Id;
        return results;
    }
}
// Test class for the previous class.
@isTest
private class SpecialAccountsTest {
  testMethod static void testAccountCreate() {
    SpecialAccounts.AccountInfo info = new SpecialAccounts.AccountInfo();
    info.AcctName = 'Manoj Cheenath';
    info.AcctNumber = 12345;
    Account acct = SpecialAccounts.createAccount(info);
    System.assert(acct != null);
  }
}

可以使用 AJAX 调用此 Web 服务。有关详细信息,请参阅 AJAX 中的 Apex。

重载 Web 服务方法

SOAP 和 WSDL 不能为重载方法提供良好的支持。因此,Apex 不会 允许两个标有关键字的方法 具有相同的名称。在同一类中具有相同名称的 Web 服务方法会生成一个 编译时错误。webservice

将 Apex 类公开为 REST Web 服务

您可以公开 Apex 类和方法,以便外部应用程序可以访问 通过REST架构的代码和应用程序。

本文概述了如何将 Apex 类公开为 REST Web 服务。您将了解到 关于类和方法批注,并参阅演示如何 实现此功能。

提示

Apex SOAP Web 服务允许外部应用程序调用 Apex 方法 通过 SOAP Web 服务。请参阅将 Apex 方法公开为 SOAP Web 服务。

  • Apex REST 简介
  • Apex REST 注解
  • Apex REST 方法
  • 使用 Apex REST Web 服务方法公开数据
  • Apex REST 代码示例

Apex REST 简介

您可以公开 Apex 类和方法,以便外部应用程序可以访问您的代码 以及通过 REST 架构的应用程序。这是通过定义 Apex 类来完成的 带有注释以将其公开为 REST 资源。同样,向方法添加注释以通过 REST 公开它们。为 例如,您可以将注解添加到 方法将其公开为可由 HTTP 请求调用的 REST 资源。有关更多信息,请参阅 Apex REST 附注@RestResource@HttpGetGET

这些类包含可用于 Apex REST 的方法和属性。

描述
RestContext 类包含 和 对象。RestRequestRestResponse
request使用类可以 在 RESTful Apex 方法中访问和传递请求数据。System.RestRequest
response表示用于将数据从 Apex RESTful Web 服务方法传递到 HTTP 响应。

调速器限制

对 Apex REST 类的调用将计入组织的 API 调控器限制。都 标准 Apex 调控器限制适用于 Apex REST 类。例如,最大请求 或响应大小为 6 MB(同步 Apex)或 12 MB(异步 Apex)。查看更多 信息,请参阅执行调控器和限制。

认证

Apex REST 支持以下身份验证机制:

  • OAuth 2.0 操作系统
  • 会话 ID

Apex REST 注解

使用这些注解将 Apex 类公开为 RESTful Web 服务。

  • @ReadOnly
  • @RestResource(urlMapping=’/yourUrl‘)
  • @HttpDelete
  • @HttpGet
  • @HttpPatch
  • @HttpPost
  • @HttpPut

Apex REST 方法

Apex REST支持两种资源表示格式: JSON 和 XML。默认情况下,JSON 表示形式在请求正文中传递,或者 response,格式由 HTTP 标头中的属性指示。Content-Type您可以检索 body 作为 HttpRequest 对象中的 Blob(如果 Apex 没有参数) 方法。如果在 Apex 方法中定义了参数,则尝试反序列化 请求正文添加到这些参数中。如果 Apex 方法具有非 void 返回类型, 资源表示形式将序列化到响应正文中。

允许使用以下返回和参数类型:

  • Apex 原语(不包括 sObject 和 Blob)。
  • s对象
  • Apex 基元或 sObject 的列表或映射(仅映射 支持字符串键)。
  • 包含所列类型的成员变量的用户定义类型 以上。

注意

Apex REST 不支持 Apex 中 Connect 的 XML 序列化和反序列化 对象。Apex REST支持JSON序列化和反序列化Connect in Apex 对象。此外,某些集合类型(如地图和列表)则不是 受 XML 支持。请参阅请求和响应数据注意事项 详。

带批注或必须没有参数的方法。这是因为 GET 和 DELETE 请求没有请求正文,因此无需反序列化。@HttpGet@HttpDelete

@ReadOnly 注解支持 Apex REST 注解 对于所有 HTTP 请求:@HttpDelete @HttpGet @HttpPatch @HttpPost @HttpPut

带注释的单个 Apex 类不能有多个方法使用相同的 HTTP 请求方法进行注释。例如 同一个类不能有两个方法用 注释。@RestResource@HttpGet

注意

Apex REST 目前不支持 Content-Type 的请求。multipart/form-data

Apex REST 方法注意事项

以下是定义 Apex REST 方法时需要考虑的几点。

  • RestRequest和对象可通过以下方式获得 default 通过静态对象在 Apex 方法中。此示例演示如何访问这些对象 通过:RestResponseRestContextRestContextRestRequest req = RestContext.request; RestResponse res = RestContext.response;
  • 如果 Apex 方法没有参数,则 Apex REST 将复制 HTTP 请求正文 进入物业。如果该方法具有参数,则 Apex REST 会尝试反序列化 将数据反序列化到这些参数中,并且数据不会反序列化到属性中。RestRequest.requestBodyRestRequest.requestBody
  • Apex REST 对响应使用类似的序列化逻辑。具有 非 void 返回类型将返回值序列化为 。如果返回 type 包含具有 null 值的字段,这些字段不会序列化为 响应正文。RestResponse.responseBody
  • Apex REST 方法可用于托管和 非托管包。调用包含在 托管包,则必须在 REST 中包含托管包命名空间 调用 URL。例如,如果类包含在托管包中 命名空间调用和 Apex REST 方法使用 /MyMethod/* 的 URL 映射, 通过 REST 用于调用这些方法的 URL 的格式为 https:// instance.salesforce.com/services/apexrest/packageNamespace/MyMethod/packageNamespace有关托管包的详细信息,请参阅什么是 包?.
  • 如果从 API 为具有过期或临时用户的用户进行登录调用 password,则对自定义 Apex REST Web 服务方法的后续 API 调用不会 支持并导致MUTUAL_AUTHENTICATION_FAILED错误。重置用户的 密码并使用未过期的密码拨打电话,以便能够呼叫 Apex Web 服务方法。
  • 如果在序列化过程中超出堆限制,则返回代码并将错误追加到 部分 JSON 响应。从 REST 方法返回 sObject 的集合 涉及缓冲每个 sObject 的 JSON 序列化形式。堆和 CPU 限制 可能直到 HTTP 响应标头和初始数据 开始流式传输回客户端。要获得对 statusCode 和 的控制权,请使用 而不是直接返回 s对象。HTTP 200{“status”:”some error occurred”}responseBodyRestResponse

用户定义类型

您可以在 Apex REST 方法中对参数使用用户定义的类型。Apex REST的 将请求数据反序列化为 、 或用户定义类型的类成员变量,除非 变量声明为 或 。例如,一个 Apex REST 方法 包含用户定义的类型参数可能如下所示:publicprivateglobalstatictransient

@RestResource(urlMapping='/user_defined_type_example/*')
global with sharing class MyOwnTypeRestResource {

    @HttpPost
    global static MyUserDefinedClass echoMyType(MyUserDefinedClass ic) {
        return ic;
    }

    global class MyUserDefinedClass {

        global String string1;
        global String string2 { get; set; }
        private String privateString;
        global transient String transientString;
        global static String staticString;

    }
    
}

此方法的有效 JSON 和 XML 请求数据如下所示:

{
    "ic" : {
                "string1" : "value for string1",
                "string2" : "value for string2",
                "privateString" : "value for privateString"
            }
}
<request>
    <ic>
        <string1>value for string1</string1>
        <string2>value for string2</string2>
        <privateString>value for privateString</privateString>
    </ic>
</request>

如果在示例请求中提供了 或 的值 数据,则生成 HTTP 400 状态代码响应。、 或 类成员 变量必须是 Apex REST 允许的类型:staticStringtransientStringpublicprivateglobal

  • Apex 基元(不包括 sObject 和 Blob)。
  • s对象
  • Apex 基元或 sObject 的列表或映射(只有带有 String 键的映射是 支持)。

创建用作 Apex REST 方法参数的用户定义类型时,请避免 引入任何导致循环 (定义 它们相互依赖)在运行时的用户定义类型中。这里有一个简单的 例:

@RestResource(urlMapping='/CycleExample/*')
global with sharing class ApexRESTCycleExample {
 
    @HttpGet
    global static MyUserDef1 doCycleTest() {
        MyUserDef1 def1 = new MyUserDef1();
        MyUserDef2 def2 = new MyUserDef2();
        def1.userDef2 = def2;
        def2.userDef1 = def1;
        return def1;
    }
 
    global class MyUserDef1 {
        MyUserDef2 userDef2;
    }    
 
    global class MyUserDef2 {
        MyUserDef1 userDef1;
    }
    
}

上一个示例中的代码会编译,但在运行时 发出请求时,Apex REST 会检测到 和 实例之间的循环, 并生成 HTTP 400 状态代码错误响应。

请求和响应数据 考虑

对于 Apex REST 的请求数据,需要记住一些其他事项 方法:

  • Apex 参数的名称很重要,尽管 订单没有。例如,XML 和 JSON 格式的有效请求 如下所示:@HttpPost global static void myPostMethod(String s1, Integer i1, Boolean b1, String s2){ "s1" : "my first string", "i1" : 123, "s2" : "my second string", "b1" : false }<request> <s1>my first string</s1> <i1>123</i1> <s2>my second string</s2> <b1>false</b1> </request>
  • URL 模式和 /* 匹配相同的 URL。如果一个类的 urlMapping 和另一个类 类的 urlMapping 为 /*, 此 URL 模式的 REST 请求解析为首先保存的类。URLpatternURLpatternURLpatternURLpattern
  • 某些参数和返回类型不能与 XML 一起使用,作为 请求或作为响应的接受格式,因此,方法 这些参数或返回类型不能用于 XML。列表、地图或 例如,不支持集合的集合。但是,您可以使用 这些类型带有 JSON。如果参数列表包含对 XML 和 XML,则返回 HTTP 415 状态代码。如果返回类型为 对 XML 无效的类型和 XML 是请求的响应格式,即 HTTP 返回 406 状态码。List<List<String>>
  • 对于 JSON 或 XML 格式的请求数据,布尔参数的有效值为:、(两者都被视为不区分大小写)和(数值,而不是“1”或“0”的字符串)。任何 布尔参数的其他值会导致错误。truefalse10
  • 如果JSON或XML请求数据包含多个同名参数, 这会导致 HTTP 400 状态代码错误响应。例如,如果您的 方法指定一个名为 的输入参数,以下 JSON 请求数据结果为 错误:x{ "x" : "value1", "x" : "value2" }同样,对于用户定义的类型,如果请求数据包括 同一用户定义类型成员变量的数据多次出现,结果 在错误中。例如,给定此 Apex REST 方法和用户定义的 类型:@RestResource(urlMapping='/DuplicateParamsExample/*') global with sharing class ApexRESTDuplicateParamsExample { @HttpPost global static MyUserDef1 doDuplicateParamsTest(MyUserDef1 def) { return def; } global class MyUserDef1 { Integer i; } }以下 JSON 请求数据还会导致 错误:{ "def" : { "i" : 1, "i" : 2 } }
  • 如果必须在请求中为某个参数指定 null 值 数据,可以完全省略参数或指定 null 值。在 JSON,您可以指定为值。在 XML,则必须使用带有 nil 的命名空间 价值。nullhttp://www.w3.org/2001/XMLSchema-instance
  • 对于 XML 请求数据,必须指定引用任何 Apex 的 XML 命名空间 命名空间。因此,例如,如果您定义了 Apex REST 方法 这样 如:@RestResource(urlMapping='/namespaceExample/*') global class MyNamespaceTest { @HttpPost global static MyUDT echoTest(MyUDT def, String extraString) { return def; } global class MyUDT { Integer count; } }您可以使用以下 XML 请求 数据:<request> <def xmlns:MyUDT="http://soap.sforce.com/schemas/class/MyNamespaceTest"> <MyUDT:count>23</MyUDT:count> </def> <extraString>test</extraString> </request>

响应状态代码

响应的状态代码是自动设置的。下表列出了一些 HTTP 状态 代码及其在 HTTP 请求方法上下文中的含义。对于完整的 响应状态码列表,请参见statusCode

请求方式响应状态代码描述
获取200请求成功。
补丁200请求成功,返回类型为 非无效。
补丁204请求成功,返回类型无效。
删除、获取、修补、发布、放置400发生未处理的用户异常。
删除、获取、修补、发布、放置403您无权访问指定的 Apex 类。
删除、获取、修补、发布、放置404URL 在现有批注中未映射。@RestResource
删除、获取、修补、发布、放置404不支持 URL 扩展名。
删除、获取、修补、发布、放置404具有指定命名空间的 Apex 类不能 发现。
删除、获取、修补、发布、放置405request 方法没有相应的 Apex 方法。
删除、获取、修补、发布、放置406标头中的 Content-Type 属性设置为其他值 而不是 JSON 或 XML。
删除、获取、修补、发布、放置406不支持 HTTP 请求中指定的标头。
获取、修补、发布、放置406不支持为 format 指定的 XML 返回类型。
删除、获取、修补、发布、放置415不支持 XML 参数类型。
删除、获取、修补、发布、放置415HTTP 请求标头中指定的 Content-Header 类型为 支持。
删除、获取、修补、发布、放置500发生未处理的 Apex 异常。

使用 Apex REST Web 服务方法公开数据

调用自定义 Apex REST Web 服务方法始终使用系统上下文。因此,不会使用当前用户的凭据,任何有权访问这些方法的用户都可以使用 无论权限、字段级安全性或共享规则如何,它们都具有全部功能。因此,使用 Apex REST 注解公开方法的开发人员应注意它们 不会无意中暴露任何敏感数据。

默认情况下,通过 Apex REST API 公开的 Apex 类方法不强制执行对象权限和字段级安全性。在使用 SOQL SELECT 语句,请使用 WITH SECURITY_ENFORCED子句。你 可以使用 Security.stripInaccessible 方法从查询和子查询结果中删除用户无法访问的字段,或在 DML 操作之前删除无法访问的 sObject 字段。您也可以使用适当的 object or field 描述结果方法,用于检查当前用户对 Apex REST API 方法正在访问的对象和字段的访问级别。请参阅 DescribeSObjectResult 类和 DescribeFieldResult 类。

此外,仅当使用关键字声明类时,才会强制执行共享规则(记录级访问)。此要求适用于所有 Apex 类,包括通过 Apex REST API 公开的类。若要强制执行 Apex REST API 方法的共享规则,请使用关键字声明包含这些方法的类。请参阅使用有共享不共享关键字。with sharingwith sharing

Apex REST 代码示例

这些代码示例向您展示如何通过 REST 公开 Apex 类和方法 体系结构以及如何从客户端调用这些资源。

  • Apex REST 基本代码示例 此示例
    演示如何在 Apex 中实现简单的 REST API,其中包含三种 HTTP 请求方法来删除、检索和更新记录。
  • 使用 RestRequest 的 Apex REST 代码示例 此示例演示如何使用 RestRequest
    对象向记录添加附件。

Apex REST 基本代码示例

此示例演示如何使用三个 HTTP 请求在 Apex 中实现简单的 REST API 删除、检索和更新记录的方法。有关身份验证的更多信息,请参阅 REST API 的“快速入门”部分 开发人员指南。

cURL

  1. 通过设置在实例中创建一个 Apex 类。在“快速查找”框中输入,选择“Apex” 类,然后单击“新建”。将此代码添加到新的 顶点 类:Apex Classes@RestResource(urlMapping='/Account/*') global with sharing class MyRestResource { @HttpDelete global static void doDelete() { RestRequest req = RestContext.request; RestResponse res = RestContext.response; String accountId = req.requestURI.substring(req.requestURI.lastIndexOf('/')+1); Account account = [SELECT Id FROM Account WHERE Id = :accountId]; delete account; } @HttpGet global static Account doGet() { RestRequest req = RestContext.request; RestResponse res = RestContext.response; String accountId = req.requestURI.substring(req.requestURI.lastIndexOf('/')+1); Account result = [SELECT Id, Name, Phone, Website FROM Account WHERE Id = :accountId]; return result; } @HttpPost global static String doPost(String name, String phone, String website) { Account account = new Account(); account.Name = name; account.phone = phone; account.website = website; insert account; return account.Id; } }
  2. 要从客户端调用该方法,请打开 命令行窗口,并执行以下命令以按 ID 检索帐户:doGetcURLcurl -H “Authorization: Bearer sessionId” “https://instance.salesforce.com/services/apexrest/Account/accountId
    • 将 sessionId 替换为您在登录响应中记下的元素。<sessionId>
    • 将 instance 替换为您的元素。<serverUrl>
    • 将 accountId 替换为已存在的帐户的 ID 在您的组织中。
    调用该方法后, Salesforce 返回一个 JSON 响应,其中包含如下数据 以后:doGet{ "attributes" : { "type" : "Account", "url" : "/services/data/v22.0/sobjects/Account/accountId" }, "Id" : "accountId", "Name" : "Acme" }注意本节中的示例不 使用命名空间的 Apex 类,这样您就不会在 URL 中看到命名空间。cURL
  3. 创建一个名为 account.txt 的文件,以包含 您将在下一个创建的帐户 步。{ "name" : "Wingo Ducks", "phone" : "707-555-1234", "website" : "www.wingo.ca.us" }
  4. 使用命令行窗口,执行以下命令以创建新帐户:cURLcurl -H “Authorization: Bearer sessionId” -H “Content-Type: application/json” -d @account.txt “https://instance.salesforce.com/services/apexrest/Account/”后 调用该方法,Salesforce 将返回一个 使用诸如 以后:doPost"accountId"accountId 是您刚刚创建的帐户的 ID POST 请求。
  5. 使用命令行窗口,执行以下命令,通过指定 ID 来删除帐户:cURLcurl —X DELETE —H “Authorization: Bearer sessionId” “https://instance.salesforce.com/services/apexrest/Account/accountId

使用 RestRequest 的 Apex REST 代码示例

此示例演示如何使用 RestRequest 向记录添加附件 对象。有关使用 进行身份验证的详细信息,请 请参阅 REST 的“快速入门”部分 API 开发人员指南。在此代码中,二进制文件数据存储在 RestRequest 对象,并且 Apex 服务类访问 RestRequest 对象。

cURL

  1. 通过输入“快速查找”框,在“设置”中在组织中创建一个 Apex 类,然后 选择 Apex 类。单击“新建”,并将以下代码添加到新的 类:Apex Classes@RestResource(urlMapping='/CaseManagement/v1/*') global with sharing class CaseMgmtService { @HttpPost global static String attachPic(){ RestRequest req = RestContext.request; RestResponse res = Restcontext.response; Id caseId = req.requestURI.substring(req.requestURI.lastIndexOf('/')+1); Blob picture = req.requestBody; Attachment a = new Attachment (ParentId = caseId, Body = picture, ContentType = 'image/jpg', Name = 'VehiclePicture'); insert a; return a.Id; } }
  2. 打开命令行窗口并执行以下命令以将附件上传到案例:cURLcurl -H “Authorization: Bearer sessionId” -H “X-PrettyPrint: 1” -H “Content-Type: image/jpeg” –data-binary @file “https://MyDomainName.my.salesforce.com/services/apexrest/CaseManagement/v1/caseId
    • 将 sessionId 替换为您记下的元素 在登录响应中。<sessionId>
    • 将 MyDomainName 替换为 My Domain 组织的名称。
    • 将 caseId 替换为 you 案例的 ID 想要将附件添加到。
    • 将 file 替换为路径和文件名 的。
    您的命令应如下所示(sessionId 替换为您的会话 ID 并替换为 我的域名 你 组织):MyDomainNamecurl -H "Authorization: Bearer sessionId" -H "X-PrettyPrint: 1" -H "Content-Type: image/jpeg" --data-binary @c:\test\vehiclephoto1.jpg "https://MyDomainName.my.salesforce.com/services/apexrest/CaseManagement/v1/500D0000003aCts"注意这里的例子 部分不要使用命名空间的 Apex 类,因此您不会在 URL。cURLApex 类返回一个 JSON 响应,其中包含 附件 ID,例如 以后:"00PD0000001y7BfMAI"
  3. 要验证附件和图像是否已添加到案例中,请导航到“案例”,然后选择“所有未结案例”视图。点击 ,然后向下滚动到“附件”相关列表。您应该看到 您刚刚创建的附件。