GraphQL para HCL Commerce

El lenguaje de marcación GraphQL está disponible para cualquier API. Es un intérprete del lado del servidor para procesar consultas utilizando un sistema de tipo de datos que diseñe. Con GraphQL, los datos y el código son independientes de cualquier base de datos o sistema de almacenamiento.

Introducción a GraphQL

Las respuestas REST contienen demasiados datos o no contienen suficientes datos, lo que requiere una segunda solicitud. GraphQL soluciona este problema recuperando solo los datos que necesita utilizando una única solicitud. Las API GraphQKekes son rápidas, versátiles y fáciles de usar para el desarrollador.

GraphQL se puede comparar a REST en muchos aspectos, y con frecuencia utiliza los mismos transportes HTTP(s) que REST. En lugar de utilizar diversos URI de ruta y verbos HTTP, ofrece un único punto final con un esquema especificado que describe cómo captar y modificar datos. Por consiguiente, los costes de red se reducen y la latencia disminuye porque ya no tiene que realizar varias solicitudes de servidor.

GraphQL simplifica la construcción de API a tiempo y la búsqueda en los datos utilizando un esquema GraphQL que se crea automáticamente. Esto garantiza que cuando se utiliza GraphQL para manipular datos, el programa de resolución envía la solicitud al controlador de REST.

El ejemplo siguiente muestra las diferencias fundamentales entre la API REST y GraphQL a la hora de captar datos de una API:

GET : https://@localhost/wcs/resources/store/1/cart/@self

En el ejemplo anterior, una API de REST utilizaría una solicitud GET para recuperar un registro. Recopilará y devolverá una respuesta completa. Con una API de REST, normalmente se recopilan todos los datos accediendo a varios recursos.

En GraphQL, solo necesita enviar una consulta que contenga requisitos de datos específicos al servidor GraphQL. El siguiente ejemplo demuestra cómo se pueden sustituir varias peticiones REST por una única petición GraphQL.

Consulta de datos y lenguaje de actualización para crear API de soporte:

Una sola solicitud GraphQL
  • Se pueden consultar varios recursos en una sola solicitud
  • Consulta por ejemplo de filtrado de respuesta
  • Examinar las conexiones entre recursos relacionados
query {
  cartGetCart(storeId:”1”) {
    grandTotal
    grandTotalCurrency
    orderItem {
      partNumber
      quantity
      promotion {
        schedule {
          endDate
        }
      }
    }
  }
  eSpotFindByName(storeId:”1”,name:”TopBrowsed_CatEntries”){
    marketingSpotData {
      behavior
    }
  }  
}

Ventajas de GraphQL

GraphQL es una sintaxis para describir requisitos e interacciones de datos. Le permite solicitar exactamente lo que necesita y recibir resultados predecibles. Mediante la secuenciación de cómo maneja los datos, puede desarrollar aplicaciones web y móviles avanzadas rápidamente con GraphQL. En una consulta GraphQL, especifique cómo se deben estructure los datos tal como se devuelven desde el servidor. Esto le permite consultar solo los datos que desee en el formato que necesite. En una única solicitud de red, puede consultar y obtener numerosos fragmentos de información de diversas fuentes, asegurando tiempos de respuesta más rápidos. GraphQL tiene todas estas funciones, combinadas con excelentes herramientas de desarrollador, lo que la hace vital para mejorar la experiencia HCL Commerce.

Para crear API, GraphQL se utiliza con REST, no como sustitución. La consulta GraphQL en sí no es más rápida que las consultas de REST, pero como puede elegir qué campos desea consultar, la solicitud graphQL siempre es mejor. Esto contrasta con REST, que devuelve con frecuencia más datos, aunque no sean críticos o útiles. GraphQL también permite a los desarrolladores obtener varias cosas en una única solicitud, aumentando la eficacia de cada consulta.

