阿里云MNS Queue Rest API操作示例

2023-10-21 05:40

本文主要是介绍阿里云MNS Queue Rest API操作示例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

概述

阿里云消息服务(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操作示例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/252315

相关文章

Python调用Orator ORM进行数据库操作

《Python调用OratorORM进行数据库操作》OratorORM是一个功能丰富且灵活的PythonORM库,旨在简化数据库操作,它支持多种数据库并提供了简洁且直观的API,下面我们就... 目录Orator ORM 主要特点安装使用示例总结Orator ORM 是一个功能丰富且灵活的 python O

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

python使用fastapi实现多语言国际化的操作指南

《python使用fastapi实现多语言国际化的操作指南》本文介绍了使用Python和FastAPI实现多语言国际化的操作指南,包括多语言架构技术栈、翻译管理、前端本地化、语言切换机制以及常见陷阱和... 目录多语言国际化实现指南项目多语言架构技术栈目录结构翻译工作流1. 翻译数据存储2. 翻译生成脚本

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

在 Spring Boot 中使用 @Autowired和 @Bean注解的示例详解

《在SpringBoot中使用@Autowired和@Bean注解的示例详解》本文通过一个示例演示了如何在SpringBoot中使用@Autowired和@Bean注解进行依赖注入和Bean... 目录在 Spring Boot 中使用 @Autowired 和 @Bean 注解示例背景1. 定义 Stud

oracle DBMS_SQL.PARSE的使用方法和示例

《oracleDBMS_SQL.PARSE的使用方法和示例》DBMS_SQL是Oracle数据库中的一个强大包,用于动态构建和执行SQL语句,DBMS_SQL.PARSE过程解析SQL语句或PL/S... 目录语法示例注意事项DBMS_SQL 是 oracle 数据库中的一个强大包,它允许动态地构建和执行

0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型的操作流程

《0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeekR1模型的操作流程》DeepSeekR1模型凭借其强大的自然语言处理能力,在未来具有广阔的应用前景,有望在多个领域发... 目录0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型,3步搞定一个应

Python中顺序结构和循环结构示例代码

《Python中顺序结构和循环结构示例代码》:本文主要介绍Python中的条件语句和循环语句,条件语句用于根据条件执行不同的代码块,循环语句用于重复执行一段代码,文章还详细说明了range函数的使... 目录一、条件语句(1)条件语句的定义(2)条件语句的语法(a)单分支 if(b)双分支 if-else(

Deepseek R1模型本地化部署+API接口调用详细教程(释放AI生产力)

《DeepseekR1模型本地化部署+API接口调用详细教程(释放AI生产力)》本文介绍了本地部署DeepSeekR1模型和通过API调用将其集成到VSCode中的过程,作者详细步骤展示了如何下载和... 目录前言一、deepseek R1模型与chatGPT o1系列模型对比二、本地部署步骤1.安装oll

浅析如何使用Swagger生成带权限控制的API文档

《浅析如何使用Swagger生成带权限控制的API文档》当涉及到权限控制时,如何生成既安全又详细的API文档就成了一个关键问题,所以这篇文章小编就来和大家好好聊聊如何用Swagger来生成带有... 目录准备工作配置 Swagger权限控制给 API 加上权限注解查看文档注意事项在咱们的开发工作里,API