Route
每当使用Page.route()或BrowserContext.route()设置网络路由时,Route
对象允许处理该路由。
了解更多关于网络的信息。
方法
中止
Added before 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'
- 发生了一般性故障。
返回
回退
Added in: 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
(optional)
返回
fetch
Added in: 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
(optional)-
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
Added before 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
(optional)-
可选的响应正文文本。
-
setBodyBytes
byte[] (可选) 添加于: v1.9#可选的响应体,以原始字节形式提供。
-
如果设置,等同于设置
Content-Type
响应头。 -
setHeaders
Map<String, String> (可选)#响应头。头部值将被转换为字符串。
-
用于响应的文件路径。内容类型将从文件扩展名推断。如果
path
是相对路径,则相对于当前工作目录解析。 -
setResponse
APIResponse (可选) 新增于: v1.15#用于满足路由请求的APIResponse。可以使用fulfill选项覆盖响应的各个字段(如headers)。
-
响应状态码,默认为
200
。
-
返回
请求
Added before v1.9一个需要被路由的请求。
用法
Route.request();
返回
恢复
Added before 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
(optional)
返回
详情
setHeaders选项适用于路由请求及其引发的任何重定向。然而,setUrl、setMethod和setPostData仅适用于原始请求,不会延续到重定向请求中。
Route.resume() 会立即将请求发送到网络,其他匹配的处理程序不会被调用。如果您希望调用链中的下一个匹配处理程序,请使用 Route.fallback()。