2011-10-20 42 views
2

我想将Salesforce VisualForce页面转换为我公司网站的窗口小部件。我想使用服务器端代码和服务帐户访问小部件。我会缓存,样式,并在我的网页中输出小部件html。我知道我可以通过服务器端代码和几个API调用重新创建窗口小部件,但是我喜欢能够在Salesforce中管理窗口小部件并让该窗口小部件可供在Salesforce中的其他位置重用的想法。将Salesforce VisualForce页面视为外部窗口小部件

在这种情况下,小部件将报告我们在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页面。但是,这感觉笨拙和不支持。

现在我正在考虑制作一个公开的新网站来公开我的小工具。至少我可以放心地刮掉那个页面。

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

回答

8

渲染数据到Visualforce页面,然后屏幕抓取似乎有点脆,更不用提效率低下 - 有一个更好的办法...

定义顶点REST Web服务,那么你可以很容易地调用该Web服务从您的服务器端代码中提取出来,如果需要,仍然可以在Visualforce中渲染它 - 您可以像调用其他Apex方法一样调用Apex REST方法。

下面是一个示例REST Web服务。我只是在一个Map<String,String>在这里,但你可以返回任何原始类型,任何的sObject或原语或sObjects的列表或地图(只要该地图具有字符串键) - 见the Apex REST Web Services docs

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

很好的回答;这是一个更好的做事方式。 –

+0

现在看起来头等。我会在这个周末尝试一下。谢谢! – twamley

+0

不客气!如果一切正常,请将对号移动到此答案,以便我们推广最佳做法:-) – metadaddy

0

我不知道这是否会满足您的需要,但有你可以尝试一个网址:

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

一旦页面加载,你可以重定向到URL窗口小部件。

+0

哦,这可能工作。测试一下。 – twamley

+0

谢谢,马修。我得到它与该网址的工作。我必须在第一个和第二个请求之间共享一个CookieContainer,以便认证继续进行 - 但它工作正常!我不假设你知道frontdoor.jsp是否需要一个重定向参数,我可以在一个请求中而不是两个请求中执行它? – twamley

+0

我试过retURL PARAM,我感到我必须有启动Javascript的错误信息(我使用C#和HttpWebRequest的)。 CookieCollection和两个请求工作得不错。再次感谢。 – twamley

0

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

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

+0

当我愿意咬掉一大块Salesforce网站时,我认为您是对的。但在这种情况下,我正在使用“小部件”。宝贝如果你愿意的话。为了让一个部件离开我的网站,我可以IFrame或屏幕刮 - 它们都感觉笨拙。我将按照metadaddy的建议设置自定义REST Web服务。不过谢谢。 – twamley

相关问题