概述

阿里云消息服务(Message Service)是一种高效、可靠、安全、便捷、可弹性扩展的分布式消息服务。MNS能够帮助应用开发者在他们应用的分布式组件上自由的传递数据、通知消息,构建松耦合系统。本文主要介绍基于Java 语言实现Queue的创建、删除以及消息的发送及接受的Rest API操作。

签名验证工具

如果在使用过程中因为签名问题一直无法通过,建议直接使用签名验证工具进行快速的测试验证。

Code Sample

创建队列
import org.apache.commons.codec.binary.Base64;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.apache.http.entity.StringEntity;import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.io.UnsupportedEncodingException;
import java.math.BigInteger;
import java.net.URI;
import java.security.InvalidKeyException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;public class CreateMNSQueue {public static void main(String[] args) {//参数设置String AccessKeySecret = "********";//Access Key SecretString AccessKeyId = "********";//AccessKey IDString AccountId = "********";//Account ID//获取GMT英文格式时间Date d=new Date();DateFormat format=new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z",Locale.ENGLISH);//英文格式的时间转换时需要带上Locale.ENGLISH,否则会转换失败,因为它默认的是本地化的设置,除非你的操作系统是英文的,总之时间转换时需要时间格式与模式保持一致。format.setTimeZone(TimeZone.getTimeZone("GMT"));String date = format.format(d);String body = "<?xml version=\"1.0\" encoding=\"UTF-8\"  ?>\n" +"    <Queue xmlns=\"http://mns.aliyuncs.com/doc/v1/\">\n" +"    <VisibilityTimeout >60</VisibilityTimeout>\n" +"    <MaximumMessageSize>1024</MaximumMessageSize>\n" +"    <MessageRetentionPeriod>120</MessageRetentionPeriod>\n" +"    <DelaySeconds>0</DelaySeconds>\n" +"    </Queue>";//构造签名StringString SignString = "PUT\n" +"\n"+"application/xml"+"\n"+date + "\n"+"x-mns-version:2015-06-06" +"\n"+"/queues/TestQueue123";String sign = encode(AccessKeySecret,SignString);String Authorization = "MNS " + AccessKeyId + ":" + sign;HttpClient httpclient = HttpClients.createDefault();try{URIBuilder builder = new URIBuilder("http://" + AccountId + ".mns.cn-hangzhou.aliyuncs.com/queues/TestQueue123");//在杭州区域URI uri = builder.build();HttpPut request = new HttpPut(uri);request.setHeader("Authorization", Authorization);request.setHeader("Date", date);request.setHeader("Host", AccountId + ".mns.cn-hangzhou.aliyuncs.com");request.setHeader("Content-Type","application/xml");request.setHeader("x-mns-version","2015-06-06");// Request bodyStringEntity reqEntity = new StringEntity(body,"UTF-8");request.setEntity(reqEntity);HttpResponse response = httpclient.execute(request);HttpEntity entity = response.getEntity();if (entity != null){System.out.println(EntityUtils.toString(entity));}}catch (Exception e){System.out.println("error");System.out.println(e.getMessage());}}//写一个md5加密的方法public static String md5(String plainText) {//定义一个字节数组byte[] secretBytes = null;try {// 生成一个MD5加密计算摘要MessageDigest md = MessageDigest.getInstance("MD5");//对字符串进行加密md.update(plainText.getBytes());//获得加密后的数据secretBytes = md.digest();} catch (NoSuchAlgorithmException e) {throw new RuntimeException("没有md5这个算法!");}//将加密后的数据转换为16进制数字String md5code = new BigInteger(1, secretBytes).toString(16);// 16进制数字// 如果生成数字未满32位,需要前面补0for (int i = 0; i < 32 - md5code.length(); i++) {md5code = "0" + md5code;}return md5code;}//计算签名public static String encode(String accessKey, String data) {try {byte[] keyBytes = accessKey.getBytes("UTF-8");byte[] dataBytes = data.getBytes("UTF-8");Mac mac = Mac.getInstance("HmacSHA1");mac.init(new SecretKeySpec(keyBytes, "HmacSHA1"));return new String(Base64.encodeBase64(mac.doFinal(dataBytes)));} catch (UnsupportedEncodingException var5) {throw new RuntimeException("Not supported encoding method UTF-8", var5);} catch (NoSuchAlgorithmException var6) {throw new RuntimeException("Not supported signature method hmac-sha1", var6);} catch (InvalidKeyException var7) {throw new RuntimeException("Failed to calculate the signature", var7);}}
}
删除队列
import org.apache.commons.codec.binary.Base64;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpDelete;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.io.UnsupportedEncodingException;
import java.math.BigInteger;
import java.net.URI;
import java.security.InvalidKeyException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;public class DeleteMNSQueue {public static void main(String[] args) {//参数设置String AccessKeySecret = "********";//Access Key SecretString AccessKeyId = "********";//AccessKey IDString AccountId = "********";//获取GMT英文格式时间Date d=new Date();DateFormat format=new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z",Locale.ENGLISH);//英文格式的时间转换时需要带上Locale.ENGLISH,否则会转换失败,因为它默认的是本地化的设置,除非你的操作系统是英文的,总之时间转换时需要时间格式与模式保持一致。format.setTimeZone(TimeZone.getTimeZone("GMT"));String date = format.format(d);//构造签名StringString SignString = "DELETE\n" +"\n"+"\n"+date + "\n"+"x-mns-version:2015-06-06" +"\n"+"/queues/TestQueue123";String sign = encode(AccessKeySecret,SignString);String Authorization = "MNS " + AccessKeyId + ":" + sign;HttpClient httpclient = HttpClients.createDefault();try{URIBuilder builder = new URIBuilder("http://" + AccountId + ".mns.cn-hangzhou.aliyuncs.com/queues/TestQueue123");//在青岛区域创建ProjectURI uri = builder.build();HttpDelete request = new HttpDelete(uri);request.setHeader("Authorization", Authorization);request.setHeader("Date", date);request.setHeader("Host", AccountId + ".mns.cn-hangzhou.aliyuncs.com");request.setHeader("x-mns-version","2015-06-06");HttpResponse response = httpclient.execute(request);HttpEntity entity = response.getEntity();if (entity != null){System.out.println(EntityUtils.toString(entity));}}catch (Exception e){System.out.println("error");System.out.println(e.getMessage());}}//写一个md5加密的方法public static String md5(String plainText) {//定义一个字节数组byte[] secretBytes = null;try {// 生成一个MD5加密计算摘要MessageDigest md = MessageDigest.getInstance("MD5");//对字符串进行加密md.update(plainText.getBytes());//获得加密后的数据secretBytes = md.digest();} catch (NoSuchAlgorithmException e) {throw new RuntimeException("没有md5这个算法!");}//将加密后的数据转换为16进制数字String md5code = new BigInteger(1, secretBytes).toString(16);// 16进制数字// 如果生成数字未满32位,需要前面补0for (int i = 0; i < 32 - md5code.length(); i++) {md5code = "0" + md5code;}return md5code;}//计算签名public static String encode(String accessKey, String data) {try {byte[] keyBytes = accessKey.getBytes("UTF-8");byte[] dataBytes = data.getBytes("UTF-8");Mac mac = Mac.getInstance("HmacSHA1");mac.init(new SecretKeySpec(keyBytes, "HmacSHA1"));return new String(Base64.encodeBase64(mac.doFinal(dataBytes)));} catch (UnsupportedEncodingException var5) {throw new RuntimeException("Not supported encoding method UTF-8", var5);} catch (NoSuchAlgorithmException var6) {throw new RuntimeException("Not supported signature method hmac-sha1", var6);} catch (InvalidKeyException var7) {throw new RuntimeException("Failed to calculate the signature", var7);}}
}
发送消息
import org.apache.commons.codec.binary.Base64;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.io.UnsupportedEncodingException;
import java.math.BigInteger;
import java.net.URI;
import java.security.InvalidKeyException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;public class SendMessageToMNSQueue {public static void main(String[] args) {//参数设置String AccessKeySecret = "******";//Access Key SecretString AccessKeyId = "******";//AccessKey IDString AccountId = "********";//获取GMT英文格式时间Date d=new Date();DateFormat format=new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z",Locale.ENGLISH);//英文格式的时间转换时需要带上Locale.ENGLISH,否则会转换失败,因为它默认的是本地化的设置,除非你的操作系统是英文的,总之时间转换时需要时间格式与模式保持一致。format.setTimeZone(TimeZone.getTimeZone("GMT"));String date = format.format(d);//延迟消息String body = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +"    <Message xmlns=\"http://mns.aliyuncs.com/doc/v1/\">\n" +"        <MessageBody>The Test Message!</MessageBody>\n" +"        <DelaySeconds>0</DelaySeconds>\n" +"        <Priority>1</Priority>\n" +"    </Message>";//构造签名StringString SignString = "POST\n" +"\n"+"text/xml;charset=utf-8"+"\n"+date + "\n"+"x-mns-version:2015-06-06" +"\n"+"/queues/TestQueue123/messages";String sign = encode(AccessKeySecret,SignString);String Authorization = "MNS " + AccessKeyId + ":" + sign;HttpClient httpclient = HttpClients.createDefault();try{URIBuilder builder = new URIBuilder("http://" + AccountId + ".mns.cn-hangzhou.aliyuncs.com/queues/TestQueue123/messages");URI uri = builder.build();HttpPost request = new HttpPost(uri);request.setHeader("Authorization", Authorization);request.setHeader("Date", date);request.setHeader("Host", AccountId + ".mns.cn-hangzhou.aliyuncs.com");request.setHeader("Content-Type","text/xml;charset=utf-8");request.setHeader("x-mns-version","2015-06-06");// Request bodyStringEntity reqEntity = new StringEntity(body,"UTF-8");request.setEntity(reqEntity);HttpResponse response = httpclient.execute(request);HttpEntity entity = response.getEntity();if (entity != null){System.out.println(EntityUtils.toString(entity));}}catch (Exception e){System.out.println("error");System.out.println(e.getMessage());}}//写一个md5加密的方法public static String md5(String plainText) {//定义一个字节数组byte[] secretBytes = null;try {// 生成一个MD5加密计算摘要MessageDigest md = MessageDigest.getInstance("MD5");//对字符串进行加密md.update(plainText.getBytes());//获得加密后的数据secretBytes = md.digest();} catch (NoSuchAlgorithmException e) {throw new RuntimeException("没有md5这个算法!");}//将加密后的数据转换为16进制数字String md5code = new BigInteger(1, secretBytes).toString(16);// 16进制数字// 如果生成数字未满32位,需要前面补0for (int i = 0; i < 32 - md5code.length(); i++) {md5code = "0" + md5code;}return md5code;}//计算签名public static String encode(String accessKey, String data) {try {byte[] keyBytes = accessKey.getBytes("UTF-8");byte[] dataBytes = data.getBytes("UTF-8");Mac mac = Mac.getInstance("HmacSHA1");mac.init(new SecretKeySpec(keyBytes, "HmacSHA1"));return new String(Base64.encodeBase64(mac.doFinal(dataBytes)));} catch (UnsupportedEncodingException var5) {throw new RuntimeException("Not supported encoding method UTF-8", var5);} catch (NoSuchAlgorithmException var6) {throw new RuntimeException("Not supported signature method hmac-sha1", var6);} catch (InvalidKeyException var7) {throw new RuntimeException("Failed to calculate the signature", var7);}}
}
消费消息
import org.apache.commons.codec.binary.Base64;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.io.UnsupportedEncodingException;
import java.math.BigInteger;
import java.net.URI;
import java.security.InvalidKeyException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;public class GetMessageFromMNSQueue {public static void main(String[] args) {//参数设置String AccessKeySecret = "********";//Access Key SecretString AccessKeyId = "********";//AccessKey IDString AccountId = "********";//获取GMT英文格式时间Date d=new Date();DateFormat format=new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z",Locale.ENGLISH);//英文格式的时间转换时需要带上Locale.ENGLISH,否则会转换失败,因为它默认的是本地化的设置,除非你的操作系统是英文的,总之时间转换时需要时间格式与模式保持一致。format.setTimeZone(TimeZone.getTimeZone("GMT"));String date = format.format(d);//构造签名StringString SignString = "GET\n" +"\n"+"\n"+date + "\n"+"x-mns-version:2015-06-06" +"\n"+"/queues/TestQueue123/messages?waitseconds=30";String sign = encode(AccessKeySecret,SignString);String Authorization = "MNS " + AccessKeyId + ":" + sign;HttpClient httpclient = HttpClients.createDefault();try{URIBuilder builder = new URIBuilder("http://" + AccountId + ".mns.cn-hangzhou.aliyuncs.com/queues/TestQueue123/messages?waitseconds=30");URI uri = builder.build();HttpGet request = new HttpGet(uri);request.setHeader("Authorization", Authorization);request.setHeader("Date", date);request.setHeader("Host", AccountId + ".mns.cn-hangzhou.aliyuncs.com");request.setHeader("x-mns-version","2015-06-06");HttpResponse response = httpclient.execute(request);HttpEntity entity = response.getEntity();if (entity != null){System.out.println(EntityUtils.toString(entity));}}catch (Exception e){System.out.println("error");System.out.println(e.getMessage());}}//写一个md5加密的方法public static String md5(String plainText) {//定义一个字节数组byte[] secretBytes = null;try {// 生成一个MD5加密计算摘要MessageDigest md = MessageDigest.getInstance("MD5");//对字符串进行加密md.update(plainText.getBytes());//获得加密后的数据secretBytes = md.digest();} catch (NoSuchAlgorithmException e) {throw new RuntimeException("没有md5这个算法!");}//将加密后的数据转换为16进制数字String md5code = new BigInteger(1, secretBytes).toString(16);// 16进制数字// 如果生成数字未满32位,需要前面补0for (int i = 0; i < 32 - md5code.length(); i++) {md5code = "0" + md5code;}return md5code;}//计算签名public static String encode(String accessKey, String data) {try {byte[] keyBytes = accessKey.getBytes("UTF-8");byte[] dataBytes = data.getBytes("UTF-8");Mac mac = Mac.getInstance("HmacSHA1");mac.init(new SecretKeySpec(keyBytes, "HmacSHA1"));return new String(Base64.encodeBase64(mac.doFinal(dataBytes)));} catch (UnsupportedEncodingException var5) {throw new RuntimeException("Not supported encoding method UTF-8", var5);} catch (NoSuchAlgorithmException var6) {throw new RuntimeException("Not supported signature method hmac-sha1", var6);} catch (InvalidKeyException var7) {throw new RuntimeException("Failed to calculate the signature", var7);}}
}

更多参考

签名验证工具
RESTfulAPI概述

备注: 示例代码仅供快速测试使用,未做冗余处理。

阿里云MNS Queue Rest API操作示例相关推荐

  1. ML之API:国内外各大人工智能平台(百度云/华为云/阿里云/Face++等)及其API的简介、使用方法之详细攻略

    ML之API:国内外各大人工智能平台(百度云/华为云/阿里云/Face++等)及其API的简介.使用方法之详细攻略 目录 一.百度云api 1.api之CV 二.旷视科技(face++)api 1.a ...

  2. 使用阿里云短信服务API实现短信验证码以及短信服务通知

    使用阿里云短信服务API实现短信验证码以及短信服务通知 前言 一 .短信调用简要说明 二 .官方不带签名原生态测试demo 调用结果如下 三 .以上为不带模板和签名的API调用结果 下面加入签名和模板 ...

  3. 阿里云 MNS 切换为 自建 RabbitMQ

    介于阿里云的MNS收费超过预算,因此决定切换为自行搭建的RabbitMQ队列,费用能大幅度降低. 由于之前的代码很整齐规范,消息的发送和读取,与业务处理完全分开,因此切换起来毫不费力. 新增了几个公共 ...

  4. 使用阿里云短信验证码API发送短信验证码(配置,获取短信验证码,注册,登录,密码重置)

    获取阿里云短信验证码需要的配置信息. 如果是新用户,可以免费领取3个月,老用户的话就只能购买了,但是也不贵. 申请短信签名 申请短信模板 编写发送短信验证码的工具类 代码中我已经进行了详细的注释,也写 ...

  5. springboot整合阿里云oss上传的方法示例

    这篇文章主要介绍了springboot整合阿里云oss上传的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 OSS申请和 ...

  6. [施工中]Java阿里云服务器ECS建站操作不完全指北

    [施工中]Java阿里云服务器ECS建站操作不完全指北 ECS建站操作记录 前言 一 .Xshell6与Xftp6 1.1Xshell与Xftp的作用 1.2如何从官网下载xshell与xftp 1. ...

  7. 阿里云虚拟主机 mysql_阿里云虚拟主机数据库用户操作是怎样的

    阿里云虚拟主机数据库用户操作是怎样的,阿里云开启数据库. 对于大多数小型或初期项目来说,我们可能常用的做法是先将web.数据库全部安装在一起,后期根据需要来看是否将数据库单独迁移分离.传统物理服务器可 ...

  8. 阿里云ECS初始化及常用操作

    文章目录 阿里云ECS初始化及常用操作 初始化 SSH卡死问题 安装GUI(gnome) locale设置 配置VNC 调整默认端口 安装GUI(xfce) 配置VNC 调整默认端口 汉化部分 安装f ...

  9. 阿里云人脸比对API封装

    这是根据封装是根据阿里云官方给的Demo进行修改的,当时是因为编写微信小程序云函数需要使用到阿里云人脸比对接口,才对其进行封装的. 记录下来,方便下次使用. 复制下来可以直接使用. 用到的依赖如下,使 ...

最新文章

  1. 帮奶牛找对象?华为云AI黑科技大揭秘
  2. 106. Leetcode 122. 买卖股票的最佳时机 II (动态规划-股票交易)
  3. elasticsearch常见错误解决办法
  4. win7访问linux共享路径不存在,win7系统访问网络共享找不到网络路径如何解决
  5. P3731 二分图匹配必经边
  6. 关于中英数字混排的字符串分割问题(转)
  7. 预处理器sass_Sass — Web的预处理器装饰
  8. 服务器winsxs文件夹怎么清理工具,winsxs,教您winsxs文件夹清理方法
  9. 数据结构之串:KMP算法
  10. #include和#include的区别
  11. 仿支付宝手势密码解锁
  12. 阿里云配置免费ssl证书,apache配置
  13. 从Soul APP 看社交升级新玩法
  14. 青少年软件编程C++二级题库(11-20)
  15. oracle 安装service pack是什么,安装 service pack 和修补程序 | Microsoft Docs
  16. C/C++ Linux 出错处理函数(strerror 与 perror)
  17. 中学生学科学习能力测评
  18. 计算机专业大学综合实力排名2015,2015年世界计算机专业大学排行榜
  19. 大数据周会-本周学习内容总结06
  20. 【软件通信协议】2. 详细解析UDP通信协议(附广播 组播)

热门文章

  1. 产品推荐-监控网页内容变化的守夜人
  2. H5培训第一天基础知识总结
  3. 初入神经网络剪枝量化4(大白话)
  4. SpringBoot配置多数据源(MySQL+SQLServer)
  5. DaZeng:Axure实现vcg官网首页原型图
  6. 手机的IMEI、MEID、ICCID、UDID、IMSI
  7. 【04】Cockatrice界面构成
  8. Python解题 - CSDN周赛第25期 - 水池注水
  9. NLP下游任务理解以及模型结构改变(上)
  10. C语言:短整型数据的溢出.2021-02-10