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页面.但这感觉笨拙且没有支持.
现在我正在考虑制作一个公开可用的新网站来公开我的小部件.至少我可以放心地屏幕抓住那页.
任何帮助表示赞赏.我现在打算使用匿名网站方法.
将数据渲染到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)
归档时间: |
|
查看次数: |
4568 次 |
最近记录: |