1:业务背景

利用华为云发送短信邮箱等消息

2:华为云设置

依次设置主题,订阅(可为手机号码,邮箱地址),消息模板

消息模板变量可用{}格式,后台填充数据:

3:代码实践

3.1:获取token

官方文档:https://support.huaweicloud.com/api-iam/zh-cn_topic_0057845583.html

https://iam.cn-east-2.myhuaweicloud.com/v3/auth/tokens


填充账号密码,以及projectid

如何获取domain_name、project_name和project_id ?
https://support.huaweicloud.com/devg-sdk/zh-cn_topic_0070637164.html

HuaweiCloudUtil:

public static HttpResponse getToken(HuaweiCloudConfig config){String token = "";Gson gson = new Gson();TokenRequest request =  constructAuthRequest(config);String data  = gson.toJson(request);HttpResponse httpResponse = HttpReqUtil.postExecute(config.getAuthUrl(),data,null);httpResponse.setRequest(data);if(HttpResponse.RESPONSE_SUCCESS.equalsIgnoreCase(httpResponse.getResponseCode())){TokenResponse response = gson.fromJson(httpResponse.getResult(),TokenResponse.class);TokenConstant.expires_date = response.getToken().getExpires_at();Map<String,List<String>> headers = httpResponse.getHeader();for (String s : headers.keySet()) {if(TokenConstant.TOKEN_SUBJECT_KEY.equalsIgnoreCase(s)){token = headers.get(TokenConstant.TOKEN_SUBJECT_KEY).get(0);TokenConstant.TOKEN = token;break;}}}return httpResponse;
}

HttpReqUtil :

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.KeyManager;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import org.apache.commons.lang3.StringUtils;public class HttpReqUtil {private static int DEFAULT_CONN_TIME = 5000;private static int DEFAULT_READ_TIME = 5000;public static final String DEFAULT_CHARACTER_ENCODING = "UTF-8";public static final String GET_METHOD = "GET";public static final String POST_METHOD = "POST";public static HttpResponse postExecute(String url, String data,Map<String,String> header) {return defaultConnection(POST_METHOD, url, data,header);}/*** http request* @param method GET/POST* @param path  request url* @param data* @return*/private static HttpResponse defaultConnection(String method, String path, String data,Map<String,String> header){HttpResponse response = new HttpResponse();HttpURLConnection conn = null;try {URL url = new URL(path);if (url != null) {conn = getConnection(method, url,header);conn.setConnectTimeout(DEFAULT_CONN_TIME);conn.setReadTimeout(DEFAULT_READ_TIME);if (StringUtils.isNoneBlank(data)) {OutputStream output = conn.getOutputStream();output.write(data.getBytes(DEFAULT_CHARACTER_ENCODING));output.flush();}if (conn.getResponseCode() == HttpURLConnection.HTTP_OK || conn.getResponseCode() == HttpURLConnection.HTTP_CREATED) {response.setHeader(conn.getHeaderFields());InputStream input = conn.getInputStream();String result = IOUtil.inputStreamToString(input, DEFAULT_CHARACTER_ENCODING);response.setResult(result);}else{InputStream input = conn.getErrorStream();String error = IOUtil.inputStreamToString(input, DEFAULT_CHARACTER_ENCODING);response.setError(error);}response.setResponseCode(HttpResponse.RESPONSE_SUCCESS);}} catch (Exception e) {e.printStackTrace();response.setResponseCode(HttpResponse.RESPONSE_ERROR);response.setError(e.getMessage());}finally {if(conn!=null)conn.disconnect();}return response;}/*** getConnection*/private static HttpURLConnection getConnection(String method, URL url,Map<String,String> header) throws IOException {HttpURLConnection conn = null;if ("https".equals(url.getProtocol())) {SSLContext context = null;try {context = SSLContext.getInstance("SSL", "SunJSSE");context.init(new KeyManager[0], new TrustManager[] { new MyX509TrustManager() },new java.security.SecureRandom());} catch (Exception e) {throw new IOException(e);}HttpsURLConnection connHttps = (HttpsURLConnection) url.openConnection();connHttps.setSSLSocketFactory(context.getSocketFactory());connHttps.setHostnameVerifier(new HostnameVerifier() {@Overridepublic boolean verify(String arg0, SSLSession arg1) {return true;}});conn = connHttps;} else {conn = (HttpURLConnection) url.openConnection();}if(header!=null){for (String k : header.keySet()) {conn.setRequestProperty(k,header.get(k));}}conn.setRequestMethod(method);conn.setUseCaches(false);conn.setDoInput(true);conn.setDoOutput(true);return conn;}public static String setParmas(Map<String, String> map, String path, String charset) throws Exception {String result = "";boolean hasParams = false;if (path != null && !"".equals(path)) {if (!map.isEmpty()) {StringBuilder builder = new StringBuilder();Set<Entry<String, String>> params = map.entrySet();for (Entry<String, String> entry : params) {String key = entry.getKey().trim();String value = entry.getValue().trim();if (hasParams) {builder.append("&");} else {hasParams = true;}if (charset != null && !"".equals(charset)) {builder.append(key).append("=").append(IOUtil.urlEncode(value, charset));} else {builder.append(key).append("=").append(value);}}result = builder.toString();}}return doUrlPath(path, result).toString();}private static URL doUrlPath(String path, String query) throws Exception {URL url = new URL(path);if (StringUtils.isEmpty(path)) {return url;}if (StringUtils.isEmpty(url.getQuery())) {if (path.endsWith("?")) {path += query;} else {path = path + "?" + query;}} else {if (path.endsWith("&")) {path += query;} else {path = path + "&" + query;}}return new URL(path);}
}
public class MyX509TrustManager implements X509TrustManager {public void checkClientTrusted(X509Certificate[] chain, String authType)throws CertificateException {}public void checkServerTrusted(X509Certificate[] chain, String authType)throws CertificateException {}public X509Certificate[] getAcceptedIssuers() {return null;}
}

