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

时间:2020-02-19 14:55:03

标签: php json api curl put

我在使用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返回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的结构:enter image description here

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

最后。这是函数:

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;
}

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

1 个答案:

答案 0 :(得分:0)

这个问题的答案完全在API的工作方式之内,因此这里无须解释。

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

API返回了array['price'],但是对于更新或发布,该密钥将变为array['subtotal']。还有更多类似的东西。

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