Windows 10 IIS下XMLHTTPREQUEST.SEND发POST到ColdFusion接口数据异常
问题根因
你遇到的异常和IIS配置无关,是请求格式与ColdFusion服务端的接收逻辑不匹配导致的:
- 当设置
Content-Type: application/json时拿不到数据,是因为ColdFusion的远程CFC方法默认只会解析URL和表单参数,JSON格式的请求体不会自动填充到参数中,需要手动读取原始请求内容 - 当设置
Content-Type: application/x-www-form-urlencoded时JSON变成空键,是因为你直接把序列化后的JSON串传入send()方法,没有按照表单格式拼接为参数名=值的结构,服务端会把没有等号的整段内容识别为一个无值的表单键。
修复方案
方案1:JSON格式提交(更推荐,适配复杂数组结构)
客户端代码调整
var URL = "http://dev.thepeoplesite.com/api/Person.cfc?method=setPerson&returnformat=json"; var xmlhttp = new XMLHttpRequest(); xmlhttp.open("POST", URL, false); xmlhttp.setRequestHeader("Content-Type", "application/json"); xmlhttp.send(JSON.stringify(p.persondata));
服务端setPerson方法逻辑调整
<!--- 读取原始请求体中的JSON字符串 ---> <cfset rawRequest = toString(getHttpRequestData().content)> <!--- 反序列化得到目标数组对象 ---> <cfset personDataArr = deserializeJSON(rawRequest)> <!--- 后续直接操作personDataArr即可 --->
注意:该方案下不要给setPerson方法定义对应接收的形参,JSON请求内容不会自动映射到方法参数中。如果存在跨域报错,给IIS站点配置CORS规则放行本地请求源即可。
方案2:表单格式提交
客户端代码调整
var URL = "http://dev.thepeoplesite.com/api/Person.cfc?method=setPerson&returnformat=json"; var xmlhttp = new XMLHttpRequest(); xmlhttp.open("POST", URL, false); xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); // 给JSON串添加参数名,同时做URI编码避免特殊字符乱码 xmlhttp.send("personData=" + encodeURIComponent(JSON.stringify(p.persondata)));
服务端setPerson方法逻辑调整
<!--- 直接读取表单参数反序列化即可 ---> <cfset personDataArr = deserializeJSON(form.personData)>
内容的提问来源于stack exchange,提问作者codemonkey
相关产品推荐
相关产品推荐

