Angular Js $httpParamSerializer and jQuery $.ajax


Angular Js $httpParamSerializer and jQuery $.ajax

我正在制作一个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,
    ...
}