La principal diferencia entre GraphQL y las API de REST tradicionales es que REST a menudo devuelve un bloque de datos completo en una respuesta JSON, que se debe procesar y distribuir. En su lugar, GraphQL se basa en el esquema, las consultas y los resolutores, con el objetivo de mejorar el concepto REST permitiéndole solicitar un tipo específico de datos en lugar del fragmento completo. No tiene que pasar por una gran cantidad de información ya que solo obtiene la información que ha solicitado.

No obstante, tenga en cuenta que GraphQL y REST son dos cosas distintas: GraphQL es un lenguaje y una tecnología, mientras que REST es un estilo de arquitectura. Esto implica que a medida que más equipos utilicen GraphQL, REST seguirá existiendo.

  • Competitividad de las ventas

    Las aplicaciones se desarrollan de forma rutinaria para varios factores de formato, como iOS y Android, por lo que es importante simplificar el desarrollo de aplicaciones en todas estas plataformas. Aquí es donde GraphQL es útil. Con GraphQL, puede personalizar la forma de respuesta para cada solicitud. Además, la gestión de puntos finales de API se simplifica, ya que expone un único punto final de HTTP (/graphql) para captar los datos necesarios.

  • Ventajas reales disponibles para la comunicación cliente-servidor

    GraphQL es un lenguaje para comunicarse entre clientes remotos y servidores. Los resolutores son funciones arbitrarias que se utilizan para acceder y manipular datos. Los datos de estas funciones de resolución se integran y consolidan mediante GraphQL, que a continuación proporciona la salida al cliente. Estas funciones de resolución deben, en la mayoría de los casos, estar externalizados a una pila de negocio que sea responsable de conectarse con las diferentes fuentes de datos subyacentes. Las API remotas, las bases de datos, la memoria caché local y casi cualquier otra cosa a la que pueda acceder el lenguaje de programación pueden utilizarse como orígenes de datos.

    • Adaptar las respuestas para que solo incluyan los datos deseados

      Las consultas GraphQL siempre entregan respuestas esperadas o precisas, sin incluir información irrelevante. En otras palabras, GraphQL elimina el problema de la infraobtención y la sobreobtención de información que antes era un problema cuando se utilizaban API de REST para recuperar datos.

    • Emisión de varias operaciones con un único intercambio cliente-servidor

      GraphQL es significativamente más rápido que otras API de comunicación porque le permite limitar la consulta de solicitud seleccionando solo los campos que desea consultar. Le permite recuperar todos los datos que necesita de una sola solicitud, en lugar de distribuir diversos fragmentos de datos entre numerosos puntos finales. En lugar de ponerse en contacto con dos puntos finales distintos, puede recibir información de usuario e información de pedidos en una sola consulta.

    • Encadenamiento de operaciones entre servicios en una sola solicitud

      Los enlaces se pueden utilizar para describir cómo un valor devuelto por una operación puede entrarse en otra operación. Al establecer enlaces, los procesos se conectan y navegan como si se hubieran enlazado. Con las API graphQL, la aplicación puede acceder a todos los datos que necesita en una única llamada a la API. Esto elimina la necesidad de muchas llamadas de API para una sola operación.

    • Definición de servicios de nivel superior creados orquestando los de nivel inferior ('Backend-for-Frontend')

      La capa Backend For Frontend (BFF) está hecha de varios programas de fondo que se han creado para satisfacer las demandas de diversas infraestructuras frontales, tales como aplicaciones de escritorio, navegador y aplicaciones móviles nativas. Se pueden combinar varios orígenes de datos en una única interfaz GraphQL con GraphQL.

    • Introspección y descubrimiento incorporados

      La función de introspección de GraphQL le permite navegar dentro de los tipos y aprender el esquema, asegurándose de que las aplicaciones solo pregunten qué es factible y de la forma correcta. Puede ver qué puede consultar el esquema y cómo se organizan los datos. A continuación, puede utilizar un IDE GraphQL para añadir sin esfuerzo campos adicionales a las consultas existentes. GraphQL valida el formato de datos de forma que no tenga que hacerlo. Simplemente desarrolle resolutores, que son los métodos para recibir datos.

      Puesto que el conjunto de resultados o los datos entregados en GraphQL son muy específicos de la consulta del cliente, generalizarlo es muy sencillo y fácil para el servidor. Los clientes existentes no se ven afectados cuando se añaden nuevas características del producto o más campos al servidor. Puesto que los campos de servidor pueden estar en desuso pero siguen funcionando, puede explotar el servidor más antiguo sin ningún tipo de problemas.

