3

我想将 Salesforce VisualForce 页面变成我公司网站的小部件。我想使用服务器端代码和服务帐户访问小部件。我将在我的网页中缓存、设置样式并输出小部件 html。我知道我可以使用服务器端代码和几个 API 调用来重现小部件,但我喜欢能够在 Salesforce 中管理小部件并让小部件可在 Salesforce 中的其他地方重用的想法。

在这种情况下,小部件将报告我们在 Salesforce 中跟踪的竞赛中的当前领导者。我计划将这种方法重用于其他“小型报告小部件”。这是一个非常有用的模式。我敢肯定有人已经优雅地解决了它。到目前为止,我的搜索都是空的。

我试图避免使用站点,因为访问我们公司网站的用户在 Salesforce 中没有用户帐户(现在我正在考虑一个允许匿名访问的站点)。

我的第一次尝试看起来像这样(受 SSO 到自助服务门户的启发):

var ws = new sfapi.SforceService();
var lr = ws.login(Secrets.salesforce_user_name, Secrets.salesforce_password);
string url = "https://na6.salesforce.com/apex/mywidget?sessionId=" + lr.sessionId;

我也尝试过 ?sid 和 ?csssid ,但是像这样的 URL 只是让我跳到 Salesforce 登录页面:

https://na6.salesforce.com/apex/mywidget?sessionId=00D3000000myorg!my-session-id-from-logging-in-with-the-api-8_i2fX_9wnYdwnwatGVuX6jGjmVmnv50j78yfGF1aKHdoDFtIx_J9

我可能会使用标准的屏幕抓取技术使用用户名和密码发布到标准的 Salesforce 登录表单,然后拉出 /apex/mywidget 页面。但这感觉笨拙且不受支持。

现在我正在考虑创建一个可公开访问的新站点,以公开我的小部件。至少我可以放心地筛选那个页面。

任何帮助表示赞赏。我现在将使用匿名站点方法。

4

3 回答 3

10

将数据渲染到 Visualforce 页面中,然后对其进行屏幕抓取似乎有点脆弱,更不用说效率低下 - 有更好的方法......

定义 Apex REST Web 服务,然后您可以轻松地从服务器端代码调用该 Web 服务,如果需要,仍然可以在 Visualforce 中呈现它 - 您可以像调用任何其他 Apex 方法一样调用 Apex REST 方法。

这是一个示例 REST Web 服务。我只是在Map<String,String>这里返回一个,但您可以返回任何原始类型、任何 sObject 或原始或 sObject 的 List 或 Map(只要 Map 具有 String 键) - 请参阅Apex REST Web 服务文档

@RestResource(urlMapping='/MyResource/*')
global with sharing class MyRestResource {
    @HttpGet
    global static Map<String,String> getResource() {
        Map<String,String> result = new Map<String,String>();

        result.put('key1', 'value1');
        result.put('key2', 'value2');

        return result;
    }
}

这是一些调用它的 PHP(我假设你有一个访问令牌(又名会话 ID)和实例 URL):

$url = "$instance_url/services/apexrest/MyResource";
$curl = curl_init($url);

curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HTTPHEADER,
  array("Authorization: OAuth $access_token",
    "Content-type: application/json"));

$json_response = curl_exec($curl);

$status = curl_getinfo($curl, CURLINFO_HTTP_CODE);

if ( $status != 200 ) {
    die("Error: call to URL $url failed with status $status, ".
      "response $json_response\n");
}

$response = json_decode($json_response, true);

echo "The service says ".$response['key1'].' '.$response['key2']."\n";

curl_close($curl);

这是一个 Visualforce 页面,如果您想显示相同的数据

<apex:page controller="TestRestController">
  <p>Controller says {!result}</p>
</apex:page>

页面控制器:

public class TestRestController {
    public String getResult() {
        Map<String, String> result = MyRestResource.getResource();

        return result.get('key1') + ' ' + result.get('key2');
    }
}
于 2011-10-28T14:54:30.947 回答
0

我不确定这是否适合您的目的,但您可以尝试一个 URL:

https://<endpoint host>/secur/frontdoor.jsp?sid=<session id>

加载该页面后,您可以重定向到小部件 url。

于 2011-10-20T21:12:00.233 回答
0

听起来 Force.com 站点正是您想要的。

Sites 背后的想法是它允许您无需登录即可访问 Visualforce 页面。

于 2011-10-22T04:03:44.630 回答