带有托管包

时间:2016-09-16 18:00:13

标签: salesforce apex salesforce-service-cloud

我们在托管包中实施了一项休息服务。我们的一些客户已经安装了这个包。目前它需要3个参数。目的是将在一个系统中进行的更新发送到安装了托管包的Salesforce实例。在构建此服务时,我们遵循此处列出的示例...... ..

https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_rest_methods.htm

我们想在POST方法调用中添加一个可选参数。例如,从3个参数变为4个。我们希望此更改向后兼容。我们在尝试测试时看到的是在发送4个参数而不是旧的3个参数时出现“未找到资源”错误。

是否可以在不让所有客户再次安装软件包的情况下更新其余服务代码?或者是否安装了托管包的人必须出去获取新包才能读取新参数?管理此类更改或更新的最佳方法是什么?

是否有更好的实施或方式来处理这种情况?调用者是否有责任确定安装的API /包版本并传递三个或四个参数?

如果您可以分享有关在salesforce中升级REST API方法实施的最佳实践,我们非常感谢。

旧方法示例: ../apex/update与身体中的json一起发送的东西{" Element1":" Value1"," Element2":" Value2",&# 34;元素3":"值3"}

新方法示例: ../apex/update与身体中的json一起发送的东西{" Element1":" Value1"," Element2":" Value2",&# 34;元素3":"值3""元素4":"值4"}

2 个答案:

答案 0 :(得分:0)

我看到两个不同的问题,我会尝试解决这两个问题。

  1. "他们是否必须自己出去升级?"。不,他们没有,你可以推升级: https://developer.salesforce.com/docs/atlas.en-us.packagingGuide.meta/packagingGuide/push_upgrade_intro.htm
  2. "我们如何使这种向后兼容?"。您是否可以为三个输入参数维护旧方法并为四个输入参数创建一个新方法?
  3. 在没有任何特定代码的情况下给出答案会更难。

答案 1 :(得分:0)

有不同的方法可以实现这一目标。

首先是版本控制 @RestResource(urlMapping = '/DemoEndpoint/v1/*')

通过添加v1,您的最终用户可以使用不同的版本,并在准备好时升级到更新的版本。下一个版本可能是
@RestResource(urlMapping = '/DemoEndpoint/v2/*')

建议API端点使用版本控制。 您需要为每个版本创建单独的类。

第二种方法是更改​​接受输入参数的方式。 在此方案中,删除方法定义中的输入参数,并使用Request.requestbody。

这是原始代码(假设您遵循开发者指南示例)
@HttpPost global static void myPostMethod(string Element1, string Element2, string Element3, string Element4)

接受3或4个参数的新代码(或0参数,请参阅下面的注释)。

@HttpPost
global static string myPostMethod() {
    RestRequest request = RestContext.request;
    String body = request.requestBody.toString();
    List<Wrapper> obj = (List<Wrapper>) JSON.deserialize(body, List<Wrapper>.Class);

包装类将是

public class Wrapper{
    string Element1;
    string Element2;
    string Element3;
    string Element4;
}

如果Element4为空,则表示未传入。使用此方法,您需要进行输入验证。例如,这将接受零参数,并且所有元素都将为空。