Metadata API
原文:https://salesforce.stackexchange.com/questions/110515/getting-session-id-in-lightning
#概要
- 現在、Lightningコンポーネントには$Apiグローバル変数はありません。 {! $Api.whatever}は常に失敗します。
- これは現時点では意図的なものです。 LightningコンポーネントでAPI対応のセッションIDを取得するための公式/サポートされている方法はありません。繰り返しますが、これは仕様によるものです。
- ほんの少しの創造性と巧妙さで、{!を使用して必要最低限のVisualforceページを作成できます。 $ Api.SessionID}、次にApexからgetContent(thatPage)を呼び出して、API対応のセッションIDを含むページを取得します。これは簡単にパースできるはずです。
そこから、AuraEnabledメソッドを介してそのセッションIDをLightningコンポーネントに渡すことは難しくありません。
ただし、明確にしましょう。これはハックであり、パフォーマンスが低下します。また、API対応のセッションIDをLightningコンポーネントコードから除外するのには十分な理由があります。
#回避策
そのため、Lightningで機能するための回避策として、推奨されないハックを作成することになりました。
次のように単純なVisualforceページを作成するだけです。
MetadataSessionId.vfp
<apex:page>
Start_Of_Session_Id{!$Api.Session_ID}End_Of_Session_Id
</apex:page>
次に、visualforce_Page.getContent()メソッドを使用してセッションIDを取得します。次のようになります。
public static MetadataService.MetadataPort createService()
{
MetadataService.MetadataPort service = new MetadataService.MetadataPort();
service.SessionHeader = new MetadataService.SessionHeader_element();
//service.SessionHeader.sessionId = UserInfo.getSessionId();
PageReference pageRef = new PageReference('/apex/MetadataSessionId');
service.SessionHeader.sessionId = MetadataUtils.getSessionIdFromVFPage(pageRef);
return service;
}
global class MetadataUtils {
global static String getSessionIdFromVFPage(PageReference visualforcePage){
String content = visualforcePage.getContent().toString();
Integer s = content.indexOf('Start_Of_Session_Id') + 'Start_Of_Session_Id'.length(),
e = content.indexOf('End_Of_Session_Id');
return content.substring(s, e);
}
}
そして、使用できる有効なセッションIDを取得しました。