Enviando SMS via API da Alibaba Cloud em Java

Este guia demonstra como enviar mensagnes SMS usando a API da Alibaba Cloud em uma aplicação Java. A implementação utiliza o Spring MVC para criar um controlaodr e uma classe utilitária para requisições HTTP.

Primeiro, é necessário configurar um controlador Spring. O exemplo abaixo cria um endpoint que aciona o envio de um SMS. As configurações do host, caminho e método são definidas, e o cabeçalho de autorização é construído usando um código de aplicativo exclusivo.

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;

@RestController
@RequestMapping("/api/sms")
public class SmsController {

    private static final String API_HOST = "http://yzx.market.alicloudapi.com";
    private static final String ENDPOINT_PATH = "/yzx/sendSms";
    private static final String APP_CODE = "SEU_CODIGO_APP_AQUI";

    @GetMapping("/enviar")
    public String enviarSms() {
        String urlBase = API_HOST;
        String recurso = ENDPOINT_PATH;
        String operacao = "POST";

        Map<String, String> cabecalho = new HashMap<>();
        cabecalho.put("Authorization", "APPCODE " + APP_CODE);

        Map<String, String> parametrosConsulta = new HashMap<>();
        parametrosConsulta.put("mobile", "NUMERO_DESTINO");
        parametrosConsulta.put("tpl_id", "ID_TEMPLATE_SMS");

        Map<String, String> corpo = new HashMap<>();

        try {
            HttpResponse resposta = ClienteHttp.enviarPost(urlBase, recurso, operacao, cabecalho, parametrosConsulta, corpo);
            return "Resposta: " + resposta.getStatusLine().toString();
        } catch (Exception e) {
            e.printStackTrace();
            return "Erro ao enviar SMS: " + e.getMessage();
        }
    }
}

A classe utilitária abaixo abstrai as operações HTTP. Ela fornece métodos para diferentes verbos (GET, POST, PUT, DELETE) e inclui tratamento para conexões SSL.

import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.*;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.NameValuePair;
import java.security.SecureRandom;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.net.ssl.*;

public class ClienteHttp {

    public static HttpResponse enviarPost(String host, String path, String method,
                                          Map<String, String> headers,
                                          Map<String, String> queryParams,
                                          Map<String, String> bodyParams) throws Exception {
        
        HttpClient client = inicializarCliente(host);
        String urlCompleta = montarUrl(host, path, queryParams);
        HttpPost requisicao = new HttpPost(urlCompleta);
        
        adicionarCabecalhos(requisicao, headers);
        
        if (bodyParams != null && !bodyParams.isEmpty()) {
            List<NameValuePair> paresNomeValor = new ArrayList<>();
            for (Map.Entry<String, String> entrada : bodyParams.entrySet()) {
                paresNomeValor.add(new BasicNameValuePair(entrada.getKey(), entrada.getValue()));
            }
            UrlEncodedFormEntity entidade = new UrlEncodedFormEntity(paresNomeValor, "UTF-8");
            requisicao.setEntity(entidade);
        }
        
        return client.execute(requisicao);
    }

    private static String montarUrl(String host, String path, Map<String, String> queryParams) {
        StringBuilder urlBuilder = new StringBuilder(host);
        if (path != null && !path.isEmpty()) {
            urlBuilder.append(path);
        }
        if (queryParams != null && !queryParams.isEmpty()) {
            StringBuilder queryString = new StringBuilder();
            for (Map.Entry<String, String> param : queryParams.entrySet()) {
                if (queryString.length() > 0) {
                    queryString.append("&");
                }
                queryString.append(param.getKey()).append("=").append(param.getValue());
            }
            if (queryString.length() > 0) {
                urlBuilder.append("?").append(queryString);
            }
        }
        return urlBuilder.toString();
    }

    private static void adicionarCabecalhos(HttpRequestBase requisicao, Map<String, String> headers) {
        for (Map.Entry<String, String> entrada : headers.entrySet()) {
            requisicao.setHeader(entrada.getKey(), entrada.getValue());
        }
    }

    private static HttpClient inicializarCliente(String host) {
        HttpClient httpClient = new DefaultHttpClient();
        if (host.startsWith("https://")) {
            try {
                SSLContext sslContext = SSLContext.getInstance("TLS");
                sslContext.init(null, new TrustManager[]{new X509TrustManager() {
                    public X509Certificate[] getAcceptedIssuers() { return null; }
                    public void checkClientTrusted(X509Certificate[] certs, String authType) {}
                    public void checkServerTrusted(X509Certificate[] certs, String authType) {}
                }}, new SecureRandom());
                
                SSLSocketFactory sslFactory = new SSLSocketFactory(sslContext, SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
                httpClient.getConnectionManager().getSchemeRegistry().register(new org.apache.http.conn.scheme.Scheme("https", 443, sslFactory));
            } catch (Exception e) {
                throw new RuntimeException("Falha ao configurar SSL", e);
            }
        }
        return httpClient;
    }
}

As dependências Maven necessárias para o projeto são especificadas abaixo. Elas incluem as bibliotecas Apache HttpClient para comunicação HTTP, o Spring Web para a estrutura do controlador e o commons-lang para utilidades.

<dependencies>
    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
        <version>4.5.13</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>5.3.10</version>
    </dependency>
    <dependency>
        <groupId>commons-lang</groupId>
        <artifactId>commons-lang</artifactId>
        <version>2.6</version>
    </dependency>
</dependencies>

Tags: Alibaba Cloud SMS API Spring MVC Apache HttpClient java Requisições HTTP

Publicado em 7-1 06:30