Angular Js $ httpParamSerializer和jQuery $ .ajax

时间:2015-10-11 14:11:51

标签: javascript php jquery ajax angularjs

我正在开发一个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时,它会返回预期的结果

3 个答案:

答案 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,
    ...
}