:::: MENU ::::

Ejemplos de uso API REST Magento 2

1.47 avg. rating (29% score) - 104 votes

Una de las mejoras más importantes de Magento es la renovación completa del API.

Al igual que ocurría en Magento 1, Magento expone sus APIs vía dos protocolos: REST y SOAP, pero a diferencia de lo que ocurría antes, en Magento 2 ambas APIs (SOAP y REST) exponen la misma funcionalidad. En Magento 1, por el contrario, el conjunto de llamadas era diferente y el API SOAP era mucho más completo que el API REST.

En este artículo explicaremos el uso básico del API REST, para realizar tres operaciones básicas:

  • Obtener un token de acceso
  • Obtener la información de un producto
  • Actualizar la información de un producto

Para utilizar cualquiera de las dos APIs, en primer lugar deberemos identificarnos de algún modo.

En el caso del API REST, la autorización se realiza con las credenciales de un usuario del administrador. Para ello, habitualmente crearemos un nuevo Rol con los permisos para las funciones que deseamos exponer y un usuario con dicho Rol.

Una vez tenemos el usuario creado, tendremos que realizar una primera llamada para identificarnos y obtener un token de autorización. Si realizamos la integración en PHP, podemos utilizar PHP-CURL.

Token de autorización API REST Magento 2

$url = 'http://www.localhost.com/index.php/rest/V1/integration/admin/token';

$data = array("username" => "", "password" => "");
$data_string = json_encode($data);

$headers = array(
    'Content-Type: application/json',
    'Content-Length: ' . strlen($data_string)
);

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$token = curl_exec($ch);

$token = json_decode($token);
echo $token;

Con esta llamada y si nuestro usuario es correcto, Magento nos devolverá un token de autorización que deberemos utilizar en las siguientes llamadas al API.

Consultar un producto con el API REST Magento 2

Para consultar la información de un producto con el API REST de Magento, únicamente necesitaremos el SKU del producto.

La llamada en este caso es muy sencilla, ya que únicamente requiere del envío del token que acabamos de obtener en la cabecera de la petición. Igualmente si realizamos la llamada con CURL, podremos hacerlo de la siguiente forma:

$token = '';

$requestUrl = 'http://www.localhost.com/index.php/rest/V1/products/';
$headers = array("Authorization: Bearer $token");

$ch = curl_init($requestUrl);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);

$result=  json_decode($result);
print_r($result);

Actualizar información de un producto con el API REST Magento 2

De forma similar podemos actualizar un producto con la información necesaria.

En este caso y siguiendo la definición estándar de un API REST, Magento expone está opción por medio de una llamada tipo PUT, a la que enviaremos únicamente los datos que queremos actualizar. El resto de los datos del producto quedarán inalterados.

$token = '';

$requestUrl = 'http://www.localhost.com/index.php/rest/V1/products/';
$headers = array(
    'Content-Type: application/json',
    'Authorization: Bearer ' . $token
);
$data = array(
    'product' => array(
        'name' => 'Sandwich Salami (Store 2)',
    )
);

$data = json_encode($data);

$ch = curl_init($requestUrl);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);

$result=  json_decode($result);
print_r($result);

La llamada nos devolverá los datos del producto modificado, de igual modo que los obteníamos en la petición de información anterior.

Actualizar atributos custom a través del API rest

Si queremos actualizar los atributos estándar de un producto o de cualquier otra entidad, podemos hacerlo como en el caso anterior, pero ¿qué ocurre si queremos actualizar un atributo que hemos añadido a los productos a través de la gestión de atributos del backend.

En ese caso debemos modificar un poco el método anterior y añadir algo de información al json. Por ejemplo si tenemos un nuevo atributo con código needs_sync, deberemos enviar los datos de la siguiente forma:

$token = '';
 
$requestUrl = 'http://www.localhost.com/index.php/rest/V1/products/';
$headers = array(
    'Content-Type: application/json',
    'Authorization: Bearer ' . $token
);
$data = array(
    'product' => array(
        'name' => 'Sandwich Salami (Store 2)',
        'custom_attributes' => array(
	    '0' => array(
	        'attribute_code' => 'needs_sync',
	        'value' => '0'
	    )
	)
    )
);
 
$data = json_encode($data);
 
$ch = curl_init($requestUrl);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
 
$result=  json_decode($result);
print_r($result);

Limitar la información retornada por el API rest

Sobre todo cuando realizamos búsquedas a través del API y si el resultado de las búsquedas es muy amplio, podemos encontrarnos con que la cantidad de información retornada es muy grande.

Si queremos limitar el retorno de información, podemos indicar a Magento qué campos o atributos deseamos que nos sean devueltos. Por ejemplo si estamos buscando productos que cumplen una serue de condiciones para luego realizar operaciones más complejas con ellos, quizá únicamente necesitamos una lista de nombres y skus.

