使用Playwright发送API请求时请求体未被正确携带导致400错误的排查求助
Playwright发送API请求时请求体未被正确携带导致400错误的排查求助
兄弟,我看了你的代码,大概率是Playwright请求体的处理方式搞错了!给你几个排查方向和修复办法:
别手动序列化JSON请求体:你现在用
JSON.stringify(body)把对象转成了字符串,但Playwright的请求方法(比如post)在接收对象类型的body时,会自动帮你完成序列化,同时自动匹配正确的Content-Type。如果传的是字符串,哪怕你手动写了application/json的header,服务器可能还是没法正确解析这个字符串格式的请求体——这就是为啥服务器日志显示请求体缺失。直接改成传原始对象就行:
async createRequest(method: string, endpoint: string, parameters?: object, body?: object) { let request = null; const browser = await chromium.launch(); const context = await browser.newContext({}); // 删掉这行手动序列化的代码:let bodyRequest = JSON.stringify(body); try { request = await context.request[method.toLowerCase()]( endpoint, { headers:{ 'Content-Type': 'application/json', }, params: this.convertObjectToKeyValue(parameters), body: body // 直接传入原始对象 }); } catch (error) { await browser.close(); throw new Error('Invalid request: /' + method + ' ' + endpoint + ' \n error message: ' + error); } const responseBody = await request.json(); await browser.close(); return responseBody; }处理空body的情况:如果调用这个方法时没传body,现在的写法会把
undefined传给body参数,可能导致请求结构异常。可以加个判断,只有当body存在时才传递这个参数:// 先构建请求选项对象 const requestOpts = { headers: { 'Content-Type': 'application/json' }, params: this.convertObjectToKeyValue(parameters) }; // 只有body存在时才添加到选项里 if (body) { requestOpts.body = body; } // 发送请求 request = await context.request[method.toLowerCase()](endpoint, requestOpts);检查参数转换方法:确认
convertObjectToKeyValue这个方法没有搞事情——比如会不会把body里的字段意外弄到params里,或者返回了异常格式的参数,导致请求整体结构出错。
另外,建议你在catch块里加个日志,把实际要发送的请求参数打出来,方便排查:
catch (error) { console.log('请求详情:', { method, endpoint, parameters, body }); await browser.close(); throw new Error('Invalid request: /' + method + ' ' + endpoint + ' \n error message: ' + error); }
备注:内容来源于stack exchange,提问作者Marcin
相关产品推荐
相关产品推荐

