我正在开发一个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"
}
}
问题是内部对象(interpreterDetails)外部对象(数据)是作为字符串而不是对象返回的。
对此的任何帮助
注意:当我使用jQuery时,它会返回预期的结果
答案 0 :(得分:2)
它似乎是JSON字符串化。
您可以使用json_decode()
来提供预期结果
$_POST['interpreterDetails'] = json_decode( $_POST['interpreterDetails'] );
使用$http
默认数据发送为application/json
并使用json_decode(file_get_contents('php://input'))
访问php中的数据,过程会更简单。
编辑:如果您坚持使用表单编码数据,请尝试使用
data: $httpParamSerializerJQLike(data)
我从来没有使用它,但它可能是递归的,像jQuery一样复制它的名字
答案 1 :(得分:1)
我建议你不要使用:
"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://输入来实现这一目标,更多信息here
如果您坚持使用application/x-www-form-urlencoded
:
data : $httpParamSerializer({ jsonData : JSON.stringify(data) })
然后你只需要通常从PHP解析字符串(填充$_POST['jsonData']
)
答案 2 :(得分:0)
请参阅@MinusFour(更好)答案
我认为问题出在httpParamSerializer
httpParamSerializer主要用于(?)在发送GET请求时将JSON数据转换为URL参数格式
示例){query: 'test'}
到?query=test
POST请求和data: httpParamSerializer(data)
正在发送请求正文中的数据,因此您不需要将数据格式化为http参数。
正如@charlietfl所提到的,它正在对你的内部对象进行字符串化并使其成为一个字符串,而不是尊重实际的对象格式。
您可以解析JSON(如charlie所提到)或尝试删除$ httpParamSerializer。
{
...
data: data,
...
}