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 更改为发布键值。这就是解决方案。
我在使用 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 更改为发布键值。这就是解决方案。