Skip to Main Content
Tree in Redwood Light User Logged

URL in JavaScript

APEX JavaScript
URL in JavaScript

Example:

function parseApexUrl(url = window.location.href) {
    const urlObj = new URL(url);
    const pathParts = urlObj.pathname.split('/').filter(Boolean);

    // Query parameters as array of {key, value}
    const paramsArray = Array.from(urlObj.searchParams.entries()).map(
        ([key, value]) => ({ key, value })
    );

    // Determine if classic (non-friendly) URL: /ords/f?p=...
    const isClassic =
        pathParts.length > 0 &&
        pathParts[pathParts.length - 1] === 'f' &&
        urlObj.searchParams.has('p');

    // Oracle APEX environment (if available)
    const apexEnv = (typeof apex !== "undefined" && apex.env) ? apex.env : null;
    const apexSessionId = apexEnv ? apexEnv.APP_SESSION : null;
    const apexPageId = apexEnv ? apexEnv.APP_PAGE_ID : null;

    // Classic URL parsing
    let workspace = null, appAlias = null, pageAlias = null, serviceName = null, baseIndex = null;
    let sessionId = null, pageId = null;

    if (isClassic) {
        serviceName = pathParts[0] || null;
        // Extract appId, pageId/alias, sessionId from the p parameter
        const fParam = urlObj.searchParams.get('p');
        const parts = fParam ? fParam.split(':') : [];
        sessionId = apexSessionId || (parts.length > 2 ? parts[2] : urlObj.searchParams.get('session')) || null;
        if (apexPageId && parts[1]) {
            if (parts[1] === apexPageId) {
                pageId = apexPageId;
                pageAlias = null;
            } else {
                pageId = apexPageId;
                pageAlias = parts[1];
            }
        } else {
            pageId = parts[1] || null;
            pageAlias = null;
        }
    } else {
        // Friendly URL parsing
        let rIndex = pathParts.indexOf('r');
        baseIndex = (rIndex !== -1) ? rIndex + 1 : null;
        workspace = (baseIndex !== null) ? pathParts[baseIndex] || null : null;
        appAlias = (baseIndex !== null) ? pathParts[baseIndex + 1] || null : null;
        pageAlias = (baseIndex !== null) ? pathParts[baseIndex + 2] || null : null;
        serviceName = (rIndex > 0) ? pathParts.slice(0, rIndex).join('/') : (pathParts[0] || null);
        sessionId = apexSessionId || urlObj.searchParams.get('session') || null;
        pageId = apexPageId || null;
    }

    // Reconstruct the full URL
    let fullUrlReconstructed;
    if (isClassic) {
        // For classic URLs, preserve the original query string exactly
        const portPart = urlObj.port ? `:${urlObj.port}` : '';
        fullUrlReconstructed = `${urlObj.protocol}//${urlObj.hostname}${portPart}${urlObj.pathname}`;
        if (urlObj.search) {
            fullUrlReconstructed += urlObj.search;
        }
    } else {
        // For friendly URLs, reconstruct as normal
        const portPart = urlObj.port ? `:${urlObj.port}` : '';
        const reconstructedQuery = paramsArray
            .map(param => encodeURIComponent(param.key) + '=' + encodeURIComponent(param.value))
            .join('&');
        fullUrlReconstructed = `${urlObj.protocol}//${urlObj.hostname}${portPart}${urlObj.pathname}${reconstructedQuery ? '?' + reconstructedQuery : ''}`;
    }

    // Compare original and reconstructed URLs
    const reconstructionValid = (url === fullUrlReconstructed);

    return {
        protocol: urlObj.protocol,
        hostname: urlObj.hostname,
        port: urlObj.port,
        fullUrl: url,
        fullUrlReconstructed: fullUrlReconstructed,
        reconstructionValid: reconstructionValid,
        paramsArray: paramsArray,
        workspace: workspace,
        appAlias: appAlias,
        pageAlias: pageAlias,
        serviceName: serviceName,
        pathParts: pathParts,
        baseIndex: baseIndex,
        sessionId: sessionId,
        pageId: pageId,
        apexEnv: apexEnv
    };
}

Run:

parseApexUrl()