У меня возникли проблемы с выполнением вызова PUT для внешнего API с использованием cURL PHP, ответ, который я получаю все время, равен {"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, найденный в документации, который фактически работает, когда выполняется почтальоном (I я использую это как данные моего документа 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 работает нормально, я не знаю, что это может быть, что я мог сделать неправильно или почему. Я целый день пытался обойти эту проблему, но безрезультатно.
Этот первый пи c показывает структуру 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;
}
Как я уже сказал, я не знаю, почему иногда он может обновляться, почему другие не