https://a.storyblok.com/f/270183/1368x665/0aadfbb145/sms-web-java_24.png

Cree un servicio web de SMS con Java

Publicado el July 8, 2021

Tiempo de lectura: 6 minutos

Hemos construido este ejemplo utilizando JDK 11, Gradle 7.1, Gretty 3.0.5, y el SDK de Vonage Server para Java v.6.4.0

La SMS API de Vonage es un servicio que te permite enviar y recibir mensajes SMS en cualquier parte del mundo. Vonage proporciona API REST, pero es mucho más fácil usar el Java SDK que hemos escrito para ti.

Ya ha aprendido a enviar mensajes SMS con Java. ¡En este tutorial, vamos a dar un paso más y construir un servicio Web alrededor de él!

Ver el código fuente en GitHub.

Requisitos previos

Antes de empezar, hay algunas cosas que necesitarás tener instaladas en tu máquina de desarrollo:

Vonage API Account

To complete this tutorial, you will need a Vonage API account. If you don’t have one already, you can sign up today and start building with free credit. Once you have an account, you can find your API Key and API Secret at the top of the Vonage API Dashboard.

This tutorial also uses a virtual phone number. To purchase one, go to Numbers > Buy Numbers and search for one that meets your needs.

Crear el proyecto

En primer lugar, debes configurar tu proyecto Gradle y descargar el SDK Java de Vonage.

Crea un directorio que contenga tu proyecto. Dentro de este directorio, ejecute gradle init.

mkdir sms-webservice cd sms-webservice

Crea un nuevo proyecto Gradle:

  1. Ejecute gradle init --type=java-application comando

  2. Seleccione Groovy como lenguaje de script

  3. Seleccione JUnit Jupiter como marco de pruebas

  4. Dejar por defecto Project name

  5. Dejar por defecto Source package

Instala el SDK Java de Vonage

A continuación, abra el archivo build.gradle y añada lo siguiente al bloque de dependencias:

// Install the Vonage Java SDK
implementation 'com.vonage:client:6.4.0'

Ahora, si abres tu consola en el directorio que contiene este archivo build.gradle puedes ejecutar

gradle build

Este comando descargará el Java SDK de Vonage y lo almacenará para más tarde. Si tuvieras código fuente, también lo compilaría, pero aún no lo has escrito. ¡Vamos a arreglar eso!

Crear un servicio web para enviar SMS

Vamos a construir un pequeño servicio HTTP y luego probarlo con Postman. Afortunadamente, Gradle hace que esto sea relativamente fácil.

En primer lugar, aplique el plugin Gretty a build.gradle añadiendo lo siguiente al bloque plugins bloque:

id 'war'
id 'org.gretty' version '3.0.5'

La primera línea le dice a Gradle que debe construir un archivo war, usando los archivos fuente en src/main/java y src/main/webapp. La segunda línea añade la posibilidad de iniciar tu aplicación web directamente desde Gradle utilizando el contenedor de servlets Jetty.

A continuación, vamos a establecer la ruta de contexto a / para simplificar.

Añada el siguiente bloque a build.gradle:

gretty {
    contextPath = '/'
}

Ejecute gradle appRun (tenga en cuenta que se utiliza appRun y no run para ejecutar el servidor web). Tardará un poco la primera vez mientras descarga algunas dependencias.

Al final, debería ver algo como esto:

15:45:43 INFO Jetty 9.4.24.v20191120 started and listening on port 8080 15:45:43 INFO send-sms runs at: 15:45:43 INFO http://localhost:8080/send-sms Task :appRun Press any key to stop the server. <===========--> 87% EXECUTING [13s] :appRun

Jetty está ahora ejecutando tu servicio web (vacío). Abre la URL que ves para comprobar que se está ejecutando correctamente. Debería parecerse un poco a esto:

Empty web pageEmpty web page

¡Ahora vamos a escribir un servlet! Crea un archivo llamado src/main/java/sms/webservice/SendSMSServlet.java.

package sms.webservice;

