3

SalesforceVisualForceページを会社のWebサイトのウィジェットに変えたいです。サーバー側のコードとサービスアカウントを使用してウィジェットにアクセスしたい。ウィジェットのhtmlをキャッシュし、スタイルを設定して、Webページに出力します。サーバー側のコードといくつかのAPI呼び出しを使用してウィジェットを再現できることはわかっていますが、Salesforceでウィジェットを管理し、Salesforce内の他の場所でウィジェットを再利用できるようにするというアイデアは気に入っています。

この場合、ウィジェットは、Salesforceで追跡しているコンテストの現在のリーダーについてレポートします。このアプローチを他の「ミニレポートウィジェット」に再利用する予定です。これは非常に便利なパターンです。誰かがすでにそれをエレガントに解決していると確信しています。私の検索はこれまで空になりました。

当社のWebサイトにアクセスしたユーザーが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メソッドと同じようにApexRESTメソッドを呼び出すことができます。

これがサンプルのRESTWebサービスです。ここで返すだけMap<String,String>ですが、任意のプリミティブ型、任意のsObject、またはプリミティブまたはsObjectのリストまたはマップ(マップに文字列キーがある場合)を返すことができます-ApexRESTWebサービスのドキュメントを参照してください

@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サイトはまさにあなたが望むもののようです。

サイトの背後にある考え方は、ログインしなくてもVisualforceページにアクセスできるようにすることです。

于 2011-10-22T04:03:44.630 に答える