La fonction XUserGetTokenAndSignatureAsync utilise un argument d’énumération XUserGetTokenAndSignatureOptions pour récupérer de façon asynchrone des xtokens et des signatures pour les requêtes web.De même, la fonction XUserGetTokenAndSignatureUtf16Async utilise un argument d’énumération XUserGetTokenAndSignatureOptions pour récupérer de façon asynchrone des xtokens et des signatures Unicode pour les requêtes web.L’exemple suivant montre comment récupérer de façon asynchrone le jeton et la signature d’un utilisateur.
HRESULT RequestTokenComplete(XAsyncBlock* abResult){ size_t bufferSize; RETURN_IF_FAILED(XUserGetTokenAndSignatureResultSize(abResult, &bufferSize)); std::vector<uint8_t> buffer(bufferSize); XUserGetTokenAndSignatureData* data; if (SUCCEEDED_LOG(XUserGetTokenAndSignatureResult(abResult, buffer.size(), buffer.data(), &data, nullptr /*bufferUsed*/))) { appLog.AddLog("Token: %s\n", data->token); if (data->signature != nullptr) { appLog.AddLog("Signature: %s\n", data->signature); } } return S_OK;}HRESULT RequestTokenAsync( XTaskQueueHandle queue, const char* url, bool forceRefresh){ auto asyncBlock = std::make_unique<XAsyncBlock>(); ZeroMemory(asyncBlock.get(), sizeof(*asyncBlock)); asyncBlock->queue = queue; asyncBlock->context = this; asyncBlock->callback = [](XAsyncBlock* ab) { LOG_IF_FAILED(static_cast<User*>(ab->context)->RequestTokenComplete(ab)); delete ab; }; XUserGetTokenAndSignatureOptions options = XUserGetTokenAndSignatureOptions::None; if (forceRefresh) { WI_SET_FLAG(options, XUserGetTokenAndSignatureOptions::ForceRefresh); } static const XUserGetTokenAndSignatureHttpHeader headers[] = { { "Accept", "application/json"}, { "Why", "Because"}, }; if (SUCCEEDED_LOG(XUserGetTokenAndSignatureAsync( _handle.get(), options, "GET", url, ARRAYSIZE(headers), headers, 0, nullptr, asyncBlock.get()))) { // The call succeeded, so release the std::unique_ptr ownership of XAsyncBlock* since the callback will take over ownership. // If the call fails, the std::unique_ptr will keep ownership and delete the XAsyncBlock* asyncBlock.release(); } return S_OK;}