โซLooker Embed SDK ืืื ืกืคืจืืื ืฉื ืคืื ืงืฆืืืช ืฉืืคืฉืจ ืืืืกืืฃ ืืงืื ืฉื ืืคืืืงืฆืืืช ืืื ืืจื ื ืืืืกืกืช-ืืคืืคื ืืื ืื ืื ืืืืืช ืืงืจื, ืชืฆืืืืช, ืืืืืช ืื ืืชืืืื ืืืืืขืื ืืืคืืืงืฆืืืช ืืืื ืืจื ื.
ืขืจืืช Embed SDK ืืืคืฉืจืช ืืืืขื ืืืจืืื ืืืืืช:
- ืืืกืคืช ืืื ืงืคืกืืืฆืื ืฉื ืืชืืื ืืืืืืข ืืื ืืืฆืืจ ืจืืืื HTML ืืืืคื ืืื ื.
- ืืขืืจืช ื ืชืื ืื ืืฉืืจืืช ืืื ืืืงืืจ ืืืขื, ืื ืฉืื ืืชืืฆืขืช ืชืงืฉืืจืช ืืื ืืกืืจืืช ืฉืื ืืช. ืขืจืืช ื-SDK ืืืืืขื ืืืคืืช ืืืขืืจืช ืืืืขืืช ืืื ืืืืืื ืื ืืื ืืฃ ืืืื ืืจื ื ืืืืจื ืืืื ืชืืื Looker ืืืืืืข, ืืืืฆืขืืช ืขืจืืฅ ืืืืขืืช ืืืขืืื.
ืืื Embed SDK, ืืคืฉืจ ืืืคืขืื ืืืจืืขืื ืืชืืื Looker ืืืืืข ืื ืืืืื ืืื ืืืืฆืขืืช ืืืจืืขื JavaScript ืืื dashboard:run:start ืื page:changed, ืฉืืชืืืจืื ืืืฃ ืืชืืขืื ืื ืืฉื ืืืจืืขื JavaScript ืืืืืขืื. ืืคืชืืื ืฉืืืืืขืื ืชืืื Looker ืืืืฆืขืืช ืืืจืืขื JavaScript ืฆืจืืืื ืืืฆืืจ ืืช ืจืืืื ื-HTML ืฉืืื ืืืคืืข ืืชืืื ืืืืืืข, ืืืืกืชืื ืขื ืืืจืืขื ืฉืืืืจ (broadcast) ืฉื ืืืื ืืชืงืฉืืจืช ืืื ืืคืืืงืฆืืืช ืืืื ืืจื ื ืืืื ืืชืืื ืืืืืืข.
ืืฉืื ืืฉืื ืื ืฉ-Looker Embed SDK ืฉืื ื ื-Looker API ืื-Looker API SDK:
- โซLooker Embed SDK ื ืืฆื ืืงืื ืืฆื ืืืงืื ืฉื ืืคืืืงืฆืืืช ืืืื ืืจื ื ืฉืืื ืืื ืื ืืช ืืืงืฉืจ ืืืชืืื ืฉื ืืืืืขื ืฉื Looker. โซ(Embed SDK ืื ืืกืคืง ืืืฉื ื-Looker API).
- โซLooker API ื ืืฆื ืืฉืจืช ืขื ืืืคืข Looker ืฉืืื ืืืืฆืข ืคืงืืืืช ืืฉืจืช Looker.
- ืขืจืืืช SDK ืฉื ืืงืื Looker API ื ืืฆืืืช ืืงืื ืฉื ืืคืืืงืฆืืืช ืฉืืื ื ืืคืืคื ืื, ืืื ืืกืคืง ืืืฉื ืืคืื ืงืฆืืืช ืฉื Looker API.
ืืฉืื ืืืขืช ืฉ-Looker ืื ืฉืืื ืืกืืจ ืฉืื ืืืคืืคื ืื ืฉืืืืื ืืืจืืขืื ืืืคืืืงืฆืืืช ืืื ืืจื ื. ืืืฉืืขืืช ืืื ืฉืกืืจ ืืืืจืืขืื ืื ืืืืื ืืืคืืคื ืื ืื ืืคืืืคืืจืืืช ืฉืื ืืช. ืืฉืื ืืืชืื ืืช ืงืื ื-JavaScript ืืฆืืจื ืืชืืืื ืืื ืืืชืืฉื ืืืืคืื ืืืืจืืขืื ืืืคืืคื ืื ืฉืื ืื.
ืืืืื ืืืืจื
ืืืืืื ืืื, ืืื ืืงืจื ืขื ืืืื 11 ื ืืฆืจ ืืชืื ืจืืื DOM ืขื ืืืืื embed_container. ืืืืจืืขืื dashboard:run:start ื-dashboard:run:complete ืืฉืืฉืื ืืขืืืื ืืืฆื ืฉื ืืืฉืง ืืืฉืชืืฉ ืืืืื ืืืืืขื, ืืืืืืจ ืกืงืจืืคื ืืืืฆื ืขื ืืืื run ืืฉืืืืช ืืืืขื dashboard:run ืืืื ืืืงืจื.
getEmbedSDK().init('looker.example.com', '/auth')
const setupConnection = (connection) => {
document.querySelector('#run').addEventListener('click', () => {
connection.asDashboardConnection().run()
})
}
try {
connection = await getEmbedSDK()
.createDashboardWithId('11')
.appendTo('#embed_container')
.on('dashboard:run:start', () => updateStatus('Running'))
.on('dashboard:run:complete', () => updateStatus('Done'))
.build()
.connect()
setupConnection(connection)
} catch (error) {
console.error('An unexpected error occurred', error)
}
ืืืืื ืืืื ืืืชืจ ืืชืืืจืช ืืืฃ ืืชืืขืื Embed SDK demo.
ืืืืจืช Looker Embed SDK
โซLooker Embed SDK ืืฉืชืืฉ ืืชืื ืืช ืฉื ืืืฉืง ืจืฆืืฃ. ืืืจื ืืืชืงื ื ืฉื ืขืจืืช ื-SDK ืืืืืขื, ืืืฆืจืื ืืช ืืชืืื ืืืืืืข ืืืชืืืจืื ืืืื. ืืืจื ืฉืืืืืืจ ื ืืฆืจ, ืืืื ืืืืืช ืฉืืืคืืืงืฆืื ืืืืจืืช ืชืืฆืข ืคืขืืืืช ืืชืืื ืืืืืืข.
ืืชืงื ื ืฉื Embed SDK
ืืคืฉืจ ืืืืจืื ืืช ืกืคืจืืืช ื-SDK ืืืืืขื ืฉื Looker ืืจื ืื ืื ืืืืืืช ืืฆืืชืื (NPM) ืืืชืืืช https://www.npmjs.com/package/@looker/embed-sdk. ืขื ืืืช, ืื ืจืืฆืื ืืจืืืช ืืช ืงืื ืืืืืื ืื ืืช ืืืืืื, ืฆืจืื ืืืฉืชืืฉ ืืืืืจ Looker Embed SDK.
ืืื ืืืชืงืื ืืช Looker Embed SDK ืืืืฆืขืืช ืืืืจ Looker Embed SDK, ืืืฆืขืื ืืช ืืฉืืืื ืืืืื:
- ืืชืงืื ืื ืืช Node.js, ืื ืขืืืื ืื ืืชืงื ืชื ืืืชื.
- ืืืจืืืื ืื ืืฉืืคืืื ืืช ืืืืจ
/looker-open-source/embed-sdk. - ืืืืื ืืืกืืฃ, ื ืื ืกืื ืืกืคืจืืื
/embed-sdkืืืจืืฆืื ืืช ืืคืงืืืืช ืืืืืช:
npm install
npm start
ืืฆืืจืช ืืชืืื ืืืืืืข
ืงืืื ืืืชืืืื ืืช ื-SDK ืขื ืืืชืืืช ืฉื ืฉืจืช Looker ืื ืงืืืช ืืงืฆื ืฉื ืฉืจืช ืืืคืืืงืฆืื ืืืืืขื, ืฉืืืฆืืจ ืืชืืืช URL ืืชืืื ืืืชืืืจืืช ื-Looker ืืืืืืข. ืื ืืชืืื ืืืืืืข ืืฉืชืืฉ ืืฉืจืชืื ืืืื. ืืืืืขื ืคืจืืืช, ืืฉืืืืื ืืช ื ืงืืืช ืืงืฆื ืฉื ืืืชืืื.
getEmbedSDK().init('looker.example.com', '/auth')
ืืืืจ ืืื, ืืชืืื ืืืืืืข ื ืืฆืจ ืืืืฆืขืืช ืกืืจื ืฉื ืฉืืืื ืืืืืจืช ืืคืจืืืจืื ืฉืื. ืืืง ืืืคืจืืืจืื ืืืื ืื ืืืคืฆืืื ืืืื ืืืืงื ืื ืืืื.
ืืชืืืื ืืชืืื ืืืฆืืจืช ืืืื ืืื ืืืช ืืืืืช ืืงืจื ืืืืฆืขืืช ืืื ืืงืจื id ืื ืืืืฆืขืืช url ืฉืืคื ื ืืืื ืืงืจื (ืฉื ืืฆืจ ืืชืืืื ืฉืืชืืืจ ืืืฃ ืืชืืขืื ืื ืืฉื ืืืืขื ืขื ืืชืืื).
getEmbedSDK().createDashboardWithId('id')
ืื
getEmbedSDK().createDashboardWithUrl('url')
ืืืืจ ืืื ืชืืืื ืืืืกืืฃ ืขืื ืืืคืืื ืื ืืืื ืืื ืืื ืืื ืืืฉืืื ืืช ืืืืืจื.
ืืืืืื, ืืชื ืืืืืื ืืฆืืื ืืืคื ืืืฃ ืืืื ืืจื ื ืืืืกืืฃ ืืช ืืืฉืง ืืืฉืชืืฉ ืฉื Looker ืืืืืขื. ืืงืจืืื ืืืื ืืืงืืช ืืช ืืืฉืง ืืืฉืชืืฉ ืฉื Looker ืืืืืขื ืืชืื ืจืืื HTML ืขื ืขืจื ืืืื ืฉื dashboard:
.appendTo('#dashboard')
ืืืกืคืช ืืืจืืื ืฉืืืคืืื ืืืืจืืขืื:
.on('dashboard:run:start',
() => updateStatus('Running')
)
.on('dashboard:run:complete',
() => updateStatus('Done')
)
ืืืฆืจืื ืืงืื ืืืืืข ืขื ืืื ืงืจืืื ืืฉืืืช build:
.build()
ืืชืืืจืืช ืืชืืื ืืืืืืข
ืืืจื ืฉืืืงืื ื ืืฆืจ, ืงืืจืืื ื-connect ืืื ืืืฆืืจ ืืช ื-iframe. ืชืืืื ืืืืืืจ ืืืฆืจ ืืช ืืืคืืื src ืฉืืฉืืฉ ืืืืืคืจืื ืืคืืขื. ืืืืคื ืฉืื ื ืืฆืจ ืืขืจื src ืชืืื ืืืืคื ืืืชืืื ืฉื Embed SDK:
- ืืชืื: ื ืงืืืช ืืงืฆื ืฉืฆืืื ื ืืืจืืืื ื ืืฉื ื ืฉื ืืงืจืืื ื-
initื ืงืจืืช. ื ืงืืืช ืืงืฆื ืืืืจื ืืืืืืจ ืืชืืืช URL ืืชืืื ืฉื ืืชืืืจืืช ืืืืืขื. - ืืื ืงืืืฆื Cookie: ื ืงืืืช ืืงืฆื ืื ืืคืื ืงืฆืื ืฉืืฆืืื ืืช ืืืจืืืื ื ืืฉื ื ืฉื ืืงืจืืื
initCookielessื ืงืจืืืช. ื ืงืืืช ืืงืฆื ืื ืืคืื ืงืฆืื ืืืืจืืช ืืืืืืจ ืืืงื ืื ืืื ืงืืืฆื Cookie, ืืืืืื ืืืงื ืื ืฉื ืืืืืช ืื ืืืื. ืืืกืืืื ืื ืืฆืืจืคืื ืืืชืืืช ื-URL ืฉื ืืืชืืืจืืช ืืืืืขื. - ืคืจืื: ืืืืืืจ ืืืืืขื ืืื ืคืจืื ืื ืื ืืฆืืื ืื ืืช ืืืจืืืื ื ืืฉื ื ืฉื ืืงืจืืื
init. ืืืงืจื ืืื, ืืชืืืช ื-URL ื ืืืจืช ืืืืื ืืืฆืืจืช ืืืืขืืช ืืืงืืฉืืช ืืคืจืืืจืื ืฉื ืืจืฉืื ืืืืืขื ืฉื Looker. ืืืืืขื ืคืจืืืช, ืืืฉืชืืฉ ืืืืจ ืืืืืช ืืืืืจ ืืืจ ื-Looker ืื ืฉืืชืืืช ื-URL ืืืืืขื ืืืืืช ืืช ืืคืจืืืจallow_login_screen=true.
โซconnect ืืืืืจ Promise ืฉืืืืื ืืืืฉืง ืืืืืืจ ืฉื ื-iframe ืืืืืืข.
.connect()
.then((connection) => {
// Save the connection
})
.catch(console.error)
ืืื ืืจืืงืฆืื
โซEmbed SDK 2.0.0 ืืืืืจื ืืืืืจ ืืืืื ืฉืชืืื ืืืื ืืจืืงืฆืื ืขื ืื ืกืืื ืืชืืื ื-Looker. ืืคืืืงืฆืืืช ืืืืืขื ืืืืื ืืงืืืข ืืืื ืกืื ืชืืื ืืืฆื ืืืืฆืข ืืื ืืจืืงืฆืื ืืืชืื.
if (connection.getPageType() === 'dashboards') {
connection.asDashboardConnection().run()
} else (connection.getPageType() === 'looks') {
connection.asLookConnection().run()
} else (connection.getPageType() === 'explore') {
connection.asExploreConnection().run()
}
ืืื ืฆืืจื ืืืฆืืจ ืืืืฉ ืืช ื-iframe ืืฉืฆืจืื ืืืขืื ืชืืื ืฉืื ื. ืืืงืื ืืืช, ืืคืฉืจ ืืืฉืชืืฉ ืืฉืืืืช ืืืืืืจ loadDashboard, โloadLook, โloadExplore ืื loadUrl. ืืฉืืืืช loadDashboard, โloadLook ื-loadExplore ืืงืืืืช id. ืืฉืืื loadUrl ืืงืืืช ืืืืขื URL, ืืืคืฉืจ ืืืฉืชืืฉ ืืฉืืื ืืื ืืื ืืฆืืื ืคืจืืืจืื ื ืืกืคืื (ืืื ืืกื ื ืื).
connection.loadDashboard('42')
// OR
connection.loadUrl('/embed/dashboards/42?state=california')
ืื ืืฉ ืฆืืจื ืืืฆืืจ iframe ืืืฉ, Embed SDK ืื ืืงืจื ืฉืื ืื ืงืืืืช ืืงืฆื ืฉื ืืืชืืื ืื ืฉื ืงืืืช ืืกืฉื. ืืืงืื ืืืช, ืืื ืืืฆืืจ iframe src ืืฉืืจืืช ืืืืื ืืื ืืืช ืืชืจืื. ืื ืืืื ืฆืืจื ืืืฆืืจ ืกืฉื ืืืฉ ืฉื ืืืืขื, ืืืื ืฆืจืื ืืืชืื ืืืืฉ ืืช Embed SDK ืืืืคื ืืื:
getEmbedSDK(new LookerEmbedExSDK()).init('looker.example.com', '/auth')
ื ืงืืืช ืงืฆื ืืืืืืช ืฉื ืืชืืืช URL ืืชืืื
ืืงืืข ืืื ืื ืจืืืื ืื ืืืืืขื ืืื ืงืืืฆื Cookie. ืคืจืืื ื ืืกืคืื ืืืื ืื ืืืืืจ ืื ืืฉื ืืืืขื ืืื ืงืืืฆื Cookie.
ืืื ืืืฉืชืืฉ ื-Embed SDK, ืฆืจืื ืืกืคืง ืฉืืจืืช ืืงืฆื ืืขืืจืคื ืฉืืืคื ืืืชืืื ืฉื ืืชืืืช ื-URL ืืืืืขื. ืฉืืจืืช ื-SDK ืืืืืขื ืงืืจื ืืฉืืจืืช ืืื ืืื ืืืฆืืจ ืืชืืืช URL ืืชืืื ืฉืืืืืืืช ืืืฉืชืืฉ ืฉืฉืืื ืืช ืืืงืฉื. ืชืืืื ื-Backend ืืืื ืืืฆืืจ ืืช ืืชืืืช ื-URL ืืืชืืื ืืืืืขื ืืขืฆืื ืืืืฆืขืืช ืกืื ืืืืืขื, ืื ืืืฆืืจ ืืช ืืชืืืช ื-URL ืืืืฆืขืืช ืงืจืืื ื-Looker Create Signed Embed URL API. ืืฆืืจื ืืืชืืื ืืื ืืืช ืฉื ืืชืืืืช URL ืืืคืฉืจืืช ืืืืื ืข ืืืคืขืืช Looker API, ืืื ืืืงืืื ืืช ืืื ืืืืืืจ. ืืงืจืืื ื-Looker API ืืืจืฉืช ืคืืืช ืงืื ืืงื ืืืชืจ ืืชืืืง ืืืชื.
ืืืืื ืืฉืืืช ืขืืจ ื-JavaScript ืืืฆืืจืช ืืชืืืช URL ืืชืืื, createSignedUrl(), ื ืืฆืืช ื-server/utils/auth_utils.ts. ืืฉืืืืฉ ืื ืืื ืืืืงืื:
import { createSignedUrl } from './utils/auth_utils'
app.get('/looker_auth', function (req, res) {
// It is assumed that the request is authorized
const src = req.query.src
const host = 'looker.example.com'
const secret = ... // Embed secret from Looker Server Embed Admin page
const user = ... // Embedded user definition
const url = createSignedUrl(src, user, host, secret)
res.json({ url })
})
ืืคืฉืจ ืืขืืื ืืืืืื ืฉื Python ืืืืืจ.
ืืืืจืช ืืืืืช ืืชืงืื ืฉื ืืชืืืืช URL ืืชืืืืช
ืืงืืข ืืื ืื ืจืืืื ืื ืืืืืขื ืืื ืงืืืฆื Cookie. ืคืจืืื ื ืืกืคืื ืืืื ืื ืืืืืจ ืื ืืฉื ืืืืขื ืืื ืงืืืฆื Cookie.
ืืคืฉืจ ืืืืืืจ ืืช ื ืงืืืช ืืงืฆื (endpoint) ืฉื ืืืืืืช ืื ืฉืชืืคืฉืจ ืืืชืจืืช ืืงืฉื ืืืชืืื ืืืฉืืช ืืชืืืื ื-CORS. ืืฉื ืื, ืืขืืืจืื ืืืืืืงื ืืคืฉืจืืืืช ืืฉืืื init.
getEmbedSDK().init('looker.example.com', {
url: 'https://api.acme.com/looker/auth',
headers: [{ name: 'Foo Header', value: 'Foo' }],
params: [{ name: 'foo', value: 'bar' }],
withCredentials: true, // Needed for CORS requests to Auth endpoint include Http Only cookie headers
})
ืคืชืจืื ืืขืืืช
โซEmbed SDK ืืืืกืก ืขื chatty. โซChatty ืืฉืชืืฉ ืื ืืคืื ืืืืื ืืจืืฉืื ืืืืื. ืืคืฉืจ ืืืคืขืื ืืช ืืจืืฉืื ืืืืื ืืืกืืฃ ืฉื ืืืคืืคื ืืืืฆืขืืช ืืคืงืืื ืืืื:
localStorage.debug = 'looker:chatty:*'
```none
Note that both the parent window and the embedded content have separate local storage, so you can enable logging on one, the other, or both. You can disable logging with this command:
```javascript
localStorage.debug = ''