amazon中sns的使用

  |  

使用网页配置订阅

  1. 创建主题>使用标准>自定义名称>其他默认 点击创建即可
  2. 创建订阅

请添加图片描述

  1. 订阅策略配置(不配置,会推送给多个人,除非你每个都创建主题)

请添加图片描述

注意: 可以你可以随便写,后面的值只能是对象,不然会报错

  1. 创建好订阅,会给你配置的链接推送请求(post 请求,text/plain 格式)

body 参数如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
Type: 'SubscriptionConfirmation',
MessageId: 'e67f028f-3392-4f8e-871e-d5f6c1de7256',
Token:
'***',
TopicArn: 'arn:aws:sns:us-west-1:180656209983:klover-test-topic',
Message:
'***',
SubscribeURL:
'https://sns.us-west-1.amazonaws.com/?***',
SignatureVersion: '1',
Signature:
'***',
SigningCertURL: '***',
};
  1. 确认订阅
    (1)使用浏览器直接访问 SubscribeURL(第四步返回的 url)
    (2)使用页面订阅 在下面输入框输入 SubscribeURL(第四步返回的 url)

请添加图片描述

  1. 如果没有接收到确认订阅 可以选择再次发送

请添加图片描述

安装 java jar 包

1
2
3
4
5
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>sns</artifactId>
<version>2.16.60</version>
</dependency>

使用

1
2
3
4
5
// 推送
String message = "{\"test\":1,\"name\":\"klover\"}";
Sns.pubTopic(message);
// 使用代码订阅
Sns.subscribe("https://www.xxx.cn/api", "https");

工具类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
package com.klover.sns;

import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.sns.SnsClient;
import software.amazon.awssdk.services.sns.model.*;

import java.util.HashMap;
import java.util.Map;

/**
* Sns
* <a href="https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/sns/src/main/java/com/example/sns/PublishTopic.java">sns 代码</a>
*
* @author klover
* @date 2024/3/28 15:05
*/
public class Sns {
private static final SnsClient snsClient;

private static final String accessKeyId = "<your access key id>";

private static final String secretAccessKey = "<your secret access key>";

private static final String topicArn = "<your topic ARN>";

static {
AwsBasicCredentials credentials = AwsBasicCredentials.create(
accessKeyId,
secretAccessKey
);
snsClient = SnsClient.builder()
.region(Region.US_WEST_1)
.credentialsProvider(() -> credentials)
.build();
}

/**
* 推送消息
*
* @param message
*/
public static void pubTopic(String message) {
try {
// 通过筛选策略 指定推送者
Map<String, MessageAttributeValue> map = new HashMap<>();
map.put("clientId", MessageAttributeValue.builder().dataType("String").stringValue("123456").build());

PublishRequest request = PublishRequest.builder()
.message(message)
.topicArn(topicArn)
.messageAttributes(map)
.build();

PublishResponse result = snsClient.publish(request);
System.out.println(result.messageId() + " Message sent. Status is " + result.sdkHttpResponse().statusCode());
} catch (SnsException e) {
System.out.println(e.awsErrorDetails().errorMessage());
}
}

/**
* 订阅
*
* @param url
* @param protocol http https
*/
public static void subscribe(String url, String protocol) {
try {
SubscribeRequest request = SubscribeRequest.builder()
.protocol(protocol)
.endpoint(url)
.returnSubscriptionArn(true)
.topicArn(topicArn)
.build();

SubscribeResponse result = snsClient.subscribe(request);
System.out.println("Subscription ARN is " + result.subscriptionArn() + "\n\n Status is "
+ result.sdkHttpResponse().statusCode());

// 设置筛选策略
SetSubscriptionAttributesRequest subscriptionAttributesRequest = SetSubscriptionAttributesRequest
.builder()
.subscriptionArn(result.subscriptionArn())
.attributeName("FilterPolicy") // 这个名称不能动
.attributeValue("{\"clientId\": [\"123457\"]}") // 底层要求 必须是对象 这个字段可以自己自定义
.build();
SetSubscriptionAttributesResponse setSubscriptionAttributesResponse = snsClient.setSubscriptionAttributes(subscriptionAttributesRequest);
System.out.println(setSubscriptionAttributesResponse.sdkHttpResponse().statusCode());
} catch (SnsException e) {
System.out.println(e.awsErrorDetails().errorMessage());
}
}

/**
* 取消订阅
*
*/
public static void unsubscribe(String subscriptionArn) {
try {
UnsubscribeRequest request = UnsubscribeRequest.builder()
.subscriptionArn(subscriptionArn)
.build();

UnsubscribeResponse result = snsClient.unsubscribe(request);
System.out.println("\n\nStatus was " + result.sdkHttpResponse().statusCode()
+ "\n\nSubscription was removed for " + request.subscriptionArn());

} catch (SnsException e) {
System.err.println(e.awsErrorDetails().errorMessage());
System.exit(1);
}
}
}

代码示例

文章目录
  1. 1. 使用网页配置订阅
  2. 2. 安装 java jar 包
  3. 3. 使用
  4. 4. 工具类