You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ajax请求仅Postman可用,生产环境报400(错误请求)求助

问题分析与解决方案

你的代码在Postman正常运行但生产环境返回400错误,核心原因是请求头设置和实际发送的数据格式不匹配,导致后端无法正确解析registration_attributes字段。让我们一步步拆解问题:

为什么会出现这个问题?

你当前的代码里存在两个矛盾的设置:

  1. 手动添加了Content-Type: application/x-www-form-urlencoded请求头
  2. 使用FormData构造数据,同时设置了contentType: false

当你设置contentType: false时,jQuery不会主动添加Content-Type请求头,而是由浏览器自动生成——因为你用了FormData,浏览器会自动设置Content-Type: multipart/form-data; boundary=xxx(带自动生成的分隔符)。但你手动添加的x-www-form-urlencoded头会干扰后端的解析逻辑:后端以为收到的是urlencoded格式的数据,实际却是multipart格式,自然无法识别registration_attributes字段,返回Missing错误。

而Postman能正常工作,是因为你在Postman里正确匹配了数据格式和请求头(比如选择multipart/form-data时自动设置对应头,或者选择urlencoded时用正确的编码方式)。

修复方案(二选一即可)

方案1:使用FormData(multipart/form-data格式)

移除手动设置的Content-Type头,让浏览器自动处理请求头:

var form = new FormData();
form.append("active_registration_id", "123");
form.append("language_id", "79");
form.append("archived", "{{archived}}");
form.append("enabled", "{{enabled}}");
form.append("password", "SamplePassword");
form.append("password_confirmation", "SamplePassword");
form.append("registration_attributes[first_name]", "Justin");
form.append("registration_attributes[last_name]", "Trudeau");
form.append("registration_attributes[email]", "email@sample.com");
form.append("registration_attributes[telephone_1]", "555-555-5555");
form.append("registration_attributes[date_of_birth]", "1943-10-10");
form.append("registration_attributes[gender]", "Male");
form.append("registration_attributes[referral_code]", "Ample Clinic 123");
form.append("registration_attributes[status]", "Registration Pending");

var settings = {
  "async": true,
  "crossDomain": true,
  "url": "https://www.sample.com/v2/clients?token=DMfJjzWLngIn0JBHA0gWcg",
  "method": "POST",
  // 移除手动设置的Content-Type头
  "processData": false,
  "contentType": false,
  "data": form
};

$.ajax(settings).done(function (response) {
  console.log(response);
});

方案2:使用x-www-form-urlencoded格式(不用FormData)

如果后端期望接收urlencoded格式的数据,直接构造普通JS对象,让jQuery自动编码:

var data = {
  active_registration_id: "123",
  language_id: "79",
  archived: "{{archived}}",
  enabled: "{{enabled}}",
  password: "SamplePassword",
  password_confirmation: "SamplePassword",
  registration_attributes: {
    first_name: "Justin",
    last_name: "Trudeau",
    email: "email@sample.com",
    telephone_1: "555-555-5555",
    date_of_birth: "1943-10-10",
    gender: "Male",
    referral_code: "Ample Clinic 123",
    status: "Registration Pending"
  }
};

var settings = {
  "async": true,
  "crossDomain": true,
  "url": "https://www.sample.com/v2/clients?token=DMfJjzWLngIn0JBHA0gWcg",
  "method": "POST",
  "headers": {
    "Content-Type": "application/x-www-form-urlencoded"
  },
  // processData默认是true,会自动把对象编码为urlencoded格式
  "data": data
};

$.ajax(settings).done(function (response) {
  console.log(response);
});

额外说明

你构造registration_attributes的字段命名方式(registration_attributes[first_name])本身是没问题的,多数后端框架(比如Rails、Laravel)都能识别这种嵌套格式的表单字段。问题的核心还是请求头和数据格式不匹配导致的解析失败。

内容的提问来源于stack exchange,提问作者Jeremy Giles

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 10:17:48