Postman调用Wizzair API与浏览器返回结果不同的问题排查
问题描述
我正在开发一款调用Wizzair API的应用,发现/api/search/search接口在浏览器中可返回符合参数的航班列表JSON响应,但使用Postman复制浏览器开发者工具中完全相同的请求头与请求体调用该接口时,却得到428响应。
参考页面:Wizzair航班预订页(LTN到VIE,2022-07-23出发,2022-08-05返程)
请求头
Host: be.wizzair.com User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:101.0) Gecko/20100101 Firefox/101.0 Accept: application/json, text/plain, */* Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate, br Referer: https://wizzair.com/ Content-Type: application/json;charset=utf-8 X-RequestVerificationToken: <token> Content-Length: 254 Origin: https://wizzair.com Connection: keep-alive Cookie: <some_cookies> Sec-Fetch-Dest: empty Sec-Fetch-Mode: cors Sec-Fetch-Site: same-site TE: trailers
请求体
{"isFlightChange":false,"flightList":[{"departureStation":"LTN","arrivalStation":"VIE","departureDate":"2022-07-24"},{"departureStation":"VIE","arrivalStation":"LTN","departureDate":"2022-08-05"}],"adultCount":1,"childCount":0,"infantCount":0,"wdc":true}
Postman返回的428响应
{"sec-cp-challenge": "true","provider":"crypto","branding_url_content":"/_sec/cp_challenge/crypto_message-3-7.htm","chlg_duration":30}
原因分析与解决方案
原因
Wizzair的API启用了反爬虫/人机验证机制:浏览器能正常请求是因为会自动处理页面加载时的隐性验证流程(比如JS生成验证标识、Cookie动态更新),而Postman直接发送请求时,缺少验证流程生成的关键标识,被服务器判定为非人类请求,返回428要求完成验证。
解决步骤
完整复刻浏览器请求上下文
- 不要只复制单次请求的头和体,先在浏览器中打开航班预订页,全程捕获Cookie变化,确保Postman使用的Cookie包含验证流程生成的所有标识(如
sec-cp-*类Cookie)。 - 确认
X-RequestVerificationToken为最新值:该Token通常在页面加载时从HTML生成,会话内可能更新,需保证Postman使用当前会话的有效Token。
- 不要只复制单次请求的头和体,先在浏览器中打开航班预订页,全程捕获Cookie变化,确保Postman使用的Cookie包含验证流程生成的所有标识(如
模拟浏览器完整请求流程
- 先发送GET请求访问航班预订页面,获取并保存响应中的Cookie和
X-RequestVerificationToken。 - 用获取到的Cookie和Token发送
/api/search/search的POST请求,确保Referer、Origin等请求头参数与浏览器完全一致。
- 先发送GET请求访问航班预订页面,获取并保存响应中的Cookie和
处理人机验证挑战
- 若仍返回428,说明服务器要求显性验证。需访问响应中
branding_url_content指向的验证页面,完成页面内的验证流程(如加密值计算、验证按钮交互),获取验证后更新的Cookie,再重新发送航班搜索请求。 - 注意:这类验证依赖浏览器JS执行环境,Postman无法直接处理,可使用Puppeteer、Playwright等自动化工具模拟浏览器完成验证后,提取有效参数到Postman中。
- 若仍返回428,说明服务器要求显性验证。需访问响应中
核对请求细节
- 确保Postman的请求编码、压缩设置与浏览器一致(如
Accept-Encoding中的gzip/deflate/br,需开启对应解码选项)。 - 检查请求体JSON格式完全一致,无多余空格或换行;若手动设置
Content-Length,需与实际请求体长度匹配(Postman通常会自动计算,无需手动设置)。
- 确保Postman的请求编码、压缩设置与浏览器一致(如
内容的提问来源于stack exchange,提问作者This-is-patriiick
相关产品推荐
相关产品推荐

