难以理解 PHP POST 到 REST API - 混合数组和对象

Difficulty to understand PHP POST to REST API - mixed array and objects

我正在尝试 POST 数据到 REST API。

在 Postman 上我可以 POST 成功,JSON 正文是:

{
  "version": 0,
  "roles": {
    "customer": {
    }
  },
  "person": {
     "firstName": "Inge",
     "lastName": "Musterfrau"
  },
  "emailAddresses" :{
    "private" : [
      "email@domain.com"
    ]
  },
"addresses": {
    "billing": [
      {
        "supplement": null,
        "street": "aaa",
        "zip": "12345",
        "city": "Berlin",
        "countryCode": "DE"
      }
    ]
  }
        
}

我的问题是地址计费。我不知道如何正确创建 object/array 以便 API 接受它。

我正在像下面这样在 PHO 上构建参数:

$billingAddr = array(
                    "supplement" => $billingAddress["streetDetails"],
                    "street" => $billingAddress["street"],
                    "zip" => $billingAddress["zipCode"],
                    "city" => $billingAddress["city"],
                    "countryCode" => $billingAddress["country"],
                );
                $params = [
                    "version"       => 0,
                    "roles"         => $roles,
                    "person"        => $person,
                    "emailAddresses"  => $emailAddresses,
                    "addresses"     => [
                        "billing"  => $billingAddr
                    ]
                ];

我收到一个错误:“missing_entity - 地址 - validation_failure”。

我认为我的问题是创建混合对象地址、数组计费。

因此,严格按照 PHP 示例,执行 json_encode 的输出表明地址的结构并不完全相同。

请注意,我没有 PHP 示例中其余大部分 json 信息的数据,因此下面的输出示例严格集中在 addresses部分。

Before JSON change:

echo json_encode($params, JSON_PRETTY_PRINT);

{
    "version": 0,
    "roles": null,
    "person": null,
    "emailAddresses": null,
    "addresses": {
        "billing": {
            "supplement": null,
            "street": null,
            "zip": null,
            "city": null,
            "countryCode": null
        }
    }
}

...其中,请注意帐单没有 [] 个字符,就像使用邮递员发送的一样。

不过不用担心,这很容易解决。应更改地址部分以获取账单地址数组,如下所示:

"addresses"     => [
    "billing"  => [$billingAddr]
]

然后 运行 应用该更改的重新检查显示:

After JSON change:

echo json_encode($params, JSON_PRETTY_PRINT);

{
    "version": 0,
    "roles": null,
    "person": null,
    "emailAddresses": null,
    "addresses": {
        "billing": [
            {
                "supplement": null,
                "street": null,
                "zip": null,
                "city": null,
                "countryCode": null
            }
        ]
    }
}

这应该有助于实现预期的格式。

这是 fiddle example 以防您需要另一个 PHP 版本来检查。 fiddle 默认为 8.0.1

对象属性和关联数组很容易直接access/declare;但是,当您需要将数据推送到索引子数组时,您可以使用 [] 语法或 array_push().

如果您想在这段代码中建立更多的可维护性,您可以将可变长度子数组构建为单独的变量,然后在 json_encoding.

之前将它们输入到主数组中
$version = 0;
$roles = ['customer' => []];
$person = [
    'firstName' => 'Inge',
    'lastName' => 'Musterfrau'
];
$emailAddresses = [
    'private' => [
        'email@domain.com',
    ]
];
$billingAddresses[] = [
    'supplement' => $billingAddress["streetDetails"],
    'street' => $billingAddress["street"],
    'zip' => $billingAddress["zipCode"],
    'city' => $billingAddress["city"],
    'countryCode' => $billingAddress["country"]
];
// use $billingAddresses[] again to push another subarray into $billing

$data = [
    'version' => $version,
    'roles' => $roles,
    'person' => $person,
    'emailAddresses' => $emailAddresses,
    'addresses' => [
        'billing' => $billingAddresses
    ]
]

