Page History
...
Code Block | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
package rest.code.examples; import java.io.IOException; import java.nio.charset.Charset; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Random; import org.apache.hc.client5.http.entity.mime.HttpMultipartMode; import org.apache.hc.client5.http.entity.mime.MultipartEntityBuilder; import org.apache.hc.client5.http.fluent.Content; import org.apache.hc.client5.http.fluent.Request; import org.apache.hc.core5.http.ContentType; import org.apache.hc.core5.http.HttpEntity; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; /** * Upload License File via the Yellowfin REST API */ public class UploadALicenseFile { public static void main(String[] args) throws Exception { System.out.println(""Upload License File""); String host = ""http://localhost:8080/Yellowfin""; String restUsername = ""admin@yellowfin.com.au""; String restPassword = ""test""; String fileToImport = ""/Downloads/Yellowfin-License.lic""; Path licenseFile = Paths.get(fileToImport); byte[] fileContents = Files.readAllBytes(licenseFile); String token = generateToken(host, restUsername, restPassword); HttpEntity newLicenseFileMulitpartEntity = MultipartEntityBuilder .create() .setMode(HttpMultipartMode.LEGACY) .setCharset(Charset.forName(""UTF-8"")) .addBinaryBody(""newLicence"", fileContents , ContentType.DEFAULT_BINARY, licenseFile.getFileName().toString()) .build(); System.out.println(""Upload License Content""); Content uploadLicenseContent = Request.post(host + ""/api/rpc/licence-management/upload-licence"") .addHeader(""Authorization"", ""YELLOWFIN ts="" + System.currentTimeMillis() + "" , nonce="" + new Random().nextLong() + "", token="" + token) .addHeader(""Accept"", ""application/vnd.yellowfin.api-v1+json"") .addHeader(""Content-Type"", newLicenseFileMulitpartEntity.getContentType()) .addHeader(""cache-control"", ""no-cache"") .body(newLicenseFileMulitpartEntity) .execute() .returnContent(); System.out.println(""License Upload Complete""); System.out.println(uploadLicenseContent.asString()); } /* * This function generates an access token for a user that will grant them access to * call REST API endpoints. */ public static String generateToken(String host, String username, String password) throws IOException { Content c = Request.post(host + ""/api/refresh-tokens"") .addHeader(""Authorization"", ""YELLOWFIN ts="" + System.currentTimeMillis() + "" , nonce="" + new Random().nextLong()) .addHeader(""Accept"", ""application/vnd.yellowfin.api-v1+json"") .addHeader(""Content-Type"", ""application/json"") .bodyString(""{ \""userName\"": \""""+ username + ""\"",\""password\"": \""""+ password + ""\""}"", null) .execute().returnContent(); JsonObject jsonObject = new JsonParser().parse(c.asString()).getAsJsonObject(); JsonElement accessToken = jsonObject.getAsJsonObject(""_embedded"").getAsJsonObject(""accessToken"").get(""securityToken""); if (accessToken!=null) { System.out.println(""Access Token: "" + accessToken); } else { System.out.println(""Token not retrieved successfully""); System.exit(-1); } return accessToken.getAsString(); } } |
Code Block | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
using System.Net.Http.Headers; using System.Text; using Newtonsoft.Json; using Newtonsoft.Json.Linq; namespace YellowfinAPIExamples { public class UploadALicenseFile { public static async Task Main(string[] args) { Console.WriteLine(""Upload License File""); string host = ""http://localhost:8080/Yellowfin""; string restUsername = ""admin@yellowfin.com.au""; string restPassword = ""test""; string fileToImport = ""/Downloads/Yellowfin-License.lic""; byte[] fileContents = File.ReadAllBytes(fileToImport); string token = await GenerateToken(host, restUsername, restPassword); MultipartFormDataContent multipartContent = new MultipartFormDataContent(); ByteArrayContent fileContent = new ByteArrayContent(fileContents); fileContent.Headers.ContentType = MediaTypeHeaderValue.Parse(""application/octet-stream""); multipartContent.Add(fileContent, ""newLicence"", Path.GetFileName(fileToImport)); Console.WriteLine(""Upload License Content""); using (var httpClient = new HttpClient()) { long nonce = new Random().NextInt64(); httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(""YELLOWFIN"", $""ts={DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()}, nonce={nonce}, token={token}""); httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(""application/vnd.yellowfin.api-v1+json"")); HttpResponseMessage response = await httpClient.PostAsync(host + ""/api/rpc/licence-management/upload-licence"", multipartContent); if (response.IsSuccessStatusCode) { string responseBody = await response.Content.ReadAsStringAsync(); Console.WriteLine(""License Upload Complete""); Console.WriteLine(responseBody); } else { Console.WriteLine($""Failed to upload license. Status code: {response.StatusCode}""); } } } public static async Task<string> GenerateToken(string host, string username, string password) { using (var client = new HttpClient()) { long nonce = new Random().NextInt64(); var requestBody = new { userName = username, password = password }; string jsonRequestBody = JsonConvert.SerializeObject(requestBody); var request = new HttpRequestMessage(HttpMethod.Post, host + ""/api/refresh-tokens""); request.Headers.Add(""Authorization"", $""YELLOWFIN ts={DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()}, nonce={nonce}""); request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue(""application/vnd.yellowfin.api-v1+json"")); request.Content = new StringContent(jsonRequestBody, Encoding.UTF8, ""application/json""); HttpResponseMessage response = await client.SendAsync(request); string responseContent = await response.Content.ReadAsStringAsync(); JObject jsonObject = JsonConvert.DeserializeObject<JObject>(responseContent); string accessToken = jsonObject[""_embedded""][""accessToken""][""securityToken""].ToString(); if (!string.IsNullOrEmpty(accessToken)) { Console.WriteLine(""Access Token: "" + accessToken); } else { Console.WriteLine(""Token not retrieved successfully""); Environment.Exit(-1); } return accessToken; } } } } |
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
package main import ( ""bytes"" ""encoding/json"" ""fmt"" ""io"" ""io/ioutil"" ""math/rand"" ""mime/multipart"" ""net/http"" ""os"" ""path/filepath"" ""time"" ) func main() { fmt.Println(""Upload License File"") host := ""http://localhost:8080/Yellowfin"" restUsername := ""admin@yellowfin.com.au"" restPassword := ""test"" fileToImport := ""/Downloads/Yellowfin-License.lic"" filePath := filepath.Clean(fileToImport) token, err := generateToken(host, restUsername, restPassword) if err != nil { fmt.Println(""Error generating token:"", err) return } file, err := os.Open(filePath) if err != nil { fmt.Println(""Error opening file:"", err) return } defer file.Close() body := &bytes.Buffer{} writer := multipart.NewWriter(body) part, err := writer.CreateFormFile(""newLicence"", filepath.Base(filePath)) if err != nil { fmt.Println(""Error writing to buffer:"", err) return } _, err = io.Copy(part, file) if err != nil { fmt.Println(""Error copying file to buffer:"", err) return } err = writer.Close() if err != nil { fmt.Println(""Error closing writer:"", err) return } nonce := rand.Int63() req, err := http.NewRequest(""POST"", host+""/api/rpc/licence-management/upload-licence"", body) if err != nil { fmt.Println(""Error creating request:"", err) return } req.Header.Set(""Authorization"", fmt.Sprintf(""YELLOWFIN ts=%d, nonce=%d, token=%s"", time.Now().UnixMilli(), nonce, token)) req.Header.Set(""Accept"", ""application/vnd.yellowfin.api-v1+json"") req.Header.Set(""Content-Type"", writer.FormDataContentType()) client := &http.Client{} resp, err := client.Do(req) if err != nil { fmt.Println(""Error sending request:"", err) return } defer resp.Body.Close() fmt.Println(""License Upload Complete"") responseBody, err := ioutil.ReadAll(resp.Body) if err != nil { fmt.Println(""Error reading response body:"", err) return } fmt.Println(string(responseBody)) } func generateToken(host, restUsername, restPassword string) (string, error) { nonce := rand.Int63() reqBody := fmt.Sprintf(`{""userName"": ""%s"", ""password"": ""%s""}`, restUsername, restPassword) req, err := http.NewRequest(""POST"", host+""/api/refresh-tokens"", bytes.NewBufferString(reqBody)) if err != nil { return """", err } req.Header.Set(""Authorization"", fmt.Sprintf(""YELLOWFIN ts=%d, nonce=%d"", time.Now().UnixMilli(), nonce)) req.Header.Set(""Accept"", ""application/vnd.yellowfin.api-v1+json"") req.Header.Set(""Content-Type"", ""application/json"") client := &http.Client{} resp, err := client.Do(req) if err != nil { return """", err } defer resp.Body.Close() respBody, err := ioutil.ReadAll(resp.Body) if err != nil { return """", err } var jsonResponse map[string]interface{} if err := json.Unmarshal(respBody, &jsonResponse); err != nil { return """", err } accessToken, ok := jsonResponse[""_embedded""].(map[string]interface{})[""accessToken""].(map[string]interface{})[""securityToken""].(string) if !ok { return """", fmt.Errorf(""Token not retrieved successfully"") } return accessToken, nil } |
Code Block | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
const fs = require('fs'); const FormData = require('form-data'); const fetch = require('node-fetch'); async function main() { const host = ""http://localhost:8080/Yellowfin""; const restUsername = ""admin@yellowfin.com.au""; const restPassword = ""test""; const fileToImport = ""/Downloads/Yellowfin-License.lic""; const fileContents = fs.readFileSync(fileToImport); const fileName = fileToImport.split('/').pop(); // Extracting filename from path const token = await generateToken(host, restUsername, restPassword); if (!token) { console.error(""Failed to retrieve access token""); return; } console.log(""Upload License File""); const formData = new FormData(); formData.append('newLicence', fileContents, { filename: fileName }); const headers = { 'Authorization': `YELLOWFIN ts=${Date.now()}, nonce=${generateNonce()}, token=${token}`, 'Accept': 'application/vnd.yellowfin.api-v1+json', ...formData.getHeaders() }; try { const response = await fetch(`${host}/api/rpc/licence-management/upload-licence`, { method: 'POST', headers: headers, body: formData }); if (!response.ok) { throw new Error(`HTTP error! Status: ${response.status}`); } const responseBody = await response.text(); console.log(""License Upload Complete""); console.log(responseBody); } catch (error) { console.error(""Error:"", error.message); } } async function generateToken(host, restUsername, restPassword) { const nonce = generateNonce(); const headers = { 'Authorization': `YELLOWFIN ts=${Date.now()}, nonce=${nonce}`, 'Accept': 'application/vnd.yellowfin.api-v1+json', 'Content-Type': 'application/json' }; const body = JSON.stringify({ userName: restUsername, password: restPassword }); try { const response = await fetch(`${host}/api/refresh-tokens`, { method: 'POST', headers: headers, body: body }); if (!response.ok) { throw new Error(`HTTP error! Status: ${response.status}`); } const jsonResponse = await response.json(); const accessToken = jsonResponse._embedded.accessToken.securityToken; if (accessToken) { console.log(`Access Token: ${accessToken}`); } else { console.log(""Token not retrieved""); } return accessToken; } catch (error) { console.error(""Error:"", error.message); } return null; } function generateNonce() { return Math.floor(Math.random() * Number.MAX_SAFE_INTEGER); } main(); |
Code Block | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
<?php function main() { $host = ""http://localhost:8080/Yellowfin""; $restUsername = ""admin@yellowfin.com.au""; $restPassword = ""test""; $fileToImport = ""/Downloads/Yellowfin-License.lic""; try { $token = generateToken($host, $restUsername, $restPassword); } catch (Exception $e) { echo ""Error generating token: "" . $e->getMessage(); return; } // Read file contents try { $fileContents = file_get_contents($fileToImport); } catch (Exception $e) { echo ""Error reading file: "" . $e->getMessage(); return; } $fileName = basename($fileToImport); // Build multipart form data $importOptions = json_encode(array( ""option1"" => ""value1"", ""option2"" => ""value2"" )); $multipartBody = buildMultipartEntity($fileContents, $fileName, $importOptions); echo ""Upload License Content\n""; try { $response = sendMultipartRequest($host, $token, $multipartBody, ""/api/rpc/licence-management/upload-licence""); echo ""License Upload Complete\n""; echo $response . ""\n""; } catch (Exception $e) { echo ""Error uploading license: "" . $e->getMessage(); } } function generateToken($host, $restUsername, $restPassword) { // Generate nonce $nonce = mt_rand(); // Create request body $requestBody = json_encode(array( ""userName"" => $restUsername, ""password"" => $restPassword )); // Create request headers $headers = array( 'Authorization: YELLOWFIN ts=' . intval(microtime(true) * 1000) . ', nonce=' . $nonce, 'Accept: application/vnd.yellowfin.api-v1+json', 'Content-Type: application/json' ); try { $response = httpRequest('POST', ""$host/api/refresh-tokens"", $headers, $requestBody); $jsonResponse = json_decode($response, true); // Get access token from response if (isset($jsonResponse[""_embedded""][""accessToken""][""securityToken""])) { $accessToken = $jsonResponse[""_embedded""][""accessToken""][""securityToken""]; echo ""Access Token: "" . $accessToken; return $accessToken; } else { throw new Exception(""Token not retrieved successfully""); } } catch (Exception $e) { throw new Exception(""Error generating token: "" . $e->getMessage()); } } function buildMultipartEntity($fileContents, $fileName, $importOptions) { $boundary = uniqid(); $multipartBody = ""--$boundary\r\n""; $multipartBody .= 'Content-Disposition: form-data; name=""newLicence""; filename=""' . $fileName . ""\""\r\n""; $multipartBody .= ""Content-Type: application/octet-stream\r\n\r\n""; $multipartBody .= $fileContents . ""\r\n""; $multipartBody .= ""--$boundary\r\n""; $multipartBody .= 'Content-Disposition: form-data; name=""importOptions""' . ""\r\n""; $multipartBody .= ""Content-Type: application/json\r\n\r\n""; $multipartBody .= $importOptions . ""\r\n""; $multipartBody .= ""--$boundary--""; return $multipartBody; } function sendMultipartRequest($host, $token, $multipartBody, $endpoint) { $boundary = substr($multipartBody, 2, strpos($multipartBody, ""\r\n"") - 2); $headers = array( 'Authorization: YELLOWFIN ts=' . intval(microtime(true) * 1000) . ', nonce=' . mt_rand() . ', token=' . $token, 'Accept: application/vnd.yellowfin.api-v1+json', 'Content-Type: multipart/form-data; boundary=' . $boundary, 'cache-control: no-cache' ); try { $response = httpRequest('POST', ""$host$endpoint"", $headers, $multipartBody); return $response; } catch (Exception $e) { throw new Exception(""Error sending multipart request: "" . $e->getMessage()); } } function httpRequest($method, $url, $headers, $data = null) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); if ($data !== null) { curl_setopt($ch, CURLOPT_POSTFIELDS, $data); } $response = curl_exec($ch); if (curl_errno($ch)) { throw new Exception('Error: ' . curl_error($ch)); } curl_close($ch); return $response; } main(); ?> |
Code Block | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
import json import random import time import os import requests def main(): host = ""http://localhost:8080/Yellowfin"" rest_username = ""admin@yellowfin.com.au"" rest_password = ""test"" file_to_import = ""/Downloads/Yellowfin-License.lic"" token = generate_token(host, rest_username, rest_password) # Ensure the file exists if not os.path.exists(file_to_import): print(f""Error: File '{file_to_import}' not found."") return # Read file contents with open(file_to_import, 'rb') as file: file_contents = file.read() # Prepare headers headers = { 'Authorization': f'YELLOWFIN ts={int(time.time() * 1000)}, nonce={random.randint(0, 2**63 - 1)}, token={token}', 'Accept': 'application/vnd.yellowfin.api-v1+json', 'cache-control': 'no-cache' } # Prepare multipart form data manually files = { 'newLicence': (file_to_import, file_contents, 'application/octet-stream') } try: response = requests.post(f""{host}/api/rpc/licence-management/upload-licence"", headers=headers, files=files) response.raise_for_status() print(""License Upload Complete"") print(response.text) except requests.RequestException as e: print(f""Error uploading license: {e}"") def generate_token(host, rest_username, rest_password): nonce = random.randint(0, 2 ** 63 - 1) # Create request body request_body = json.dumps({ ""userName"": rest_username, ""password"": rest_password }) # Create request headers headers = { 'Authorization': f'YELLOWFIN ts={int(time.time() * 1000)}, nonce={nonce}', 'Accept': 'application/vnd.yellowfin.api-v1+json', 'Content-Type': 'application/json' } try: response = requests.post(f""{host}/api/refresh-tokens"", headers=headers, data=request_body) response.raise_for_status() json_response = response.json() access_token = json_response[""_embedded""][""accessToken""][""securityToken""] print(""Access Token:"", access_token) return access_token except requests.RequestException as e: raise Exception(""Token not retrieved successfully"") from e if __name__ == ""__main__"": main() |
ライセンス自動プロビジョニング
ライセンス自動プロビジョニングは、Yellowfin インスタンスがリモードサーバで新しいライセンスファイルを探すための組み込みメカニズムです。これは、web.xml ファイルで、LicenceAutoProvision サーブレットを有効にすることで設定できます。
...