PUT 请求返回“200 - 已更新”或“200 - 部分更新”但未在 PHP cURL 中更新

PUT request returning '200 - updated' or '200 - partially updated' but not updating in PHP cURL

我在使用 cURL PHP 对外部 API 进行 PUT 调用时遇到了一些问题,我一直得到的响应是 {"status":1,"info":"Updated"}Status code: 200,这应该意味着更改已正确保存到 API。但是每次查看,都没有任何变化。

为了您更好地理解,这是我遵循的过程:

API 持有账单等文件,所以此时,我正在使用两个不同的文件。首先,我获取其中一个并提取信息以将其存储在数组中。接下来,我对第二个文档做同样的事情,最后做一个 array_push 并将一个数组附加到另​​一个数组。

我的最终目标是更新其中一个原始文档以维护其数据,同时添加来自另一个不同文档的信息。我不能只创建一个新文档,也不能 delete 现有文档和 post 一个新文档。 API 给出的唯一其他选项是使用 put.

起初我得到的唯一答案是我上面写的那个。然后,更仔细地检查文档,我发现有些东西的调用方式存在差异。

这是我用来尝试的示例测试文档:

{
    "id": "5e4cf5676a97281ab7116036",
    "contact": "5db0745c6a972835922bfac9",
    "contactName": "Tiempos mejores vendrán",
    "desc": "TEST",
    "date": 1580979341,
    "dueDate": null,
    "notes": "hola",
    "tags": [
        "cp"
    ],
    "products": [
        {
            "name": "hola",
            "desc": "IVA",
            "price": 200,
            "units": 1,
            "tax": 10,
            "taxes": [
                "s_iva_10"
            ],
            "tags": [],
            "discount": 0,
            "retention": 0,
            "weight": 0,
            "costPrice": 0,
            "sku": 0,
            "account": "5cd98e656a9728325261db7a"
        }
    ],
    "tax": 20,
    "subtotal": 200,
    "discount": 0,
    "total": 220,
    "language": "es",
    "status": 0,

这是在文档中找到的 Ajax 示例,它在邮递员完成时实际有效(我将其用作我的文档 2 数据):

"date": 1580979341,
"items": [
    {
        "name": "hola",
        "desc": "IVA",
        "subtotal": 200,
        "taxes": [
            "s_iva_10"
        ],
        "units": 1
    }
]

您可能会注意到,API returns products 而示例中显示的是 items。因为这是我真正需要更新的唯一部分,所以我开始用另一个像这样包装我的数组:

$receipt = fetchCoSalesReceipt($receiptId, $uri4, $token);
array_push($receipt['products'], $items); 
$arrayItems['items'] = $receipt['products'];

其中 $items 是包含文档 1 信息的数组。我创建 $arrayItems 只是为了按照 API 所述存储和更新该部分。

事情是,现在我已经这样做了,我得到的回应变成了:{"status":1,"info":"Updated partially. Sku's not founds: 0, 0, 0, 0, 0, "}Status code: 200 int(1

这是 json 我要传递给 put 函数:

{
    "items": [
        {
            "name": "hola",
            "desc": "IVA",
            "price": 200,
            "units": 1,
            "tax": 10,
            "taxes": [
                "s_iva_10"
            ],
            "tags": [],
            "discount": 0,
            "retention": 0,
            "weight": 0,
            "costPrice": 0,
            "sku": 0,
            "account": "5cd98e656a9728325261db7a"
        },
        [
            {
                "name": "Llamadas Fijos nacionales",
                "subtotal": "374.776444",
                "tax": 21
            },
            {
                "name": "Llamadas Moviles nacionales",
                "subtotal": "460.440000",
                "tax": 21
            },
            {
                "name": "Llamadas Premium 902 Nivel 1",
                "subtotal": "87.301236",
                "tax": 21
            }
        ]
    ]
}

如你所见,我保留了原来存储的数据,只是添加了一些新信息。再一次,在文档中有一个可以用来尝试的虚拟代码,在项目内部,有一个叫做 sku 的东西。但是将它留空或 0 在那里工作正常,我真的不知道这会是什么,我可能做错了什么或为什么。我一整天都在尝试解决这个问题,但无济于事。

第一张图片显示了 items 结构:

这是 API 的一段文档代码,您可以在其中看到 json 与我使用的格式相同。事实上,我发布的所有 json 片段似乎都与我正在使用的片段相似。但在这里,代码可以正常工作和更新:

最后。这是函数:

function updateReceipt($receiptId, $uri4, $arrayItems, $token){
    $ch = curl_init();

    $options = array(
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_URL => $uri4.$receiptId,
        CURLOPT_CUSTOMREQUEST => 'PUT',
        CURLOPT_POSTFIELDS => json_encode($arrayItems),
        CURLOPT_HTTPHEADER => array("Content-Type: application/json", "key: ".$token)
    );
    curl_setopt_array($ch, $options);

    $response = curl_exec($ch);
    $response = json_decode($response, true);

    $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);

    echo "Status code: $http_code ";

    curl_close($ch);

    return $response;
}

正如我所说,我不知道为什么有时它可以更新,为什么其他人不能

这个问题的答案完全在于 API 的工作方式,因此这里没有什么需要解释的。

正如我所说,我有点不得不合并两个已经存在的文档,但是 api 返回了一个数组,其中一些键与您必须用于上传的键不同:

API 返回 array['price'],但对于更新或发布,相同的键将变为 array['subtotal']。还有一些像这样的。

最后,我设法将键值从 GET 更改为发布键值。这就是解决方案。