这将创建您的 array/json :

    $arr['version'] = "0";
    $arr['roles']['customer'] = [];
    $arr['person']['firstName'] = "Inge";
    $arr['person']['lastName'] = "Musterfrau";
    $arr['emailAddresses']['private'][] = "email@domain.com";
    $arr['addresses']['billing'][0]['supplement'] = "";
    $arr['addresses']['billing'][0]['street'] = "aaa";
    $arr['addresses']['billing'][0]['zip'] = "12345";
    $arr['addresses']['billing'][0]['city'] = "Berlin";
    $arr['addresses']['billing'][0]['countryCode'] = "DE";
    
    $newJson = json_encode($arr);

然后你 json_encode 它和瞧完美 json 而且非常简单!

查看 json 的最好和最简单的方法(至少在我看来:)是作为一个数组! (使用浏览器并在此处回显“

”并不可耻!)- 我们将构建一个相同的数组并将其 json 返回!

一旦我们将 json 视为一个数组,我们就会以一种非常简单的方式构建相同的数组 这里是完整的代码示例,逐步进行:

<?php

/*Our original json */
$json = '{
  "version": 0,
  "roles": {
    "customer": {
    }
  },
  "person": {
     "firstName": "Inge",
     "lastName": "Musterfrau"
  },
  "emailAddresses" :{
    "private" : [
      "email@domain.com"
    ]
  },
"addresses": {
    "billing": [
      {
        "supplement": null,
        "street": "aaa",
        "zip": "12345",
        "city": "Berlin",
        "countryCode": "DE"
      }
    ]
  }

}';

$array = json_decode($json,true);
echo '<pre>';
/* original array */
echo "original array: ";
print_r($array);
echo '<pre>';
/* now lets create the same array with less fuss?! */

$arr['version'] = "0";
$arr['roles']['customer'] = [];
$arr['person']['firstName'] = "Inge";
$arr['person']['lastName'] = "Musterfrau";
$arr['emailAddresses']['private'][] = "email@domain.com";
$arr['addresses']['billing'][0]['supplement'] = "";
$arr['addresses']['billing'][0]['street'] = "aaa";
$arr['addresses']['billing'][0]['zip'] = "12345";
$arr['addresses']['billing'][0]['city'] = "Berlin";
$arr['addresses']['billing'][0]['countryCode'] = "DE";

/* the new array: */
echo "our newly created array: ";
echo '<pre>';
print_r($arr);
echo '<pre>';
/* back to json */
echo "new Json: ";
echo '<pre>';
$newJson = json_encode($arr);
print_r($newJson);

这将 return:

original array: Array
(
    [version] => 0
    [roles] => Array
        (
            [customer] => Array
                (
                )

        )

    [person] => Array
        (
            [firstName] => Inge
            [lastName] => Musterfrau
        )

    [emailAddresses] => Array
        (
            [private] => Array
                (
                    [0] => email@domain.com
                )

        )

    [addresses] => Array
        (
            [billing] => Array
                (
                    [0] => Array
                        (
                            [supplement] => 
                            [street] => aaa
                            [zip] => 12345
                            [city] => Berlin
                            [countryCode] => DE
                        )

                )

        )

)
our newly created array: 
Array
(
    [version] => 0
    [roles] => Array
        (
            [customer] => Array
                (
                )

        )

    [person] => Array
        (
            [firstName] => Inge
            [lastName] => Musterfrau
        )

    [emailAddresses] => Array
        (
            [private] => Array
                (
                    [0] => email@domain.com
                )

        )

    [addresses] => Array
        (
            [billing] => Array
                (
                    [0] => Array
                        (
                            [supplement] => 
                            [street] => aaa
                            [zip] => 12345
                            [city] => Berlin
                            [countryCode] => DE
                        )

                )

        )

)
new Json: 
{"version":"0","roles":{"customer":[]},"person":{"firstName":"Inge","lastName":"Musterfrau"},"emailAddresses":{"private":["email@domain.com"]},"addresses":{"billing":[{"supplement":"","street":"aaa","zip":"12345","city":"Berlin","countryCode":"DE"}]}}

以这种方式构建数组可以非常简单 - 几乎是线性的! :)