我正在做一些包括LWC和工具API的东西。我写了下面这个方法,它做了一个callout。但是当我从lwc调用这个方法时,我无法获得会话Id,但如果我从开发控制台调用相同的方法,那么它就会正常工作。
Apex Code:
@AuraEnabled
public static string getList(String fieldName){
HttpRequest req = new HttpRequest();
req.setHeader('Authorization', 'Bearer ' + UserInfo.getSessionId());
System.debug('res------>'+UserInfo.getSessionID());
req.setHeader('Content-Type', 'application/json');
req.setEndpoint('callout:Tooling_Query/query/?q=Select+id,Namespaceprefix,developername,TableEnumOrId+FROM+customfield+Where+developername+LIKE'' +fieldName+ ''');
req.setMethod('GET');
Http h = new Http();
HttpResponse res = h.send(req);
System.debug('res------>'+res.getBody());
return res.getBody();
}
当我从lwc调用它时它返回这个
[{"message":"此会话不能与REST api一起使用","errorCode"; "INVALID_SESSION_ID"}]
所以,我如何从lwc获得会话id,我已经通过Tooling_Query的名称设置了一个连接的应用程序和命名凭据并为远程站点添加URL。
请帮我一下。
你不能。在闪电Web组件上下文中调用的Apex代码无法获得启用api的会话Id。这在闪电Web组件开发指南中有记录:
根据安全策略,由闪电组件创建的会话不允许API访问。这个限制甚至阻止了Apex代码对Salesforce进行API调用。为特定的API调用使用命名凭据允许您仔细地有选择地绕过此安全限制。
对启用api的会话的限制不是偶然的。仔细检查任何使用命名凭据的代码,以确保您没有创建漏洞。
唯一支持的方法是使用指定用户身份验证的命名凭据。
有一种利用Visualforce页面从这样的Apex上下文中获取会话Id的黑客。我不建议这样做,特别是如果您需要访问特权的tools API。使用正确的解决方案并构建命名凭据。