Ejemplo

Crear carrito:

mutation {
  cartCreateOrder(storeId: "1", description: "Test Order description") {
    outOrderId
  }
}

response:
{
  "data": {
    "cartCreateOrder": {
      "outOrderId": "1050717601"
    }
  }
}
Añadir un artículo al carrito:
mutation {
  cartAddOrderItem(storeId: "1", requestBody: {orderId: "1050717601", orderItem: {productId: "12687", quantity: "2"}}) {
    orderItem {
      orderItemId
    }
  }
}

response:
{
  "data": {
    "cartAddOrderItem": {
      "orderItem": [
        {
          "orderItemId": "15001"
        }
      ]
    }
  }
}
Actualizar artículo del pedido:
mutation {
  cartUpdateOrderItem(storeId: "1", requestBody: {orderId: "1050717601", orderItem: {quantity: "3", orderItemId: "15001", productId: "12687"}}) {
    orderId
  }
}

response:
{
  "data": {
    "cartUpdateOrderItem": {
      "orderId": "1050717601"
    }
  }
}
Obtener carrito:
query {
  cartGetCart(storeId:"1"){
    orderId
    orderItem{
      quantity
    }
  }
}

response:
{
  "data": {
    "cartGetCart": {
      "orderId": "1050717601",
      "orderItem": [
        {
          "quantity": "3.0"
        }
      ]
    }
  }
}
Calcular pedido:
mutation {
  cartCalculateOrder2(storeId: "1", orderId: "1050717601") {
    orderId
    viewTaskName
  }
}

response:
{
  "data": {
    "cartCalculateOrder2": {
      "orderId": [
        "1050717601"
      ],
      "viewTaskName": "RedirectView"
    }
  }
}
Antes del pago:
mutation {
  cartPreCheckout(storeId: "1", requestBody: {orderId: "1050717601"}) {
    orderId
  }
}

response:
{
  "data": {
    "cartPreCheckout": {
      "orderId": "1050717601"
    }
  }
}
Añadir instrucciones de pago:
mutation {
  paymentInstructionAddPaymentInstruction(storeId: "1", requestBody: {orderId: "1050717601", resourceId: "https://localhost:443/wcs/resources/store/1/cart/@self/payment_instruction", paymentInstruction: {email1: "a1@a1.com", email2: "a2@a2.com", fax1: "", fax2: "", phone1: "123", phone2: "234", mobilePhone1: "1", mobilePhone1Country: "23", nickName: "Hello", billingAddressId: "3074457359254738956", piAmount: "9.42", state: "MH", payMethodId: "COD", piDescription: "COD"}, xIsPurchaseOrderNumberRequired: "false", xIsPersonalAddressesAllowedForShipping: "true", resourceName: "cart"}) {
    orderId
  }
}

response:
{
  "data": {
    "paymentInstructionAddPaymentInstruction": {
      "orderId": "1050717601"
    }
  }
}
Pasar por caja:
mutation {
  cartCheckOut(storeId: "1", requestBody: {orderId: "1050717601"}) {
    orderId
  }
}

response:
{
  "data": {
    "cartCheckOut": {
      "orderId": "1050717601"
    }
  }
}
Cancelar pedido:
mutation {
  cartCancelOrder(storeId: "1", orderId: "1050717601") {
    viewTaskName
  }
}