【问题标题】:Angular Js $httpParamSerializer and jQuery $.ajaxAngular Js $httpParamSerializer 和 jQuery $.ajax
【发布时间】:2016-01-09 00:55:36
【问题描述】:

我正在开发一个 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"
    }
}

当我使用角度发送这个对象时

$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 时,它会返回预期的结果

【问题讨论】:

    标签: javascript php jquery ajax angularjs


    【解决方案1】:

    看起来它正在被 JSON 字符串化。

    您可以使用json_decode() 来提供预期的结果

    $_POST['interpreterDetails'] = json_decode( $_POST['interpreterDetails'] );
    

    使用$http 默认发送的数据为application/json 并使用json_decode(file_get_contents('php://input')) 访问php 中的数据,过程会更简单。


    编辑:如果您坚持使用表单编码数据,请尝试使用

    data: $httpParamSerializerJQLike(data) 
    

    我从未使用过它,但它可能会递归地复制与 jQuery 名称相同的内容

    【讨论】:

      【解决方案2】:

      我建议你不要使用:

      "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,更多here 来获取它。

      如果你坚持使用application/x-www-form-urlencoded:

      data : $httpParamSerializer({ jsonData : JSON.stringify(data) })
      

      然后你只需要从 PHP 中正常解析字符串(它填充 $_POST['jsonData']

      【讨论】:

        【解决方案3】:

        查看@MinusFour 的(更好的)答案

        我认为问题出在httpParamSerializer

        httpParamSerializer 主要用于 (?) 在发送 GET 请求时将 JSON 数据转换为 URL 参数格式

        示例){query: 'test'}?query=test

        POST 请求和data: httpParamSerializer(data) 无论如何都会在请求正文中发送数据,因此您没有任何特殊需要将数据格式化为http 参数。

        正如@charlietfl 提到的,它正在将您的内部对象字符串化并将其制成字符串,而不是尊重实际的对象格式。

        您可以解析 JSON(如 charlie 所述)或尝试删除 $httpParamSerializer。

        {
            ...
            data: data,
            ...
        }
        

        【讨论】:

          猜你喜欢
          • 2015-04-23
          • 1970-01-01
          • 2015-09-07
          • 1970-01-01
          • 1970-01-01
          • 2015-10-22
          • 1970-01-01
          • 1970-01-01
          • 2012-08-12
          相关资源
          最近更新 更多