List icon 目录

从 7.12.2 到 7.13

在此迁移指南中,我们描述了 7.13 版本中已移除的 API,以及您应该使用的替代方案。

网络

拦截请求

v7.12.2

要拦截标准(例如 httphttps)和自定义方案(例如 my-appjxb)的 URL 请求,通常会使用 InterceptRequestCallback 回调函数。该回调允许您拦截请求,并覆盖响应数据,就好像是从 Web 服务器发送的一样。

以下示例演示了如何使用 jxb 自定义方案来拦截请求:

Java
Kotlin
network.set(InterceptRequestCallback.class, params -> {
    UrlRequest urlRequest = params.urlRequest();
    if (urlRequest.url().startsWith("jxb://")) {
        UrlRequestJob job = network.newUrlRequestJob(
                UrlRequestJob.Options
                        .newBuilder(urlRequest.id(), HttpStatus.OK)
                        .addHttpHeader(HttpHeader.of("Content-Type", "text/plain"))
                        .build());
        job.write("Hello!".getBytes());
        job.complete();
        return InterceptRequestCallback.Response.intercept(job);
    }
    return InterceptRequestCallback.Response.proceed();
});

...

browser.navigation().loadUrl("jxb://app/hello");
network.set(InterceptRequestCallback::class.java, InterceptRequestCallback { params ->
    val urlRequest: UrlRequest = params.urlRequest()
    if (urlRequest.url().startsWith("jxb://")) {
        val job = network.newUrlRequestJob(
            UrlRequestJob.Options
                .newBuilder(urlRequest.id(), HttpStatus.OK)
                .addHttpHeader(HttpHeader.of("Content-Type", "text/plain"))
                .build()
        )
        job.write("Hello!".toByteArray())
        job.complete()
        return InterceptRequestCallback.Response.intercept(job)
    }
    InterceptRequestCallback.Response.proceed()
})

...

browser.navigation().loadUrl("jxb://app/hello")

v7.13

之前拦截所有请求的方法存在几个安全和限制方面的问题:

  • 拦截的自定义方案被视为非标准,因此无法拦截 jxb 方案并返回包含访问 LocalStorage 的 JavaScript 的 HTML。这将导致访问被拒绝的错误;
  • 并非所有的方案都可以被拦截。例如,拦截 chromedata,或 chrome-extensions 这样的方案是被禁止的。API 允许这样做可能会导致 Chromium 内部出现意外行为或崩溃;
  • 一些方案被视为本地方案,例如 file。它们不能被拦截,因为它们不是网络请求。

在此版本中,我们改进了允许拦截 URL 请求和注册自定义方案的 API。新版本不再具有上述的安全限制和问题。

以下示例演示了如何注册自定义 jxb 方案并拦截所有对应的 URL 请求:

Java
Kotlin
EngineOptions options = EngineOptions
        .newBuilder(renderingMode)
        .addScheme(Scheme.of("jxb"), params -> {
            UrlRequestJob job = params.newUrlRequestJob(
                    UrlRequestJob.Options
                            .newBuilder(HttpStatus.OK)
                            .addHttpHeader(HttpHeader.of("Content-Type", "text/plain"))
                            .build());
            job.write("Hello!".getBytes());
            job.complete();
            return Response.intercept(job);
        })
        .build();
Engine engine = Engine.newInstance(options);

...

browser.navigation().loadUrl("jxb://app/hello");
val options = EngineOptions
        .newBuilder(renderingMode)
        .addScheme(Scheme.of("jxb")) { params ->
            val job = params.newUrlRequestJob(
                UrlRequestJob.Options
                    .newBuilder(HttpStatus.OK)
                    .addHttpHeader(HttpHeader.of("Content-Type", "text/plain"))
                    .build()
            )
            job.write("Hello!".toByteArray())
            job.complete()
            Response.intercept(job)
        }
        .build()
val engine = Engine.newInstance(options)

...

browser.navigation().loadUrl("jxb://app/hello")

已移除的 API

由于有了注册自定义方案和拦截 URL 请求的替代方法,不再需要使用 com.teamdev.jxbrowser.net.UrlRequest.id() 方法,因此它被移除。