Jump to content

POST/PUT vía API en formato JSON


Recommended Posts

Hola.

Estoy haciendo un conector para utilizar el API de Prestashop en mi aplicación y veo que añadiendo &output_format=JSON a la petición GET me devuelve la información en formato JSON, pero me interesaría también enviarle las peticiones PUT y POST para crear/modificar productos, etc... en formato JSON, no obstante siempre me las solicita en XML.

Estoy haciendo algo mal o para enviarle info solo acepta XML el API de prestashop?

Gracias!!

Link to comment
Share on other sites

hace 11 horas, gusman126 dijo:

Recuerda que puedes conseguir los XML en blanco con las URL "blank" no tengo el enlace exacto .

 

Esto es lo que hago, al final he visto en la documentación que los JSON solamente son para "consultar" los recursos mediante GET, pero si quieres añadir POST o modificar PUT, has de hacerlo mediante los XML que genera él.

No obstante, ahora me he encontrado en un problema y no entiendo porqué lo hace así el API, resulta que según la documentación, para modificar un recurso, por ejemplo un producto mediante PUT, has de recibir el XML del producto mediante GET, modificar el XML recibido con los cambios que desees y volverlo a enviar por PUT, pero resulta que el XML que ser recibe por GET tiene campos que no son "Writables" cuando los envías por PUT. Entonces no entiendo la lógica para modificar los recursos, salvo que tengas que eliminar dichos campos del XML, cosa que no indica en la documentación oficial.

Alguien se ha topado con esto?

Link to comment
Share on other sites

hace 4 horas, Victor Casajuana Mas dijo:

Esto es lo que hago, al final he visto en la documentación que los JSON solamente son para "consultar" los recursos mediante GET, pero si quieres añadir POST o modificar PUT, has de hacerlo mediante los XML que genera él.

No obstante, ahora me he encontrado en un problema y no entiendo porqué lo hace así el API, resulta que según la documentación, para modificar un recurso, por ejemplo un producto mediante PUT, has de recibir el XML del producto mediante GET, modificar el XML recibido con los cambios que desees y volverlo a enviar por PUT, pero resulta que el XML que ser recibe por GET tiene campos que no son "Writables" cuando los envías por PUT. Entonces no entiendo la lógica para modificar los recursos, salvo que tengas que eliminar dichos campos del XML, cosa que no indica en la documentación oficial.

Alguien se ha topado con esto?

Si te sirve, yo he tenido que eliminar algun nodo antes de enviar un xml modificado para que aceptara ese fichero xml

 

 

Link to comment
Share on other sites

hace 17 horas, gusman126 dijo:

Si te sirve, yo he tenido que eliminar algun nodo antes de enviar un xml modificado para que aceptara ese fichero xml

 

 

si, al final también lo he echo. He seguido estos pasos; primero me descargo la sinopsys donde aparecen los campos que son "readonly" y la guardo para futuros procesos de actualización. Luego cuando tengo que actualizar un producto, me descargo GET el recurso del producto que quiera actualizar, reviso la sinopsys descargada anteriormente y me cargo los campos "readonly", luego ya simplemente envío la estructura XML sin esos campos por PUT y el producto se actualiza correctamente.

Bajo mi punto de vista, lo hacen un poco complicado, no costaría nada tener 2 métodos en el API, uno para descargar el recurso completo y otro para poder modificarlo, o en el recurso completo que te descargas mediante GET, poner etiquetas de readonly para no depender de la sinopsys descargada anteriormente, aunque para algunos esto pueda resultar cargar de información la respuesta. Son diferentes formas de trabajar, quizás el origen de todo es que la documentación sea un poco "escueta" en este aspecto.

Link to comment
Share on other sites

hace 29 minutos, gusman126 dijo:

Escueta? mas bien nula .

Gracias por la explicación

 

Bueno, la verdad es que comparada con la de hace algunos años, al menos es algo: https://devdocs.prestashop.com/1.7/webservice/

El primer conector que hice me las tuve que ingeniar para que funcionase.

Ahora estoy con un conector multiplataforma que sirva para prestashop, woocomerce y magento (de momento) y la verdad es que cuando veo la documentación de las otras API me pongo a llorar lo completas que están, y sobre todo que trabajan bidireccionalmente en JSON, eso de enviarle por XML a Prestashop, pues que quieres que te diga, a gustos colores, pero habiendo prefiero trabajar en JSON.

 

Saludos!

Link to comment
Share on other sites

  • 2 years later...
On 9/23/2020 at 5:01 AM, Victor Casajuana Mas said:

Bueno, la verdad es que comparada con la de hace algunos años, al menos es algo: https://devdocs.prestashop.com/1.7/webservice/

El primer conector que hice me las tuve que ingeniar para que funcionase.

Ahora estoy con un conector multiplataforma que sirva para prestashop, woocomerce y magento (de momento) y la verdad es que cuando veo la documentación de las otras API me pongo a llorar lo completas que están, y sobre todo que trabajan bidireccionalmente en JSON, eso de enviarle por XML a Prestashop, pues que quieres que te diga, a gustos colores, pero habiendo prefiero trabajar en JSON.

 