IOUtil :

public class IOUtil {/*** description:convert InputStream to string* @throws IOException*/public static String inputStreamToString(InputStream inputStream, String encoding) throws IOException {return IOUtils.toString(inputStream, encoding);}/*** description: convert string to InputStream* @throws IOException*/public static InputStream toInputStream(String inputStr, String encoding) throws IOException {if (StringUtils.isEmpty(inputStr)) {return null;}return IOUtils.toInputStream(inputStr, encoding);}/*** description: encode URL* @param source* @param encode* @return*/public static String urlEncode(String source, String encode) {String result = source;try {result = URLEncoder.encode(source, encode);} catch (UnsupportedEncodingException e) {e.printStackTrace();}return result;}public static byte[] inputStreamToByteArray(InputStream inputStream) throws IOException {return IOUtils.toByteArray(inputStream);}}

再次忽略 pojo等

3.2:发送消息

URI格式

POST /v2/{project_id}/notifications/topics/{topic_urn}/publish

https://support.huaweicloud.com/usermanual-smn/smn_ug_0021.html

public static HttpResponse sendMessage(HuaweiCloudConfig config,MessageRequest messageRequest){Date now  = new Date();if(StringUtils.isBlank(TokenConstant.TOKEN)||TokenConstant.expires_date==null||now.after(TokenConstant.expires_date)){HttpResponse tokenResponse = getToken(config);if(!HttpResponse.RESPONSE_SUCCESS.equalsIgnoreCase(tokenResponse.getResponseCode())){return  tokenResponse;}}Gson gson = new Gson();String data  = gson.toJson(messageRequest);Map<String,String> header = new HashMap<>();header.put(TokenConstant.TOKEN_AUTH_KEY,TokenConstant.TOKEN);HttpResponse httpResponse = HttpReqUtil.postExecute(config.getSmnUrl(),data,header);httpResponse.setRequest(data);return httpResponse;
}
@Data
public class MessageRequest {private String subject;private String message_template_name;private Map<String,Object> tags = new HashMap<>();}

