从 7.x.x 到 8.x.x
7.x.x 中
从 7.12.2 到 7.13
在此迁移指南中,我们描述了 7.13 版本中已移除的 API,以及您应该使用的替代方案。
网络
拦截请求
v7.12.2
要拦截标准(例如 http、https)和自定义方案(例如 my-app、jxb)的 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。这将导致访问被拒绝的错误; - 并非所有的方案都可以被拦截。例如,拦截
chrome、data,或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() 方法,因此它被移除。