首页 > 解决方案 > 将 Force.com 用于任意 REST API 方法

问题描述

注意:这是我在https://github.com/developerforce/Force.com-Toolkit-for-NET/issues/357上的问题的副本。解决此问题后,我将同步两个线程。

我正在为 .NET 使用 Force.com 工具包。SOQL 查询对我来说工作正常,但我也在尝试进行一个简单的 REST 调用,类似于我可以在https://workbench.developerforce.com/restExplorer.php使用 REST Explorer 工具进行的调用。

我的代码是:

 using (var queryClient = new ForceClient(authClient.InstanceUrl, authClient.AccessToken, authClient.ApiVersion))
    {
        // Works fine
        string soql = GetMyQuery();
        QueryResult<dynamic> result = await queryClient.QueryAsync<dynamic>(soql);

        // Throws exception.  Changing version # doesn't seem to have any effect.
        dynamic restResult = await queryClient.ExecuteRestApiAsync<dynamic>("/services/data/v46.0/sobjects/Task/describe");

当我到达 ExecuteRestApiAsync 时,我得到了异常:

Salesforce.Common.ForceException
 HResult=0x80131500
 Message=Could not find a match for URL
 Source=Salesforce.Common
 StackTrace:
  at Salesforce.Common.JsonHttpClient.<HttpGetAsync>d__4`1.MoveNext()
  at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
[...]

我假设我的论点“/services/data/v46.0/sobjects/Task/describe”在 REST Explorer 工具中运行良好,需要更改。但是我猜到了一堆不同的选项(不同的版本,有或没有前导 URL 字符串等),到目前为止还没有任何工作。

有人可以告诉我如何使用 ForceClient 来获得与我从 Salesforce Workbench REST Explorer 返回的结果相同的结果吗?

标签: c#restsalesforce

解决方案


我最终更仔细地查看了 ForceClient 代码。ExecuteRestApiAsync 不是对此的正确调用。对于我的具体示例,我发现有 3 种方法可行:

dynamic restResult = await queryClient.DescribeAsync<dynamic>("Task");
restResult = await queryClient.BasicInformationAsync<dynamic>("Task/describe/");
restResult = await queryClient.BasicInformationAsync<dynamic>("Task/describe");

(以上所有 3 行都返回相同的结果)

这对于 sobjects 可以正常工作。我认为目前不能直接将此库用于诸如在其 REST API 定义中使用“分析”的报告之类的事情,但是有一些解决方法不需要重新编译代码。我发现的最简洁和最高效的方法是将您自己的 HttpClient 实例传递给 ForceClient ctor,并直接使用这些实例而不是 ForceClient 上的方法。对 ForceClient 代码的检查会发现,这些方法中的大多数string.Format()无论如何都只是 HttpClient 方法的薄包装。


推荐阅读