Personalización de los servicios REST para dar soporte a nuevos formatos de respuesta personalizados

De forma predeterminada, la infraestructura REST de HCL Commerce da soporte a los formatos JSON y XML. Puede ampliar los manejadores de recurso de JAX-RS predeterminados para personalizar los servicios REST para que den soporte a los nuevos formatos de respuestas personalizados.

Antes de empezar

Asegúrese de que conoce los supuestos siguientes para este escenario de personalización:
  • El nuevo formato de respuesta personalizado es de tipo application/custom+xml para la clase de manejador de recursos com.ibm.commerce.rest.search.handler.ProductViewHandler predeterminada.
  • Se utiliza el siguiente patrón de URL:
    • store/storeID/productview/partNumber
    Por ejemplo, http://host_name/wcs/resources/store/10101/productview/MW-0090
  • El formato de respuesta application/custom+xml es el mismo que el formato de XML personalizado. Sin embargo, para los fines de este escenario de personalización, se denomina formato de respuesta personalizado.
El siguiente archivo de código de ejemplo ilustra las tareas descritas en este tema CustomEntityProvider_Sample_Assets. El archivo de código de ejemplo contiene la estructura de directorio siguiente:
Estructura de directorios de archivado de ejemplo

Procedimiento

  1. Abra HCL Commerce Developer y cambie a la vista Explorador de empresa.
  2. Añada un proveedor de entidades para dar soporte al formato de respuesta personalizado:

    Cada proveedor de entidades formatea una entidad en un formato de respuesta específico. Puesto que la personalización consiste en añadir un formato de respuesta, se debe añadir un nuevo proveedor de entidades para dar formato a la entidad en el nuevo formato de respuesta personalizado.

    1. En el proyecto WebSphereCommerceServerExtensionsLogic, cree una clase llamada com.mycompany.commerce.foundation.rest.providers.CustomXMLEntityProvider que amplíe com.ibm.commerce.foundation.rest.providers.AbstractEntityProvider.
    2. Añada la anotación siguiente a la clase de entity para registrar el proveedor de entidades para el formato de respuesta application/custom+xml en el tiempo de ejecución JAX-RS:
      
      @Produces(value = { "application/custom+xml" })
      
      Para obtener más información, consulte la clase de ejemplo proporcionada. La clase de ejemplo contiene comentarios en línea para ayudarle a implementar el proveedor de entidades.
    3. Guarde los cambios y cierre el archivo.
    4. Añada el nombre de clase de proveedor de entidades al archivo Rest/WebContent/WEB-INF/config/providers-ext.properties para registrar el nuevo proveedor de entidades.
    5. Guarde los cambios y cierre el archivo.
  3. Añada un atajo de formato de respuesta para el formato de respuesta personalizado o utilice la cabecera de solicitud HTTP Accept.

    Los atajos de formato de respuesta son los atajos de tipo de soporte solicitados que un cliente puede especificar fácilmente en el URL de petición, como un parámetro de consulta. Puede añadir un atajo de formato de respuesta para el nuevo formato de respuesta personalizado application/custom+xml, al crear el archivo si no existe. De lo contrario, se añade el atajo de formato personalizado.

    1. Cree el archivo siguiente Rest/WebContent/WEB-INF/config/com.ibm.commerce.rest-ext/wc-rest-responseformat.xml
    2. Añada un atajo para el formato de respuesta "application/custom+xml" al archivo como se muestra en el fragmento de código siguiente.
      
      <responseFormatMappings>
      
        <!-- Define response format and Internet media type mapping. -->
        <!-- Internet media type was originally called a MIME type. -->
        <!-- When default attribute is defined to true, the response format is the default format -->
      
        <formatMapping responseFormat="custom" mediaType="application/custom+xml"/>
          
      </responseFormatMappings>
      
    3. Guarde los cambios y cierre el archivo.
    Si no se especifica un atajo de formato de respuesta, puede especificar el formato de respuesta que utiliza la cabecera de solicitud Accept HTTP, en lugar de utilizar el parámetro de consulta responseFormat. En la cabecera de solicitud Accept, debe especificar el formato de respuesta en el formulario completo, por ejemplo application/custom+xml. Sin embargo, el uso del encabezado de solicitud Accept requiere los pasos siguientes para ampliar el manejador de recursos de REST existente. Para simplificar el procedimiento, se recomienda añadir un atajo de formato de respuesta personalizado a wc-rest-responseFormat.xml para que un cliente pueda utilizar el parámetro de consulta responseFormat para obtener el formato de respuesta personalizado:
    1. En el proyecto WebSphereCommerceServerExtensionsLogic, cree una nueva clase com.mycompany.commerce.rest.catalog.handler.ProductViewHandlerExt que amplíe com.ibm.commerce.rest.search.handler.ProductViewHandler.
    2. En la clase ProductViewHandlerExt, asegúrese de añadir la misma anotación de vía de acceso que existe en la superclase. Esto garantiza que cuando se invoca el URL predeterminado, se utiliza el manejador de recursos personalizado ProductViewHandlerExt en lugar del manejador de recursos predeterminado. Sobrescriba el método de superclase findProductByPartNumber con el contenido siguiente:
      
      @GET
      @Path("{partNumber}")
      @Produces( { "application/json", "application/xml", "application/custom+xml" })// additionally add custom response format
      @Override
      public Response findProductByPartNumber(
      @PathParam("storeId") String storeId,
      @PathParam("partNumber") String partNumber,
      @QueryParam(value = "responseFormat") String responseFormat)
      {
      // write custom logic here
      return super.findProductByPartNumber(storeId, partNumber, responseFormat);
      }
      

      Para obtener más información, consulte la clase de ejemplo proporcionada en el archivo CustomEntityProvider_Sample_Assets. La clase de ejemplo contiene comentarios en línea que le ayudan a ampliar el manejador de recursos predeterminado.

  4. Implemente un nuevo archivo JSP para dar formato a los objetos de datos en el formato de respuesta personalizado:

    Los archivos JSP se pueden utilizar para dar formato a una entidad. Consulte com.ibm.commerce.foundation.rest.providers.AbstractEntityProvider para obtener más información. En esta personalización, los archivos JSP se utilizan debido a la naturaleza dinámica del formato de XML personalizado.

    1. Cree un nuevo archivo JSP para formatear el objeto de datos en la ubicación siguiente:
      • Rest/WebContent/jsp/commerce/catalog/custom/SerializeShowCatalogNavigationViewDataAreaTypeCustom.jsp
      La directriz de codificación de archivo JSP es idéntica a los archivos JSP del escaparate que dan formato a un objeto de datos. El archivo JSP puede incluir otros fragmentos JSP, como SerializeShowCatalogEntryViewCustom.jspf, que da formato a partes del nombre en el objeto de datos. Consulte los archivos JSP de ejemplo proporcionados para obtener más información.
    2. Guarde los cambios y cierre el archivo.
    3. Añada una acción de Struts en el archivo de Struts Rest/WebContent/WEB-INF/struts-extension.xml para registrar el JSP.
      Por ejemplo:
      
      <action path="/ShowCatalogNavigationViewCustom/0" 
      forward="/jsp/commerce/catalog/custom/SerializeShowCatalogNavigationViewDataAreaTypeCustom.jsp"/>
      
      Nota: El formato de acción de los Struts debe coincidir con el nombre de grupo de formato que se devuelve en el manejador de recursos personalizado ProductViewHandlerExt. Consulte la interfaz IResourceHandler para obtener más información.
      Cuando inicia el URL predeterminado que indica el formato de respuesta personalizado application/custom+xml:
      • http://localhost/wcs/resources/store/10101/productview/MW-0090?responseFormat=custom
      Se ejecuta /jsp/commerce/catalog/custom/SerializeShowCatalogNavigationViewDataAreaTypeCustom.jsp que formatea el objeto de datos ShowCatalogNavigationViewDataAreaType en el formato personalizado application/custom+xml.
    4. Guarde los cambios y cierre el archivo.
  5. Implemente un archivo JSP de error nuevo para el formato de respuesta personalizado.

    En caso de que haya algún error, la infraestructura REST ejecuta el archivo JSP de errores específico para el formato de respuesta, al pasar los parámetros de error.

    1. Cree un archivo JSP para formatear la respuesta de error en la siguiente ubicación Rest/WebContent/jsp/commerce/foundation/custom/Error.jsp
    2. Guarde los cambios y cierre el archivo.
    3. Añada una acción de Struts en el archivo de Struts Rest/WebContent/WEB-INF/struts-extension.xml para registrar el JSP.
      
      <action path="/ErrorCustom/0" forward="/jsp/commerce/foundation/custom/Error.jsp"/>
      
      Nota: El formato de acción de los Struts debe coincidir con el nombre de grupo de formato que se devuelve en el manejador de recursos personalizado ProductViewHandlerExt.
      Cuando inicia el URL predeterminado que indica el formato de respuesta personalizado application/custom+xml:
      • http://localhost/wcs/resources/store/10101/productview/MW-0090?responseFormat=custom
      Se ejecuta:
      • /Rest/WebContent/jsp/commerce/foundation/custom/Error.jspen el caso de errores o excepciones.
      Que da formato a los parámetros Error que se pasan al archivo JSP de error en el formato personalizado application/custom+xml.
  6. Verifique la personalización al reiniciar el servidor HCL Commerce e iniciar los URL creados en esta tarea.