无效参数:主题名称发布到AWS SNS arn端点时出错

时间:2016-06-20 23:27:09

标签: java amazon-web-services amazon-sns

在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端点,我尝试了不同的消息变体

3 个答案:

答案 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”将被接受。

万一有人偶然发现了这个问题。