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

twa*_*ley 2 screen-scraping salesforce visualforce apex-code

我想将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;
Run Code Online (Sandbox Code Playgroud)

我也试过了?sid和?csssid,但是这些网址只是让我跳到Salesforce登录页面:

https://na6.salesforce.com/apex/mywidget?sessionId=00D3000000myorg!my-session-id-from-logging-in-with-the-api-8_i2fX_9wnYdwnwatGVuX6jGjmVmnv50j78yfGF1aKHdoDFtIx_J9
Run Code Online (Sandbox Code Playgroud)

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

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

任何帮助表示赞赏.我现在打算使用匿名网站方法.

met*_*ddy 9

将数据渲染到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;
    }
}
Run Code Online (Sandbox Code Playgroud)

这是一些调用它的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);
Run Code Online (Sandbox Code Playgroud)

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

<apex:page controller="TestRestController">
  <p>Controller says {!result}</p>
</apex:page>
Run Code Online (Sandbox Code Playgroud)

页面控制器:

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

        return result.get('key1') + ' ' + result.get('key2');
    }
}
Run Code Online (Sandbox Code Playgroud)