Playwright:APIRequestContext设置Host header异常致Gmail API请求404
解决Playwright APIRequestContext调用Gmail API返回404的问题
核心问题是URL拼接错误,导致请求发送到了不存在的API端点,和Host头无关。
问题原因
你的baseURL设置为"https://gmail.googleapis.com/gmail/v1/users",而发送GET请求时用了以/开头的路径"/{USER_EMAIL}/messages/"。Playwright的APIRequestContext规则是:如果请求路径以/开头,会忽略baseURL中的路径部分,直接拼接域名和请求路径。最终实际请求的URL是:
https://gmail.googleapis.com/{USER_EMAIL}/messages/
这显然不是Gmail API的正确端点,所以返回404错误。
另外,手动设置Host头完全没必要——Playwright会根据请求的URL自动生成正确的Host头,手动设置反而可能引发异常,建议直接去掉。
修复方案
有两种方式可以修正URL拼接:
方案1:修改请求路径,去掉开头的/
保持baseURL不变,将请求路径改为不带开头/的格式,这样会和baseURL的路径部分正确拼接:
import { APIRequestContext, expect, test } from "@playwright/test"; let apiContextGmailInbox: APIRequestContext; apiContextGmailInbox = await playwright.request.newContext({ baseURL: "https://gmail.googleapis.com/gmail/v1/users" }); test("test get last email body via API", async ({page}) => { const mailContext = await apiContextGmailInbox.get( "{USER_EMAIL}/messages/" ); expect(mailContext.status()).toBe(401); });
方案2:调整baseURL为域名,请求路径用完整路径
将baseURL简化为域名,请求路径使用完整的API路径:
import { APIRequestContext, expect, test } from "@playwright/test"; let apiContextGmailInbox: APIRequestContext; apiContextGmailInbox = await playwright.request.newContext({ baseURL: "https://gmail.googleapis.com" }); test("test get last email body via API", async ({page}) => { const mailContext = await apiContextGmailInbox.get( "/gmail/v1/users/{USER_EMAIL}/messages/" ); expect(mailContext.status()).toBe(401); });
效果验证
修改后,请求会发送到正确的Gmail API端点https://gmail.googleapis.com/gmail/v1/users/{USER_EMAIL}/messages/,此时因为缺少授权Token,会返回预期的401错误。
内容的提问来源于stack exchange,提问作者kazeeno
相关产品推荐
相关产品推荐