En ese caso podríamos añadir a la ULR de la petición un nuevo parámetro, como el que sigue, de forma que la información retornada incluiría únicamente nombre y sku.

http://www.localhost.com/index.php/rest/V1/products/sku-del-producto?fields=items[sku],items[name]

Acceso por Store View al API de Magento 2

Una de las cosas que han cambiado respecto a Magento 1 es la forma en la que indicar al API el Store View al que deseamos acceder.

En el caso de Magento 1, el API recibía el ID de la tienda por medio de un parámetro más de información (en este caso) del producto que queríamos actualizar.

En Magento 2, en cambio, el identificador de la tienda a la que queremos acceder, debe enviarse como parte de la URL de la llamada, de forma que las llamadas anteriores quedarían de la siguiente forma:

Datos por defecto de un producto:

http://www.localhost.com/index.php/rest/V1/products/

Datos dell producto para un Store View en particular:

http://www.localhost.com/index.php/rest//V1/products/

Mas información sobre el API REST de Magento 2

La definición completa del API REST de Magento 2 puede encontrarse en la documentación oficial, a través de los siguientes enlaces:

http://devdocs.magento.com/guides/v2.0//rest/bk-rest.html
http://devdocs.magento.com/swagger/index.html




9 Comments

  • Responder Roberto |

    estoy tratando de usar tu ejemplo pero siempre obtengo la misma respuesta:

    «Consumer is not authorized to access %resources»

    Puedes ayudarme con esto?

    Muchas gracias

  • Responder Matias |

    Hola Daniel buenas tardes.
    Estuve leyendo tu tutorial, parece sencillo pero creo que debo aprender todavia.

    El 1er script funciona, me devuelve un token.
    El 2do script, no me queda claro donde debe ir el SKU del producto en el script. He colocado el archivo aquí http://www.norteaccesorios.com/curl/get_product.php pero me devuelve lo siguiente: stdClass Object ( [message] => %fieldName is a required field. [parameters] => stdClass Object ( [fieldName] => searchCriteria ) )

    Espero puedas ayudarme estoy hace ya un tiempo con Magento 2, pero hay cosas que todavía no las tengo claras.
    También voy a necesitar me cotices una App para esta tienda, que disponga de Mercado Pago como Gateway. La app había pensado en algo hybrido para poder disponer de las versiones de iOS y Android .

    Espero tu respuesta, un saludo.

    Matias

  • Responder jonathan pradi |

    Daniel, como estas?
    llegue a tu blog buscando info sobre conexion a magento por api rest, tengo un servicio de sincronizacion con Mercadolibre.
    Un cliente necesita integrar su sitio de magento con mi servicio, basicamente lo que necesito es conectarme a la API por medio de php y hacer las siguientes acciones:
    +Consultar listado de los articulos y ver articulo por ID
    +consultar titulo, precio, stock, url con imagenes del mismo.
    +editar stock del articulo.

    Trabajas haciendo este tipo de desarrollos? ya que yo a pesar de ver tu post, no se ni por donde empezar, a mi me serviria tener una clase con los metodos y un instructivo de como conectarme.

    Saludos!

  • Responder julio |

    Hola amigo que tal,

    Soy nuevo en magento tengo un problema, estoy creando unas web service en magento 1.9.1.1 y no se como obtener el url de magento para consumir los datos de los usuarios mediante un login que cree en otro proyecto, y las url que tengo no son las corretas, nececito que me genere un ‘ json ‘
    me falta es la configuracion espero me puedas ayudar .

    Saludos gracias.

  • Responder Ricardo Hernandez Villarroel |

    Hola amigo buenos días disculpa tengo un problema estoy desarrollando una api que consuma un JSON de Magento par después enviar esta información a otra API pero tengo el problema de que no me permite el consumo y no se porque me gustaría saber si sabes de algo que me falte una validación o algo por el estilo. Si pudieses hacerte un tiempo para que conversáramos un poco seria grandioso ya me encuentro un poco atorado con eso.
    Un saludo cordial de mexica

  • Responder Gerard Barbosa |

    Hay alguna forma de configurar un metodo de pago que sea descontando de unnos montos d ecreditos asignados por usuario dentro de la misma empresa? Es decir como una tienda interna donde puedes sacar a credito los productos y te descuentan el valor del pago de nomina? O conoces algun plugin que lo facilité

  • Responder Wendy Reyes |

    Buenas noches,
    Tenemos una pagina que es nueva y tenemos problema con algunos de los pagos estamos utilizando mercado pago, sin embargo acabamos de activar una cuenta con conekta pero no nos aparece en magento para su instalación.
    Nos urge la consultoria, no se si tenga disponiblidad para poder tener una platica.
    Quedo al pendiente.
    Gracias, saludo

Hey! Qué opinas sobre el artículo?