La fonction XUserGetTokenAndSignatureAsync utilise un argument d’énumération XUserGetTokenAndSignatureOptions pour récupérer de façon asynchrone les xtokens et les signatures des requêtes web.De même, la fonction XUserGetTokenAndSignatureUtf16Async utilise un argument d’énumération XUserGetTokenAndSignatureOptions pour récupérer de façon asynchrone les xtokens et les signatures Unicode des 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;}