DEV Community

SameX
SameX

Posted on

ArkWeb Page Interception and Custom Responses - Controlling the Loading Process

This article aims to deeply explore the technical details of the Huawei HarmonyOS Next system (up to API 12 as of now), and is summarized based on actual development practices.
It mainly serves as a vehicle for technical sharing and communication. Mistakes and omissions are inevitable. Colleagues are welcome to put forward valuable opinions and questions so that we can make progress together.
This article is original content, and any form of reprint must indicate the source and the original author.

Introduction

In Web application development, sometimes we need to have more fine-grained control over the page loading process, such as intercepting specific requests and returning custom response content. The ArkWeb framework provides such capabilities, allowing developers to intercept page and resource loading requests and customize responses. This article will introduce in detail how to implement these functions using the ArkWeb framework and demonstrate their application through some example code.

Intercepting Page Loading Requests

Intercepting Page Loading Requests Using the onLoadIntercept Interface

In ArkWeb, the onLoadIntercept interface is a powerful tool that can intercept requests before page loading, giving us the opportunity to examine the URL, modify the request, or directly return custom content.

export default {
    onCreate() {
        this.controller.onLoadIntercept((request) => {
            const url = request.url;
            if (url.includes('special-page')) {
                // If it's a special page, intercept the request and return custom content
                return this.handleSpecialPage(url);
            }
            // For other requests, don't intercept
            return false;
        });
    },
    handleSpecialPage(url) {
        // Return different custom page content based on the URL
        if (url.endsWith('/about')) {
            return this.createAboutPage();
        } else if (url.endsWith('/contact')) {
            return this.createContactPage();
        }
        // Return a 404 page by default
        return this.createNotFoundPage();
    },
    createAboutPage() {
        // Create custom content for the About Us page
        //...
    },
    createContactPage() {
        // Create custom content for the Contact Us page
        //...
    },
    createNotFoundPage() {
        // Create custom content for the 404 page
        //...
    }
}
Enter fullscreen mode Exit fullscreen mode
Intercepting Resource Loading Requests Using the onInterceptRequest Interface

Besides page requests, we can also intercept resource requests within a page, such as requests for images, CSS, or JavaScript files. This can be achieved using the onInterceptRequest interface.

export default {
    onCreate() {
        this.controller.onInterceptRequest((request) => {
            const url = request.url;
            if (url.includes('custom-script')) {
                // Intercept the request for a custom script file
                return this.createCustomScriptResponse();
            } else if (url.includes('custom-style')) {
                // Intercept the request for a custom style sheet
                return this.createCustomStyleResponse();
            }
            // Don't intercept other resource requests
            return false;
        });
    },
    createCustomScriptResponse() {
        // Return the content of a custom JavaScript file
        //...
    },
    createCustomStyleResponse() {
        // Return the content of a custom CSS file
        //...
    }
}
Enter fullscreen mode Exit fullscreen mode

Returning Custom Responses

Returning Custom Page Content

When intercepting a page request, we can return a completely custom HTML content. Here's how to construct and return a simple custom page content:

createCustomPageResponse(htmlContent) {
    const response = new WebResourceResponse('text/html', 'UTF-8', 200, 'OK', {
        'Content-Type': 'text/html'
    }, htmlContent);
    return response;
}
Enter fullscreen mode Exit fullscreen mode
Returning Custom File Resources

For resource requests, we can return custom file content, such as a processed image or an optimized script file.

createCustomFileResponse(mimeType, fileContent) {
    const response = new WebResourceResponse(mimeType, 'UTF-8', 200, 'OK', {
        'Content-Type': mimeType
    }, fileContent);
    return response;
}
Enter fullscreen mode Exit fullscreen mode

Example Code

The following is a more complete example showing how to intercept page loading requests and return custom page content, as well as how to intercept resource loading requests and return custom file resources.

export default {
    onCreate() {
        // Intercept page loading requests
        this.controller.onLoadIntercept((request) => {
            const url = request.url;
            if (url.includes('special-page')) {
                return this.handleSpecialPage(url);
            }
            return false;
        });
        // Intercept resource loading requests
        this.controller.onInterceptRequest((request) => {
            const url = request.url;
            if (url.includes('custom-script')) {
                return this.createCustomScriptResponse();
            } else if (url.includes('custom-style')) {
                return this.createCustomStyleResponse();
            }
            return false;
        });
    },
    handleSpecialPage(url) {
        // Process special pages based on the URL
        //...
    },
    createCustomScriptResponse() {
        // Return the content of a custom JavaScript file
        const scriptContent = 'console.log("Hello from custom script!");';
        return this.createCustomFileResponse('application/javascript', scriptContent);
    },
    createCustomStyleResponse() {
        // Return the content of a custom CSS file
        const styleContent = 'body { background-color: #f0f0ff0; }';
        return this.createCustomFileResponse('text/css', styleContent);
    },
    createCustomFileResponse(mimeType, fileContent) {
        // Build and return a custom file resource response
        const response = new WebResourceResponse(mimeType, 'UTF-8', 200, 'OK', {
            'Content-Type': mimeType
        }, fileContent);
        return response;
    }
}
Enter fullscreen mode Exit fullscreen mode

Conclusion

From the above examples, we can see that the ArkWeb framework provides developers with powerful page and resource interception capabilities, making custom responses simple and efficient. This ability can not only help us optimize application performance but also be used to implement specific business logic, such as permission control, ad interception, content replacement, etc. In actual development, by making rational use of these interfaces, the user experience and functionality richness of Web applications can be greatly enhanced.

Precautions

  • When intercepting requests and returning custom responses, ensure that the content type (Content-Type) of the response matches the actual content to avoid browser parsing errors.
  • The status code and header information of the custom response should be set according to the actual situation to comply with the HTTP protocol standard.
  • Excessive use of interception may affect the page loading performance, so it should only be used when necessary, and the code efficiency should be ensured. ### References
  • HarmonyOS Next Official Documentation - ArkWeb Framework Section
  • Web Development Best Practices - MDN Web Docs

Top comments (0)