从 7.12.2 到 7.13
在此迁移指南中,我们描述了 7.13 版本中已移除的 API,以及您应该使用的替代方案。
网络
拦截请求
v7.12.2
要拦截标准(例如 http
、https
)和自定义方案(例如 my-app
、jxb
)的 URL 请求,通常会使用 InterceptRequestCallback
回调函数。该回调允许您拦截请求,并覆盖响应数据,就好像是从 Web 服务器发送的一样。
以下示例演示了如何使用 jxb
自定义方案来拦截请求:
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 请求:
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()
方法,因此它被移除。