Запрос PUT, возвращающий «200 - обновлен» или «200 - частично обновлен», но не обновляется в PHP cURL - PullRequest
0 голосов
/ 19 февраля 2020

У меня возникли проблемы с выполнением вызова 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: enter image description here

Вот фрагмент кода документации API, где вы можете видеть, что 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 голосов
/ 20 февраля 2020

Ответ на этот вопрос лежит полностью в том, как работает API, поэтому здесь мало что можно объяснить.

Как я уже сказал, мне как бы пришлось объединить два уже существующих документа, но API вернул массив, в котором некоторые ключи не совпадают с теми, которые вы используете для загрузки:

API вернул array['price'], но для обновления или публикации этот же ключ станет array['subtotal']. И таких было еще несколько.

В итоге мне удалось изменить значения ключей с GET на значения проводки. Это было решение.

...