import com.vonage.client.VonageClient;
import com.vonage.client.VonageClientException;
import com.vonage.client.sms.MessageStatus;
import com.vonage.client.sms.SmsSubmissionResponse;
import com.vonage.client.sms.messages.TextMessage;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServlet;

public class SendSMSServlet extends HttpServlet {
    private String VONAGE_BRAND_NAME;
    private VonageClient client;

    public void init(ServletConfig config) {
        // Load configuration from the servlet container:
        VONAGE_BRAND_NAME = config.getInitParameter("from_number");
        String api_key = config.getInitParameter("api_key");
        String api_secret = config.getInitParameter("api_secret");

        client = VonageClient.builder().apiKey(api_key).apiSecret(api_secret).build();
    }

    protected void doPost(HttpServletRequest req,
                          HttpServletResponse resp)
            throws ServletException,
            java.io.IOException {
        try {
            // Extract form parameters from the request:
            String to_number = req.getParameter("to");
            String message = req.getParameter("message");

            TextMessage sms = new TextMessage(VONAGE_BRAND_NAME,
                    to_number,
                    message
            );

            SmsSubmissionResponse response = client.getSmsClient().submitMessage(sms);

            if (response.getMessages().get(0).getStatus() == MessageStatus.OK) {
                System.out.println("Message sent successfully.");

                resp.getWriter().println(response.getMessages().get(0));
            } else {
                System.out.println("Message failed with error: " + response.getMessages().get(0).getErrorText());
            }

        } catch (VonageClientException nce) {
            throw new ServletException(nce);
        }
    }
}

Y luego tenemos que configurar el servlet en nuestro contenedor de servlets mediante la creación de la siguiente en src/main/webapp/WEB-INF/web.xml:

<web-app>
    <servlet>
        <servlet-name>send-sms</servlet-name>
        <servlet-class>sms.webservice.SendSMSServlet</servlet-class>
        <init-param>
            <param-name>from_number</param-name>
            <param-value>VONAGE_BRAND_NAME</param-value>
        </init-param>
        <init-param>
            <param-name>api_key</param-name>
            <param-value>VONAGE_API_KEY</param-value>
        </init-param>
        <init-param>
            <param-name>api_secret</param-name>
            <param-value>VONAGE_API_SECRET</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>send-sms</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
</web-app>

Rellenar VONAGE_API_KEY y VONAGE_API_SECRET con los valores que se encuentran en tu Panel de API de Vonage. Deberás reemplazar VONAGE_BRAND_NAME por uno de tus números virtuales.

Nota: En algunos países (EE. UU.), VONAGE_BRAND_NAME tiene que ser uno de tus números virtuales de Vonage. En otros países (Reino Unido), puedes elegir un valor de cadena alfanumérica, por ejemplo, el nombre de tu marca, como AcmeInc. Lee sobre las funciones de SMS específicas de cada país en el portal dev.

A continuación, ejecute gradle appRun. Si todo se compila correctamente, iniciemos Postman y hagamos una petición POST a http://localhost:8080/send-sms/especificando message y to en el cuerpo como se muestra a continuación:

Making a request with PostmanMaking a request with Postman

Espero que haya funcionado. Ya has creado un servicio web REST para enviar mensajes SMS. En realidad, hay muchas más cosas que querrías hacer antes de implementar esto. Podrías considerar agregar autenticación (de lo contrario, ¡cualquiera podría enviar un mensaje usando tu cuenta API de Vonage!), un buen formulario web para publicar en el servicio y mejorar el manejo de errores, ¡pero este es un buen comienzo!

Referencias

Compartir:

https://a.storyblok.com/f/270183/372x373/36054b72d0/julia-biro.png
Julia BiroDefensor del Desarrollador

Julia está comprometida con la capacitación de los desarrolladores mediante la creación de tutoriales, guías y recursos prácticos. Con experiencia en divulgación y educación, su objetivo es hacer que la tecnología sea más accesible y mejorar la experiencia general de los desarrolladores. A menudo se la puede encontrar en eventos de la comunidad local.