--- title: "Configurar la Advanced I/O Function" url: https://docs.catalyst.zoho.com/es/tutorials/alien-city/java/configure-advio-function/ description: "Crea una aplicación web serverless de una sola página utilizando Catalyst Advanced I/O Function y Catalyst Data Store que te permita reportar o buscar encuentros con alienígenas en una ciudad." last_updated: 2026-03-20T16:21:56Z service: All Services type: tutorial related_links: - name: "Functions" url: /es/serverless/help/functions/introduction/ - name: "Advanced I/O Functions" url: /es/serverless/help/functions/advanced-io/ - name: "Functions Directory Structure" url: /es/cli/v1/project-directory-structure/functions-directory/ --- # Configurar la Advanced I/O Function Comencemos a codificar la aplicación Alien City configurando el componente de la función. El directorio de la función Java ( `[ functions/AlienCityAIO ](https://docs.catalyst.zoho.com/es/cli/v1/project-directory-structure/functions-directory/)` ) contiene los siguientes archivos: - El archivo principal de la función `AlienCityAIO.java` - El archivo de configuración `catalyst-config.json` - Los archivos de biblioteca Java en la carpeta lib - Los archivos de dependencias `.classpath` y `.project` Agregarás código en el archivo principal de la función `AlienCityAIO.java`. Las dos APIs en la Advanced I/O Function que manejan el enrutamiento entre el servidor y Data Store son: - **`GET /alien`: Para verificar si hay alienígenas presentes en una ciudad - `POST /alien`**: Para reportar la presencia de alienígenas en una ciudad Ahora agreguemos el código en el archivo de la función. Copia el código que se muestra a continuación y pégalo en `AlienCityAIO.java` en el directorio `functions/AlienCityAIO` de tu proyecto, y guarda el archivo. Puedes usar cualquier IDE de tu preferencia para trabajar con los archivos de la aplicación. > **Nota:** Revisa el código de esta sección para asegurarte de comprenderlo completamente. **AlienCityAIO.java** ```java import java.io.InputStreamReader; import java.util.ArrayList; import java.util.logging.Level; import java.util.logging.Logger; import com.zc.common.ZCProject; import javax.servlet.ServletInputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.catalyst.advanced.CatalystAdvancedIOHandler; import com.zc.component.object.ZCObject; import com.zc.component.object.ZCRowObject; import com.zc.component.zcql.ZCQL; import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; public class AlienCityAIO implements CatalystAdvancedIOHandler { private static final Logger LOGGER = Logger.getLogger(AlienCityAIO.class.getName()); private static String TABLENAME = "AlienCity"; private static String COLUMNNAME = "CityName"; JSONObject responseData = new JSONObject(); static String GET = "GET"; static String POST = "POST"; @Override @SuppressWarnings("unchecked") public void runner(HttpServletRequest request, HttpServletResponse response) throws Exception { try { ZCProject.initProject(); //Obtiene el endpoint y el método al que se realizó la llamada String url = request.getRequestURI(); String method = request.getMethod(); //La API GET que verifica la tabla en busca de un encuentro con alienígenas en esa ciudad if ((url.equals("/alien")) && method.equals(GET)) { String cityName = request.getParameter("city_name"); //Consulta la tabla de Catalyst Data Store y verifica si existe una fila para la ciudad dada int length = getAlienCountFromCatalystDataStore(cityName); if (length > 0) { responseData.put("message", "Uh oh! Looks like there are aliens in this city!"); responseData.put("signal", "positive"); } else { responseData.put("message", "Hurray! No alien encounters in this city yet!"); responseData.put("signal", "negative"); } } //La API POST que reporta el encuentro con alienígenas en una ciudad específica else if ((url.equals("/alien")) && method.equals(POST)) { //Obtiene el cuerpo de la solicitud y lo analiza ServletInputStream requestBody = request.getInputStream(); JSONParser jsonParser = new JSONParser(); JSONObject jsonObject = (JSONObject) jsonParser.parse(new InputStreamReader(requestBody, "UTF-8")); String cityName = (String) jsonObject.get("city_name"); //Consulta la tabla de Catalyst Data Store y verifica si existe una fila para la ciudad dada int length = getAlienCountFromCatalystDataStore(cityName); if (length > 0) { responseData.put("message", "Looks like you are not the first person to encounter aliens in this city! Someone has already reported an alien encounter here!"); } //Si la fila no existe, se inserta una nueva fila else { ZCRowObject row = ZCRowObject.getInstance(); row.set("CityName", cityName); ZCObject.getInstance().getTableInstance(TABLENAME).insertRow(row); responseData.put("message", "Thanks for reporting!"); } } else { //Las acciones se registran en los logs. Puedes verificar los logs desde Catalyst Logs. LOGGER.log(Level.SEVERE, "Error. Invalid Request"); responseData.put("error", "Request Endpoint not found"); response.setStatus(404); } //Envía la respuesta de vuelta al Client response.setContentType("application/json"); response.getWriter().write(responseData.toString()); response.setStatus(200); } catch (Exception e) { //Las acciones se registran en los logs. Puedes verificar los logs desde Catalyst Logs. LOGGER.log(Level.SEVERE, "Exception in AlienCityAIO", e); responseData.put("error", "Internal server error occurred. Please try again in some time."); response.getWriter().write(responseData.toString()); response.setStatus(500); } } /** * Verifica si ya se reportó un encuentro con alienígenas en la ciudad dada * consultando la tabla de Data Store * * @param {*} catalystApp * @param {*} cityName */ private int getAlienCountFromCatalystDataStore(String cityName) throws Exception { String query = "SELECT * FROM AlienCity WHERE CityName = '" + cityName + "'"; //Obtiene la instancia de ZCQL y ejecuta la consulta usando la cadena de consulta ArrayList rowList = ZCQL.getInstance().executeQuery(query); return rowList.size(); } } ``` El directorio de funciones está ahora configurado. Discutiremos la arquitectura de la función y del cliente en la siguiente sección.