本篇参考:
https://developer.salesforce.com/docs/component-library/documentation/en/lwc/lwc.apex_continuations
https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_class_System_Continuation.htm#apex_class_System_Continuation
我们在项目中经常遇到会和后台apex进行交互通过SOQL/SOSL去获取数据展示在前台。当然,有些场景下数据是存储在外部系统,需要apex进行callout操作去获取数据展示前端。lwc针对callout操作可以简单的分成几步走,我们这里以
一. Enable Remote Site
针对外部系统的交互,我们第一步就是要先在salesforce系统中配置Remote Site,才可以访问,否则会报错。我们以https://th-apex-http-callout.herokuapp.com/这个trailhead提供的callout URL作为 remote site 的配置,这个URL返回的值为: {"trailhead":"is awesome."}
二. 前后台构建
我们以前做callout通常通过HttpRequest,然后将设置对应的header, url , body等以后然后Http.sendRequest即可实现外部系统callout交互。在lwc中,我们需要使用 Continuation这个salesforce提供的类进行交互,具体使用和文档可以查看最上方的链接。我们在lwc和apex交互需要设置 @AuraEnabled=true,这个同样需要,在这个基础上,需要设置continuation=true,如果请求数据是固定的,可以也设置cacheable=true从而增加效率,都声明情况下写法如下
@AuraEnabled(continuation=true cacheable=true)
除了这里的小变动,另外的改变就是不用Http.sendRequest方式来构建,而是使用 Continuation方式来构建。Continuation构造函数只有一个参数,用来设置time out时间,以秒为单位。他有几个参数,continuationMethod用来设置访问以后对应的回调函数。timeout用来设置超时时间,最多120秒。state设置用来当callout操作完成并且callback方法执行完成以后的状态值。我们可以用这个状态值来确定当前的callout操作是否执行完成。Continuation有三个常用的方法:
addHttpRequest/getRequests()/getResponse()这三个方法的详情描述自行查看上方的API文档。
ContinuationDemoController类描述如下:声明startRequest方法用来callout指定的service URL,然后将response放在callback函数中进行返回。
public with sharing class ContinuationDemoController { // Callout endpoint as a named credential URL // or, as shown here, as the long-running service URL private static final String LONG_RUNNING_SERVICE_URL = 'https://th-apex-http-callout.herokuapp.com/'; // Action method @AuraEnabled(continuation=true cacheable=true) public static Object startRequest() { // Create continuation. Argument is timeout in seconds. Continuation con = new Continuation(40); // Set callback method con.continuationMethod='processResponse'; // Set state con.state='Hello, World!'; // Create callout request HttpRequest req = new HttpRequest(); req.setMethod('GET'); req.setEndpoint(LONG_RUNNING_SERVICE_URL); // Add callout request to continuation con.addHttpRequest(req); // Return the continuation return con; } // Callback method @AuraEnabled(cacheable=true) public static Object processResponse(Listlabels, Object state) { // Get the response by using the unique label HttpResponse response = Continuation.getResponse(labels[0]); // Set the result variable String result = response.getBody(); return result; } }
continuationCmp.html:用来展示从远程服务器端的内容
<template> <div> service content: {formattedWireResult} div> template>
continuationCmp.js:写法上和访问apex class方法没有任何不同
import { LightningElement,wire } from 'lwc'; import startRequest from '@salesforce/apexContinuation/ContinuationDemoController.startRequest'; export default class ContinuationComponent extends LightningElement { // Using wire service @wire(startRequest) wiredContinuation; get formattedWireResult() { return JSON.stringify(this.wiredContinuation); } }
结果:将远程服务器内容转换成JSON字符串
总结:篇中只是简单介绍了Continuation的介绍,还有很多的细节的操作和限制没有在本篇中说出,比如Continuation和DML操作前后关系等限制,相关的limitation等等。篇中有错误的地方欢迎指出,有不懂欢迎留言。