PHP中如何将AJAX提交的查询字符串转为数组得到预期POST结构
问题根因
你直接传递字符串格式的data变量时,jQuery ajax 会默认将其识别为application/x-www-form-urlencoded格式参数,服务端会自动解析为数组结构。当你把该字符串嵌套进requestData对象后,jQuery 会将外层对象序列化,内层的data字段会被当做普通字符串传输,服务端不会自动解析其内部的参数结构,所以拿到的是原始字符串。
解决方案
方案1:前端预处理参数(推荐)
直接构造符合预期结构的参数对象,以JSON格式传递请求,服务端可直接拿到目标结构:
var dataItem = [9,1,2,3,4,5,6,7,8] // 修正原示例中的语法错误 var other_parameters = { "host": "host name", "session": "current session", "timestamp": "time stamp" } let requestData = { other_parameters, data: { item: dataItem } } $.ajax({ data: JSON.stringify(requestData), type: 'POST', url: '/api/call', // 声明请求体为JSON格式 contentType: 'application/json' });
如果必须保留原来的拼接好的query字符串,可先解析再封装:
var dataStr = "item[]=9&item[]=1&item[]=2&item[]=3&item[]=4&item[]=5&item[]=6&item[]=7&item[]=8" var other_parameters = { "host": "host name", "session": "current session", "timestamp": "time stamp" } // 解析query字符串 const params = new URLSearchParams(dataStr) const data = { item: params.getAll('item[]') } let requestData = { other_parameters, data } $.ajax({ data: JSON.stringify(requestData), type: 'POST', url: '/api/call', contentType: 'application/json' });
方案2:服务端手动解析(前端无法修改时使用)
如果前端代码不能调整,在服务端拿到data字段的字符串后,手动解析query参数即可。以PHP为例:
// 从请求中拿到原始的data字符串 $rawData = $request->input('data'); // 解析query字符串 parse_str($rawData, $parsedData); // 此时$parsedData即为['item' => [...]]的结构
内容的提问来源于stack exchange,提问作者user15475283
相关产品推荐
相关产品推荐