Saludos!

Hola! Pudiste solucionar estos problemas?
Yo ahora estoy haciendo pruebas con el Insomnia y tratando de agregar este producto de prueba paro me da error 400 Bad Request.
Lo que es las credenciales como token y metodo de llamado esta bien porque el GET Funciona bien.. pero a la hora de hacer el post no funciona...

Este xml que estoy usando es el blanck schema que le hice un GET, le saque todos los campos que no me interesa cargar en la prueba y deje solo esos.... O SI o SI tengo que cargar todos los campos?

Alguien tiene idea que estoy haciendo mal?

<?xml version="1.0" encoding="UTF-8"?>
<prestashop
xmlns:xlink="http://www.w3.org/1999/xlink">
    <product>
    <name>
    <language id="1">
    <![CDATA["Producto de prueba TITULO LANG 1"]]>
</language>
<language id="2">
    <![CDATA["Producto de prueba TITULO LANG 2"]]>
</language>
</name>
<description>
    <language id="1">
        <![CDATA["Producto Description LANGUAGUE 1!"]]>
    </language>
    <language id="2">
        <![CDATA["Producto Description LANGUAGUE 1!"]]>
    </language>
</description>
<price>
    <![CDATA[25.0]]>
</price>
</product>
</prestashop>

Link to comment
Share on other sites

  • 1 year later...

Buenas, a ver si me pueden dar una mano con esto. Estoy intentando hacer algo totalmente basico pero por alguna razon me da dolor de cabeza. 
Php 8.1 PS8.2

Mediante API estoy intentando actualizar SOLO PRECIOS de productos mediante la busqueda por codigo de referencia. Hace todo perfecto, ya lo he desglozado completo. Trae el ID genero un GET del XML completo, quito los campos de solo lectura. Pero cuando voy a querer modificar el  campo PRICE me devuelve que no lo encuentra, por ende no modifica nada en el PUT. Estoy seguro que es una gansada. 

 

<?php
// Configuración de conexión
$apiUrl = 'https://steelblue-mallard-865660.hostingersite.com/api/';
$apiKey = 'M21TET828765SFVGY65GXM1IM5NFX3VQ';

// Referencia del producto que queremos obtener
$productReference = '7500435142557'; // Cambia este valor según el producto a buscar
$price = '15230.00'; // Nuevo precio del producto

/**
 * Realiza una llamada GET para obtener el ID del producto mediante su referencia.
 */
function getProductIdByReference($reference, $apiUrl, $apiKey) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $apiUrl . "products/?filter[reference]=$reference");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
    curl_setopt($ch, CURLOPT_USERPWD, $apiKey . ':');
    $response = curl_exec($ch);
    curl_close($ch);

    // Validar la respuesta
    if (!$response || stripos($response, '<?xml') !== 0) {
        exit("Error: Respuesta no válida para obtener el ID del producto.\n$response");
    }

    $xml = simplexml_load_string($response);
    if ($xml === false) {
        exit("Error al analizar el XML para obtener el ID del producto.");
    }

    return (int) $xml->products->product[0]['id'];
}

/**
 * Realiza una llamada GET para obtener los detalles completos de un producto mediante su ID.
 */
function getProductDetails($productId, $apiUrl, $apiKey) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $apiUrl . "products/$productId");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
    curl_setopt($ch, CURLOPT_USERPWD, $apiKey . ':');
    $response = curl_exec($ch);
    curl_close($ch);

    // Validar la respuesta
    if (!$response || stripos($response, '<?xml') !== 0) {
        exit("Error: Respuesta no válida para obtener los detalles del producto.\n$response");
    }

    $xml = simplexml_load_string($response);
    if ($xml === false) {
        exit("Error al analizar el XML de los detalles del producto.");
    }

    return $xml;
}

/**
 * Modifica el valor del campo <price> existente en el XML del producto.
 */
function updatePriceInXml($productDetails, $price) {
    // Verificar si el nodo <price> existe
    if (isset($productDetails->price)) {
        $productDetails->price[0] = "<![CDATA[$price]]>";
        return $productDetails->asXML();
    }
    exit("Error: El campo <price> no se encontró en el XML del producto.");
}

// Obtener el ID del producto por referencia
$productId = getProductIdByReference($productReference, $apiUrl, $apiKey);
if (!$productId) {
    exit("No se pudo obtener el ID del producto para la referencia $productReference.");
}

// Obtener los detalles completos del producto
$productDetails = getProductDetails($productId, $apiUrl, $apiKey);
if (!$productDetails) {
    exit("No se pudieron obtener los detalles del producto con ID $productId.");
}

// Eliminar campos de solo lectura
unset($productDetails->position_in_category);
unset($productDetails->manufacturer_name);
unset($productDetails->quantity);

// Modificar el campo <price>
$updatedXml = updatePriceInXml($productDetails, $price);

// Mostrar el XML final con el precio actualizado
header('Content-Type: application/xml');
echo $updatedXml;
?>
 

Lo he hecho aproposito lo mas "a prueba de tontos" posible para ver si me doy cuenta pero no. Espero puedan ayudarme

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...