我正在制作一个Angular.js应用程序,我必须向PHP服务器发送POST请求。我发送的数据是对象的对象。
例如:
var data = {
"serviceID": "0001",
"interpreterDetails": {
"firstName": "Peter",
"lastName": "Wilson",
"password": "Peter",
"rePassword": "Peter",
"address": "alex",
"mobPhone": "01224747748",
"homePhone": "3910009",
"mail": "peter@server.domain",
"fax": "556",
"hourlyRate": "10",
"OperatingSys": "android",
"token": "432132",
"dialectId": "1"
}
}
当我使用angular
发送这个对象时$http({
url: "http://localhost/saveInterpreter.php",
method: "POST",
data: $httpParamSerializer(data),
headers : {
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8;"
}
})
,服务器中的代码返回
object(stdClass)#3 (9) {
["interpreterDetails"]=>
string(262) " {"firstName":"Peter","lastName":"Wilson","password":"Peter","rePassword":"Peter","address":"alex","mobPhone":"01224747748","homePhone":"3910009","mail":"peter@server.domain","fax":"556","hourlyRate":"10","OperatingSys":"android","token":"432132","dialectId":"1"}"
["serviceID"]=>
string(4) "0001"
}
但是期望回报是
object(stdClass)#3 (8) {
["serviceID"]=>
string(4) "0001"
["interpreterDetails"]=>
object(stdClass)#4 (13) {
["firstName"]=>
string(5) "zxczc"
["lastName"]=>
string(4) "zxcz"
["password"]=>
string(4) "1234"
["rePassword"]=>
string(4) "1234"
["address"]=>
string(4) "sada"
["mobPhone"]=>
string(4) "4532"
["homePhone"]=>
string(4) "1351"
["mail"]=>
string(11) "asd@sdsd.sd"
["fax"]=>
string(6) "123513"
["hourlyRate"]=>
string(2) "26"
["OperatingSys"]=>
string(0) ""
["token"]=>
string(0) ""
["dialectId"]=>
string(1) "1"
}
}
问题是外部对象(data)的内部对象(interpreterDetails)作为字符串而不是对象返回。
有什么帮助吗
注意:当我使用jQuery时,它会返回预期的结果显示为JSON字符串化。
您可以使用json_decode()
来提供预期的结果
$_POST['interpreterDetails'] = json_decode( $_POST['interpreterDetails'] );
使用$http
默认作为application/json
发送数据,使用json_decode(file_get_contents('php://input'))
在php中访问数据,过程会更简单。
EDIT:如果您坚持使用表单编码的数据,请尝试使用
data: $httpParamSerializerJQLike(data)
我从未使用过它但它可能递归复制相同的jQuery正如它的名字所暗示的
我建议你不要使用:
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8;"
最好是:
"Content-Type": "application/json"
Angular会将data
中的对象转换为JSON:
Angular提供以下默认转换:
请求转换(
$httpProvider.defaults.transformRequest
和$http.defaults.transformRequest
):如果请求配置对象的
data
属性包含对象,则将其序列化为JSON格式。
所以,你所要做的就是传递对象,它会被你自动转换为JSON。
data : data
如果你使用application/json
,那么你将无法通过$_POST
获取它,但你可以通过php://input,更多信息在这里。
如果你坚持使用application/x-www-form-urlencoded
:
data : $httpParamSerializer({ jsonData : JSON.stringify(data) })
然后你只需要在PHP中解析字符串(它填充$_POST['jsonData']
)
参见@MinusFour的(更好的)答案
我认为问题是与httpParamSerializer
httpParamSerializer主要用于在发送GET请求时将JSON数据转换为URL参数格式
示例){query: 'test'}
~ ?query=test
POST请求和data: httpParamSerializer(data)
在请求体中发送数据,所以你没有任何特殊的需要将数据格式化为http参数。
正如@charlietfl所提到的,它将内部对象字符串化并使其成为字符串,而不是尊重实际的对象格式。
你可以解析JSON(如charlie提到的)或尝试删除$httpParamSerializer。
{
...
data: data,
...
}