将Salesforce VisualForce页面视为外部窗口小部件

时间:2011-10-20 20:43:44

标签: screen-scraping salesforce apex-code visualforce

我想将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,但是像这样的网址只是让我跳到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页面。但这感觉很笨拙,没有人支持。

现在我正在考虑制作一个公开的新网站,以便公开我的小部件。至少我可以放心地屏幕抓住那页。

感谢任何帮助。我现在打算使用匿名网站方法。

3 个答案:

答案 0 :(得分:9)

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

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

以下是REST Web服务示例。我只是在这里返回一个Map<String,String>,但你可以返回任何基本类型,任何sObject或基元或sObject的List或Map(只要Map有String键) - 参见the Apex REST Web Services docs < / p>

@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');
    }
}

答案 1 :(得分:0)

我不确定这是否适用于您的目的,但您可以尝试使用网址:

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

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

答案 2 :(得分:0)

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

站点背后的想法是,它允许您访问Visualforce页面而无需登录。