Victor Casajuana Mas Posted September 17, 2020 Share Posted September 17, 2020 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 More sharing options...
gusman126 Posted September 17, 2020 Share Posted September 17, 2020 Parece que no, según las instrucciones solo acepta XML https://devdocs.prestashop.com/1.7/webservice/tutorials/prestashop-webservice-lib/create-resource/ Link to comment Share on other sites More sharing options...
Victor Casajuana Mas Posted September 20, 2020 Author Share Posted September 20, 2020 En 17/9/2020 a las 2:05 PM, gusman126 dijo: Parece que no, según las instrucciones solo acepta XML https://devdocs.prestashop.com/1.7/webservice/tutorials/prestashop-webservice-lib/create-resource/ Gracias por la respuesta, así es, continuamos con XML para enviar datos. Link to comment Share on other sites More sharing options...
gusman126 Posted September 21, 2020 Share Posted September 21, 2020 Recuerda que puedes conseguir los XML en blanco con las URL "blank" no tengo el enlace exacto . Link to comment Share on other sites More sharing options...
Victor Casajuana Mas Posted September 22, 2020 Author Share Posted September 22, 2020 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 More sharing options...
gusman126 Posted September 22, 2020 Share Posted September 22, 2020 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 More sharing options...
Victor Casajuana Mas Posted September 23, 2020 Author Share Posted September 23, 2020 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 More sharing options...
gusman126 Posted September 23, 2020 Share Posted September 23, 2020 hace 1 hora, Victor Casajuana Mas dijo: quizás el origen de todo es que la documentación sea un poco "escueta" en este aspecto. Escueta? mas bien nula . Gracias por la explicación Link to comment Share on other sites More sharing options...
Victor Casajuana Mas Posted September 23, 2020 Author Share Posted September 23, 2020 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 More sharing options...
jpintos Posted May 9, 2023 Share Posted May 9, 2023 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 More sharing options...
leonardomarinio Posted 18 hours ago Share Posted 18 hours ago 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 More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now