Route
Когда сетевая маршрутизация настроена с помощью Page.route() или BrowserContext.route(), объект Route
позволяет управлять маршрутом.
Узнайте больше о сетевом взаимодействии.
Методы
abort
Добавлено до v1.9Прерывает запрос маршрута.
Использование
Route.abort();
Route.abort(errorCode);
Аргументы
-
errorCode
String (опционально)#Опциональный код ошибки. По умолчанию
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 -> {
// Выполняется последним.
route.abort();
});
page.route("**/*", route -> {
// Выполняется вторым.
route.fallback();
});
page.route("**/*", route -> {
// Выполняется первым.
route.fallback();
});
Регистрация нескольких маршрутов полезна, когда вы хотите, чтобы отдельные обработчики обрабатывали разные виды запросов, например, вызовы API против ресурсов страницы или GET-запросы против POST-запросов, как в примере ниже.
// Обработка GET-запросов.
page.route("**/*", route -> {
if (!route.request().method().equals("GET")) {
route.fallback();
return;
}
// Обработка только GET.
// ...
});
// Обработка POST-запросов.
page.route("**/*", route -> {
if (!route.request().method().equals("POST")) {
route.fallback();
return;
}
// Обработка только POST.
// ...
});
Можно также изменить запрос, переходя к следующему обработчику, таким образом промежуточный обработчик маршрута может изменить URL, метод, заголовки и postData запроса.
page.route("**/*", route -> {
// Переопределение заголовков
Map<String, String> headers = new HashMap<>(route.request().headers());
headers.put("foo", "foo-value"); // установить заголовок "foo"
headers.remove("bar"); // удалить заголовок "bar"
route.fallback(new Route.ResumeOptions().setHeaders(headers));
});
Используйте Route.resume(), чтобы немедленно отправить запрос в сеть, другие подходящие обработчики не будут вызваны в этом случае.
Аргументы
options
Route.FallbackOptions
(опционально)-
setHeaders
Map<String, String> (опционально)#Если установлено, изменяет HTTP-заголовки запроса. Значения заголовков будут преобразованы в строку.
-
setMethod
String (опционально)#Если установлено, изменяет метод запроса (например, GET или POST).
-
setPostData
String | byte[] (опционально)#Если установлено, изменяет post data запроса.
-
Если установлено, изменяет URL запроса. Новый URL должен иметь тот же протокол, что и оригинальный. Изменение URL не повлияет на соответствие маршрута, все маршруты сопоставляются с использованием оригинального URL запроса.
-
Возвращает
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
- без повторных попыток. -
setMethod
String (опционально)#Если установлено, изменяет метод запроса (например, GET или POST).
-
setPostData
String | byte[] (опционально)#Если установлено, изменяет post data запроса.
-
setTimeout
double (опционально) Добавлено в: v1.33#Тайм-аут запроса в миллисекундах. По умолчанию
30000
(30 секунд). Установите0
, чтобы отключить тайм-аут. -
Если установлено, изменяет 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#Опциональное тело ответа в виде сырых байтов.
-
setContentType
String (опционально)#Если установлено, эквивалентно установке заголовка ответа
Content-Type
. -
setHeaders
Map<String, String> (опционально)#Заголовки ответа. Значения заголовков будут преобразованы в строку.
-
Путь к файлу для ответа. Тип содержимого будет определен из расширения файла. Если
path
является относительным путем, то он разрешается относительно текущего рабочего каталога. -
setResponse
APIResponse (опционально) Добавлено в: v1.15#APIResponse для выполнения запроса маршрута. Отдельные поля ответа (такие как заголовки) могут быть переопределены с помощью опций выполнения.
-
Код статуса ответа, по умолчанию
200
.
-
Возвращает
request
Добавлено до v1.9Запрос, который будет маршрутизирован.
Использование
Route.request();
Возвращает
resume
Добавлено до v1.9Отправляет запрос маршрута в сеть с опциональными переопределениями.
Использование
page.route("**/*", route -> {
// Переопределение заголовков
Map<String, String> headers = new HashMap<>(route.request().headers());
headers.put("foo", "foo-value"); // установить заголовок "foo"
headers.remove("bar"); // удалить заголовок "bar"
route.resume(new Route.ResumeOptions().setHeaders(headers));
});
Аргументы
options
Route.ResumeOptions
(опционально)-
setHeaders
Map<String, String> (опционально)#Если установлено, изменяет HTTP-заголовки запроса. Значения заголовков будут преобразованы в строку.
-
setMethod
String (опционально)#Если установлено, изменяет метод запроса (например, GET или POST).
-
setPostData
String | byte[] (опционально)#Если установлено, изменяет post data запроса.
-
Если установлено, изменяет URL запроса. Новый URL должен иметь тот же протокол, что и оригинальный.
-
Возвращает
Детали
Опция setHeaders применяется как к маршрутизированному запросу, так и к любым перенаправлениям, инициированным им. Однако setUrl, setMethod и setPostData применяются только к оригинальному запросу и не переносятся на перенаправленные запросы.
Route.resume() немедленно отправит запрос в сеть, другие подходящие обработчики не будут вызваны. Используйте Route.fallback(), если вы хотите, чтобы следующий подходящий обработчик в цепочке был вызван.