class: Request

每当页面发送一个请求,例如网络请求,以下事件会被 puppeteer 页面触发:

如果某些时候请求失败,后续不会触发 'requestfinished' 事件(可能也不会触发 'response' 事件),而是触发 'requestfailed' 事件

如果请求得到一个重定向的响应,请求会成功地触发 'requestfinished' 事件,并且对重定向的 url 发起一个新的请求

request.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 - 发生通用错误。
  • returns: <[Promise]>

想要中断请求,应该使用 page.setRequestInterception 来开启请求拦截,如果请求拦截没有开启会立即抛出异常。

request.continue([overrides])

  • overrides <[Object]> 可选的请求覆写选项,可以是以下值中的一个:
    • url <[string]> 如果设置,请求 url 将会改变。
    • method <[string]> 如果设置,会改变请求方法 (例如,GET 或者 POST)。
    • postData <[string]> 如果设置,会改变请求要提交的数据。
    • headers <[Object]> 如果设置,改变 http 请求头。
  • returns: <[Promise]>

想要用可选的请求覆写选项继续请求,应该使用 page.setRequestInterception 来开启请求拦截,如果请求拦截没有开启会立即抛出异常

request.failure()

  • returns: <?[Object]> 描述请求失败的对象,如果有
    • errorText <[string]> 人类可读的错误信息,例如,「net::ERR_FAILED 」

requestfailed 事件触发后,在没有请求失败的情况下,这个方法会返回 null

输出所有失败请求示例:

page.on('requestfailed', request => {
  console.log(request.url() + ' ' + request.failure().errorText);
});

request.frame()

  • returns: <?[Frame]> 发起请求的 [Frame],如果导航到错误页面,则为null

request.headers()

  • returns: <[Object]> 该请求的 http 头对象。所有头都采用小写的命名方式。

request.isNavigationRequest()

  • returns: <[boolean]>

这个请求是否正在驱动框架在导航。

request.method()

  • returns: <[string]> 请求方法 ( GET,POST,等。)

request.postData()

  • returns: <[string]> 请求提交的数据。

request.redirectChain()

  • returns: <[Array]<[Request]>>

redirectChain 是一条获取资源的请求链

  • 如果没有被重定向而且请求成功的话, 链路将会被置空
  • 如果服务器至少响应了一次重定向, 那么这条链路将会包含所有重定向请求

redirectChain 会共享相同链路上的所有请求。

举个例子,如果网站 http://example.com 重定向一次到
https://example.com,那么这条链就会包含一个请求:

const response = await page.goto('http://example.com');
const chain = response.request().redirectChain();
console.log(chain.length); // 1
console.log(chain[0].url()); // 'http://example.com'

如果网站 https://google.com 没有重定向,那么链(数组)就会被置空:

const response = await page.goto('https://google.com');
const chain = response.request().redirectChain();
console.log(chain.length); // 0

request.resourceType()

  • returns: <[string]>

包含渲染引擎识别出的请求资源类型
资源类型为以下值中的一个:documentstylesheetimagemediafontscripttexttrackxhrfetcheventsourcewebsocketmanifestother

request.respond(response)

  • response <[Object]> 完成请求的响应对象。
    • status <[number]> 响应状态码,默认为 200
    • headers <[Object]> 可选的响应头。
    • contentType <[string]> 设置的话,等同于 Content-Type 响应头。
    • body <[Buffer]|[string]> 可选的响应体。
  • returns: <[Promise]>

完成请求后会返回一个响应。可以通过开启 page.setRequestInterception 选项来使用请求拦截,如果请求拦截没有开启则会抛出异常。

下面例子中,所有执行完成的请求都会返回 404 响应体

await page.setRequestInterception(true);
page.on('request', request => {
  request.respond({
    status: 404,
    contentType: 'text/plain',
    body: 'Not Found!'
  });
});

注意 request.respond 不支持模拟响应 dataURL 请求。
dataURL请求使用 request.respond 并不会起任何作用。

request.response()

  • returns: <?[Response]> 相应的 Response 对象,如果没有收到响应则是null

request.url()

  • returns: <[string]> 请求的 URL。

中止请求。要使用此功能,应使用page.setRequestInterception启用请求拦截。
如果未启用请求拦截,则会立即引发异常。

本文章首发在 LearnKu.com 网站上。

本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
上一篇 下一篇
贡献者:2
讨论数量: 0
发起讨论 只看当前版本


暂无话题~