如何正确发送Cypress POST请求?请求成功但实体未创建原因排查
我来帮你梳理下几种可能导致这个问题的原因,毕竟返回200却没实际创建实体这种情况确实容易让人摸不着头脑:
请求数据格式不匹配后端期望
手动操作时你提交的是表单编码数据(application/x-www-form-urlencoded),而你的变体1直接传了JSON格式的{ "addedUserIds[]": 111 },Cypress默认会把这个设置为Content-Type: application/json发送。如果后端只处理表单编码的参数,就会识别不到addedUserIds[],自然不会执行创建逻辑。
变体2虽然加了form: true(会自动设置正确的Content-Type),但你写的键名"addedUserIds[]"可能画蛇添足了——当form: true时,直接传数组类型的参数即可,Cypress会自动帮你生成addedUserIds[]=111的表单格式。试试改成:cy.request({ method: 'POST', url: 'admin/xxx/manual-enrol', form: true, body: { addedUserIds: [111] } })缺少必要的请求头或认证信息
手动操作时浏览器会自动带上一些关键头信息,比如CSRF Token(很多后台系统会校验这个防止跨站请求)、登录状态的Cookie等。如果你的Cypress请求没携带这些信息,后端可能会返回200(比如只是返回一个空响应或者错误页面),但不会执行创建实体的核心逻辑。
你可以对比手动请求的请求头,在Cypress里补充这些头,比如:cy.request({ method: 'POST', url: 'admin/xxx/manual-enrol', form: true, headers: { 'X-CSRF-Token': '你的CSRF令牌值', 'Cookie': '登录相关的Cookie' }, body: { addedUserIds: [111] } })(注:CSRF令牌可以通过之前的页面请求获取,或者用Cypress的
cy.getCookie获取登录Cookie)后端对参数类型的校验问题
有些后端要求addedUserIds必须是数组类型,哪怕只有一个元素。你的两种写法里,变体1传的是单个值111,变体2的"addedUserIds[]": 111可能会被解析成字符串而非数组,这都会导致后端不识别参数,跳过创建逻辑。改成数组形式addedUserIds: [111]应该能解决这个问题。200状态码的误导性
不是所有200都代表请求逻辑执行成功,有些后端在参数错误或权限不足时,依然会返回200,但响应体里包含错误信息。你可以在Cypress里打印响应体看看具体原因:cy.request({ method: 'POST', url: 'admin/xxx/manual-enrol', form: true, body: { addedUserIds: [111] } }).then(response => { console.log('响应体:', response.body) })说不定响应体里会明确告诉你为什么没创建实体。
内容的提问来源于stack exchange,提问作者vitaliy4us

