我在使用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可以很好地工作,我真的不知道这可能是什么,我做错了什么或为什么。我一直在努力解决这个问题,但无济于事。
这是API的一部分文档代码,您可以在其中看到json与我使用的格式相同。实际上,我发布的所有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;
}
正如我所说,我不知道为什么有时可以更新,为什么其他人不能更新
答案 0 :(得分:0)
这个问题的答案完全在API的工作方式之内,因此这里无须解释。
正如我所说,我有点必须合并两个已经存在的文档,但是api返回了一个数组,其中某些键与您用来上传的键不同:
API返回了array['price']
,但是对于更新或发布,该密钥将变为array['subtotal']
。还有更多类似的东西。
最后,我设法将键值从GET更改为发布的键值。那就是解决方案。