华为云-- 消息通知服务(SMN)相关推荐

  1. 安防视频上云的趋势、痛点及华为云视频接入服务探索及实践

    随着视频资源与内容在互联网所占比重不断提升,相应的在视频资源利用水平以及不断提高的业务和产品需求之间的矛盾也会愈加突出.本文来自华为云视频接入服务产品经理齐彦昆在线上分享中的演讲,结合在视频接入服务的 ...

  2. 华为云OBS文件服务

    华为云OBS文件服务 准备工作 先获取OBS的SK,AK,终端节点.然后创建桶 将以上四个值存放在Nacos中 /*** 取值为所创建的桶名*/@Value("${obs.bucketNam ...

  3. 【线上分享】安防视频上云趋势、痛点,华为云视频接入服务探索及实践

    近年来,视频安防行业一直处于高速发展阶段,据预测,2021全国在视频安防领域新增摄像头数量在1.2亿台,已经全面进入大视频时代,视频资源在我国的安全.治理.交通.警务.城管.环保等领域发挥着越来越重要 ...

  4. 秒懂云通信:如何用阿里云语音通知服务(小白指南)

    简介: 手把手教你如何使用阿里云语音通知服务,超详细控制台步骤解析,快速上手!更有1650元短信体验代金券和免费试用,点击速抢:https://yqh.aliyun.com/live/cloudcom ...

  5. 云图说|华为云数据复制服务 打造不一样的用户权限迁移

    业界主流的云数据库迁移方案中,无法完全继承源数据库的权限体系. 要同时迁移几套数据库,账号繁多,密码又由不同人维护,来回沟通,费时费力效率低. 华为云数据复制服务DRS推出业内首家用户权限迁移功能,一 ...

  6. 华为云人脸识别服务 FRS 之初体验

    华为云人脸识别服务 FRS 之初体验 程序之美 前言 操作流程 所遇问题 结束语 程序之美 前言 人脸识别服务(Face Recognition Service,简称FRS),是基于人的脸部特征信息, ...

  7. 华为云对象存储服务OBS教你一招轻松解决存储难题

    身处于信息爆炸的时代,各种各样的数据琳琅满目,需要记录存储的资料和信息数不胜数,有时候个人都会感觉到存储空间不足,更何况是一些正处于发展阶段中小型企业?那对于存储的需求就更迫切了. 遇见这种问题,很多 ...

  8. 华为云容器镜像服务 SWR 加速镜像的拉取和推送

    文章目录 简介 使用华为云 SWR 步骤 获取长期有效登录指令 构建 docker 镜像并推送到华为云 案例: Oracle JDK 11.0.13 Image 附录 简介 华为云容器镜像服务(Sof ...

  9. 还在为网速烦恼?你可能没有使用华为云CDN加速服务

    如今的社会人们的生活节奏越来越快,相对应的对生活中网络速度的需求正在不断提高.不得不说,在当下这个时代,互联网对人们的生活有着高度融合,这也导致人们在生活中对网络提速的要求越来越严格.如浏览访问的加载 ...

  10. 华为云对象存储服务OBS,海量存储安全可靠,让云存储更加简单

    随着产业数字化转型大潮的到来,企业生产经营过程中产生的数据也越来越多,不管是大型企业还是小微企业对数据存储备份的要求也越来越高,有的企业选择自购硬件设备进行存储,一方面需要付出高昂的成本,另一方面如果 ...

最新文章

  1. 信息化管理系统,团队效能提升的潜在价值
  2. pytorch中load和load_state_dict区别
  3. Android中WIFI开发总结(一)
  4. golang fmt包Printf 格式化输出 简介
  5. 基于SAP Kyma的订单编排增强介绍
  6. 成人高考 计算机英语作文,2017年成人高考英语作文范文
  7. 阿里云技术天团空降 CSDN 独家在线峰会,揭秘核心竞争力
  8. ftp 查看不了图片_几个常见的ftp错误问题及解决办法
  9. Java 基础 10 个简单测试
  10. 计算机vb小游戏,用vb6.0做一个小游戏
  11. Win7以上系统通过Dbgview打印驱动日志
  12. 电子设计大赛-运算放大器
  13. JPEG文件编/解码详解
  14. 学习|全屏时钟|计时器APP横评
  15. SQL面试题:经典50例
  16. Erlang程序设计笔记---(第三节 Erlang的基本概念)
  17. Android之Hawk数据库
  18. 留数定理 含 数学物理方法(吴崇试 第三版)答案详解
  19. 人工智能基础部分7-高维空间的神经网络认识
  20. CocosCreator之KUOKUO分享-俄罗斯方块

热门文章

  1. AAAI2021知识图谱论文集
  2. 看完不会你揍我!!Pytorch利用文本数据建立自己的数据集- Dataset Dataloader详解 附案例
  3. ES6数组得扩展与对象的扩展
  4. vue项目实现高德地图截图
  5. 研发质量管理工作经验总结(五)----关于流程建设的思考
  6. 网易云解锁配置(windows)
  7. Java笔记 - 黑马程序员_06(Stream,字节流,字符流,对象流(序列化流),属性集(Properties))
  8. 如何用计算机将分栏的文章合并,在Word文档中给文章段落分栏的方法
  9. 互联网监控直播-LiveGBS分发出RTMP、HLS、FLV、RTSP视频流说明介绍
  10. 自我职业生涯规划的三步走