Jump to content
Victor Castro Contreras

[Aporte] Webservice Prestashop 1.6 Json Request (Post y Put)

Recommended Posts

1. Añade la libreria  XML_Serializer de PHP, puedes colocarlo en un nuevo directorio con el nombre "XML" 

\classes\webservice\XML\Serializer.php Serializer.php

 

 

2. Incluye la librería al archivo: \classes\webservice\WebserviceRequest.php

...

*  @license    http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
*  International Registered Trademark & Property of PrestaShop SA
*/

include("XML/Serializer.php");    // <-------- AÑADE LA LIBRERIA

class WebserviceRequestCore
{
    const HTTP_GET = 1;
    const HTTP_POST = 2;
    const HTTP_PUT = 4;
   
 ...

3. Añade esta función en la linea 

\classes\webservice\WebserviceRequest.php  WebserviceRequest.php

public function json_to_xml($json) {
    $serializer = new XML_Serializer();
    $obj = json_decode($json);

    if ($serializer->serialize($obj)) {
        return $serializer->getSerializedData();
    }
    else {
        return null;
    }
}

4. Añade la variable $requestJson en webserviceRequest.php

 protected function saveEntityFromXml($successReturnCode)
    {
        $requestJson = true;

        if ($requestJson)
            $this->_inputXml = $this->json_to_xml($this->_inputXml);

        try {
            $xml = new SimpleXMLElement($this->_inputXml);
        } catch (Exception $error) {
            $this->setError(500, 'XML error : '.$error->getMessage()."\n".'XML length : '.strlen($this->_inputXml)."\n".'Original XML : '.$this->_inputXml, 127);
            return;
        }     

5. Cambia el switch ($type) en default como "WebserviceOutputJSON"

 

\classes\webservice\WebserviceRequest.php

protected function getOutputObject($type)
    {
        // set header param in header or as get param
        $headers = self::getallheaders();
        if (isset($headers['Io-Format'])) {
            $type = $headers['Io-Format'];
        } elseif (isset($headers['Output-Format'])) {
            $type = $headers['Output-Format'];
        } elseif (isset($_GET['output_format'])) {
            $type = $_GET['output_format'];
        } elseif (isset($_GET['io_format'])) {
            $type = $_GET['io_format'];
        }
        $this->outputFormat = $type;
        switch ($type) {
            case 'JSON' :
                require_once dirname(__FILE__).'/WebserviceOutputJSON.php';
                $obj_render = new WebserviceOutputJSON();
                break;
            case 'XML' :
                $obj_render = new WebserviceOutputXML();
            default :
                require_once dirname(__FILE__).'/WebserviceOutputJSON.php';
                $obj_render = new WebserviceOutputJSON();
                break;
        }
        return $obj_render;
    }

6. Prueba el POST o PUT desde Postman o SoapUI

{
  "customers": {
	"id" : "2",
    "active": "0",
    "deleted": "0",
    "passwd": "p4ssw0rdSeguro002",
    "lastname": "Castro Contreras",
    "firstname": "Victor",
    "email": "victor@castrocontreras.com",
    "birthday": "1989-10-09"
  }
}

post-279167-0-70854400-1490738258_thumb.png

 

 

P.D: Si tienes algun problema con PHP-PEAR, asegurate de tenerlo instalado:

 

apt-get install php-pear #instalamos pear
sudo pear channel-update pear.php.net #actualizamos los canales
sudo pear list #nos muestra los paquetes instalados
pear remote-list #muestra la lista de paquetes disponibles para instalar
Edited by Victor Castro Contreras (see edit history)
  • Like 3

Share this post


Link to post
Share on other sites

Gracias por el aporte!!

Tengo una consulta sobre cómo trabajar con los atributos de los XML en Json:

El problema me pasa al intentar hacer un POST de un artículo. Paso un Json, desde POSTMAN por ejemplo, con el artículo que quiero crear, pero no lo consigo porque en los campos "link_rewrite" y "name" hay que pasar el "language", con atributo, en este caso, de ID = 1. No consigo hacer esto desde el Json.

Hay alguna forma de hacerlo ??

El artículo a crear (desde POSTMAN, por ejemplo) sería éste:

{
    "products": {
        "id_category_default": "23",
        "new": null,
        "id_default_combination": 0,
        "id_tax_rules_group": "1",
        "position_in_category": "26",
        "type": "simple",
        "id_shop_default": "1",
        "reference": "99998000",
        "minimal_quantity": "1",
        "price": "9.191283",
        "active": "1",
        "redirect_type": "404",
        "id_product_redirected": "0",
        "available_for_order": "1",
        "condition": "new",
        "show_price": "1",
        "indexed": "1",
        "visibility": "both",
        "advanced_stock_management": "0",
        "pack_stock_type": "3",
        "link_rewrite": "producto-ejemplo",
        "name": "PRODUCTO EJEMPLO",
        "associations": {
            "categories": [
                {
                    "id": "23"
                }
            ],
            "stock_availables": [
                {
                    "id": "607485",
                    "id_product_attribute": "0"
                }
            ]
        }
    }
}
 

Share this post


Link to post
Share on other sites

Hola!!

 

Apunto solución para postear un producto sin problemas (POST) y poder, si así se necesita, tener una respuesta también por XML (GET), no sólo por Json.

 

Empiezo por poder mostrar respuesta por XML:

 

En 29/3/2017 a las 12:00 AM, Victor Castro Contreras dijo:

5. Cambia el switch ($type) en default como "WebserviceOutputJSON"

\classes\webservice\WebserviceRequest.php


protected function getOutputObject($type)
    {
        // set header param in header or as get param
        $headers = self::getallheaders();
        if (isset($headers['Io-Format'])) {
            $type = $headers['Io-Format'];
        } elseif (isset($headers['Output-Format'])) {
            $type = $headers['Output-Format'];
        } elseif (isset($_GET['output_format'])) {
            $type = $_GET['output_format'];
        } elseif (isset($_GET['io_format'])) {
            $type = $_GET['io_format'];
        }
        $this->outputFormat = $type;
        switch ($type) {
            case 'JSON' :
                require_once dirname(__FILE__).'/WebserviceOutputJSON.php';
                $obj_render = new WebserviceOutputJSON();
                break;
            case 'XML' :
                $obj_render = new WebserviceOutputXML();
            default :
                require_once dirname(__FILE__).'/WebserviceOutputJSON.php';
                $obj_render = new WebserviceOutputJSON();
                break;
        }
        return $obj_render;
    }

 

 

 

Para poder permitir un output en XML ( ej.: .../api/products/1188?output_format=XML ) , hay que añadir un break en el case 'XML':

 

case 'XML' :
                $obj_render = new WebserviceOutputXML();
                break;

 

Para poder llegar a crear con POST, un producto por ejemplo, existe el problema que de la manera que se indica el último método " json_to_xml() ", no se pueden pasar atributos, por ejemplo el atributo para el "language"; esto es, el ID del idioma.

 

Para arreglar ese problema con los atributos desde Json a XML, habría que cambiar esa última función:

 

    public function json_to_xml($json) {

        //Opciones para el Serializador:
        $opciones = array(
            XML_SERIALIZER_OPTION_INDENT => '    ',
            XML_SERIALIZER_OPTION_LINEBREAKS => "\n",
            XML_SERIALIZER_OPTION_DEFAULT_TAG => 'unnamedItem',
            XML_SERIALIZER_OPTION_SCALAR_AS_ATTRIBUTES => false,
            XML_SERIALIZER_OPTION_ATTRIBUTES_KEY => '_attributes',
            XML_SERIALIZER_OPTION_CONTENT_KEY => '_content',
            XML_SERIALIZER_OPTION_MODE => XML_SERIALIZER_MODE_SIMPLEXML
        );

        $serializer = new XML_Serializer($opciones);
        $arrayDesdeJson = json_decode($json, true); //Array asociativo

        if ($serializer->serialize($arrayDesdeJson)) {
            return $serializer->getSerializedData();
        } else {
            return null;
        }//Fin if-else
    }

 

De esa manera ya se puede crear un producto sin ningún problema (POST) , así como modificarlo luego con PUT.

Un ejemplo de POST:

 

{
  "product": {
    "id_category_default": "23",
    "id_tax_rules_group": "1",
    "type": "simple",
    "id_shop_default": "1",
    "reference": "77788800",
    "price": "17.314050",
    "active": "1",
    "redirect_type": "404",
    "id_product_redirected": "0",
    "available_for_order": "1",
    "condition": "new",
    "show_price": "1",
    "indexed": "0",
    "visibility": "both",
    "advanced_stock_management": "0",
    "link_rewrite": {
      "language": {
        "_attributes": {
            "id": "1"
        },
        "_content": "producto-para-test"
      }
    },
    "name": {
      "language": {
        "_attributes": {
            "id": "1"
        },
        "_content": "PRODUCTO PARA TEST"
      }
    },
    "associations": {
      "categories": {
        "category": {
          "id": "23"
        }
      },
      "stock_availables": {
        "stock_available": {
          "id": "607485",
          "id_product_attribute": "0"
        }
      }
    }
  }
}

 

Saludos!!

Edited by Jose Lorenzo (see edit history)

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...

Important Information

Cookies ensure the smooth running of our services. Using these, you accept the use of cookies. Learn More