Route
每当使用 Page.route() 或 BrowserContext.route() 设置网络路由时,Route
对象允许处理该路由。
了解更多关于 网络。
方法
abort
在 v1.9 之前添加中止路由的请求。
用法
Route.abort();
Route.abort(errorCode);
参数
-
可选的错误代码。默认为
failed
,可以是以下之一'aborted'
- 操作被中止(由于用户操作)'accessdenied'
- 拒绝访问除网络以外的资源的权限'addressunreachable'
- IP 地址不可达。这通常意味着没有到指定主机或网络的路由。'blockedbyclient'
- 客户端选择阻止请求。'blockedbyresponse'
- 请求失败,因为响应是与未满足的要求一起提供的(例如“X-Frame-Options”和“Content-Security-Policy”祖先检查)。'connectionaborted'
- 连接超时,因为未收到已发送数据的 ACK。'connectionclosed'
- 连接已关闭(对应于 TCP FIN)。'connectionfailed'
- 连接尝试失败。'connectionrefused'
- 连接尝试被拒绝。'connectionreset'
- 连接已重置(对应于 TCP RST)。'internetdisconnected'
- 互联网连接已断开。'namenotresolved'
- 无法解析主机名。'timedout'
- 操作超时。'failed'
- 发生了一般性错误。
返回值
fallback
在 v1.23 中添加使用可选的覆盖继续路由的请求。该方法类似于 Route.resume(),区别在于其他匹配的处理程序将在发送请求之前被调用。
用法
当多个路由匹配给定模式时,它们按照与其注册顺序相反的顺序运行。这样,最后注册的路由始终可以覆盖所有先前的路由。在下面的示例中,请求将首先由最底部的处理程序处理,然后它将回退到前面的处理程序,最后将被第一个注册的路由中止。
page.route("**/*", route -> {
// Runs last.
route.abort();
});
page.route("**/*", route -> {
// Runs second.
route.fallback();
});
page.route("**/*", route -> {
// Runs first.
route.fallback();
});
注册多个路由在您希望不同的处理程序处理不同类型的请求时很有用,例如 API 调用与页面资源,或 GET 请求与 POST 请求,如以下示例所示。
// Handle GET requests.
page.route("**/*", route -> {
if (!route.request().method().equals("GET")) {
route.fallback();
return;
}
// Handling GET only.
// ...
});
// Handle POST requests.
page.route("**/*", route -> {
if (!route.request().method().equals("POST")) {
route.fallback();
return;
}
// Handling POST only.
// ...
});
在回退到后续处理程序时,还可以修改请求,这样中间路由处理程序就可以修改请求的 url、方法、标头和 postData。
page.route("**/*", route -> {
// Override headers
Map<String, String> headers = new HashMap<>(route.request().headers());
headers.put("foo", "foo-value"); // set "foo" header
headers.remove("bar"); // remove "bar" header
route.fallback(new Route.ResumeOptions().setHeaders(headers));
});
使用 Route.resume() 立即将请求发送到网络,在这种情况下,其他匹配的处理程序将不会被调用。
参数
options
Route.FallbackOptions
(可选)
返回值
fetch
在 v1.29 中添加执行请求并获取结果而无需满足它,以便可以修改响应然后满足它。
用法
page.route("https://dog.ceo/api/breeds/list/all", route -> {
APIResponse response = route.fetch();
JsonObject json = new Gson().fromJson(response.text(), JsonObject.class);
JsonObject message = itemObj.get("json").getAsJsonObject();
message.set("big_red_dog", new JsonArray());
route.fulfill(new Route.FulfillOptions()
.setResponse(response)
.setBody(json.toString()));
});
参数
options
Route.FetchOptions
(可选)-
setHeaders
Map<String, String> (可选)#如果设置,则更改请求 HTTP 标头。标头值将被转换为字符串。
-
setMaxRedirects
int (可选)在 v1.31 中添加#将自动跟随的请求重定向的最大数量。如果超出数量,则会抛出错误。默认为
20
。传递0
表示不跟随重定向。 -
setMaxRetries
int (可选)在 v1.46 中添加#网络错误应重试的最大次数。当前仅重试
ECONNRESET
错误。不根据 HTTP 响应代码重试。如果超出限制,则会抛出错误。默认为0
- 不重试。 -
如果设置,则更改请求方法(例如 GET 或 POST)。
-
setPostData
String | byte[] (可选)#如果设置,则更改请求的 post 数据。
-
setTimeout
double (可选)在 v1.33 中添加#请求超时,以毫秒为单位。默认为
30000
(30 秒)。传递0
禁用超时。 -
如果设置,则更改请求 URL。新 URL 必须与原始 URL 具有相同的协议。
-
返回值
细节
请注意,setHeaders 选项将应用于获取的请求以及由此引发的任何重定向。如果您只想将 setHeaders 应用于原始请求,而不是重定向,请改为查看 Route.resume()。
fulfill
在 v1.9 之前添加使用给定响应来满足路由的请求。
用法
使用 404 响应满足所有请求的示例
page.route("**/*", route -> {
route.fulfill(new Route.FulfillOptions()
.setStatus(404)
.setContentType("text/plain")
.setBody("Not Found!"));
});
提供静态文件的示例
page.route("**/xhr_endpoint", route -> route.fulfill(
new Route.FulfillOptions().setPath(Paths.get("mock_data.json"))));
参数
options
Route.FulfillOptions
(可选)-
可选的响应正文作为文本。
-
setBodyBytes
byte[] (可选)在 v1.9 中添加#可选的响应正文作为原始字节。
-
如果设置,则等效于设置
Content-Type
响应标头。 -
setHeaders
Map<String, String> (可选)#响应标头。标头值将被转换为字符串。
-
要响应的文件路径。内容类型将从文件扩展名推断出来。如果
path
是相对路径,则它将相对于当前工作目录解析。 -
setResponse
APIResponse (可选)在 v1.15 中添加#APIResponse 用于满足路由请求。响应的各个字段(如头信息)可以使用 fulfill 选项覆盖。
-
响应状态码,默认为
200
。
-
返回值
request
在 v1.9 之前添加要路由的请求。
用法
Route.request();
返回值
resume
在 v1.9 之前添加使用可选的覆盖选项将路由的请求发送到网络。
用法
page.route("**/*", route -> {
// Override headers
Map<String, String> headers = new HashMap<>(route.request().headers());
headers.put("foo", "foo-value"); // set "foo" header
headers.remove("bar"); // remove "bar" header
route.resume(new Route.ResumeOptions().setHeaders(headers));
});
参数
options
Route.ResumeOptions
(可选)
返回值
细节
请注意,任何覆盖选项,例如 setUrl 或 setHeaders,仅适用于正在路由的请求。如果该请求导致重定向,则覆盖选项不会应用于新的重定向请求。如果您想通过重定向传播头信息,请使用 Route.fetch() 和 Route.fulfill() 的组合。
Route.resume() 会立即将请求发送到网络,其他匹配的处理程序将不会被调用。如果您想让链中的下一个匹配处理程序被调用,请使用 Route.fallback()。