在Java中,我尝试使用以下代码将AWS SNS消息发布到特定的ARN端点:
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.regions.Region;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.sns.AmazonSNS;
import com.amazonaws.services.sns.AmazonSNSClient;
import com.amazonaws.services.sns.model.PublishRequest;
import com.amazonaws.services.sns.model.PublishResult;
...
AmazonSNS snsClient = new AmazonSNSClient(new BasicAWSCredentials(System.getenv("AWS_KEY"), System.getenv("AWS_SECRET")));
snsClient.setRegion(Region.getRegion(Regions.US_EAST_1));
String message = "{\"APNS_SANDBOX\":\"{\\\"aps\\\":{\\\"type\\\":\\\"XXX\\\",\\\"email\\\":\\\"XXX@gmail.com\\\",\\\"alert\\\":\\\"some alert\\\"}}\"}";
PublishResult pr = snsClient.publish(new PublishRequest("arn:aws:sns:us-east-1:XXX:endpoint/APNS_SANDBOX/XXX/XXX-XXX-XXX-XXX", message));
我一直收到以下错误消息:
Invalid parameter: Topic Name (Service: AmazonSNS; Status Code: 400; Error Code: InvalidParameter; Request ID: XXX
对此有何想法?
我可以在没有SNS控制台问题的情况下发布到ARN端点,我尝试了不同的消息变体
答案 0 :(得分:2)
您应该使用TargetArn
而不是TopicArn
,这是PublishRequest
构造函数的第一个参数。
PublishRequest pr = new PublishRequest();
pr.TargetArn = "arn:aws:sns:us-east-1:XXX:endpoint/APNS_SANDBOX/XXX/XXX-XXX-XXX-XXX";
pr.Message = message;
(或许回答大声笑太晚了)
答案 1 :(得分:2)
错误消息有点令人困惑。如果您提供了错误的主题ARN,也会收到错误消息,提示Invalid Parameter: Topic Name
。
从您发布的内容来看,您似乎已使用了订阅ARN,而不是主题ARN。主题ARN格式类似于arn:aws:sns:AWS_REGION:AWS_ACCOUNT_NUMBER:TOPIC_NAME
。
答案 2 :(得分:1)
您的问题是: 字符串消息=“ {” APNS_SANDBOX“:” {\“ aps \”:{\“ type \”:\“ XXX \”,\“电子邮件\”:\“ XXX@gmail.com \”,\“警报\ “:\”某些警报\“}}”}“;
它应该是: 字符串消息=“ {” APNS_SANDBOX“:” {\“ aps \”:{\“ type \”:\“ XXX \”,\“电子邮件\”:\“ XXX@gmail.com \”,\“警报\ “:\” somealert \“}}”}“;
您不能在主题名称中添加空格。因此,“某些警报”将被拒绝。 “ somealert”将被接受。
万一有人偶然发现了这个问题。