Я использую Amazon AWS Ruby SDK для Amazon SNS, но у меня возникают проблемы с уже зарегистрированными устройствами. Иногда, когда устройство регистрируется снова, я получаю сообщение об ошибке типа AWS::SNS::Errors::InvalidParameter Invalid parameter: Token Reason: Endpoint arn:aws:sns:us-east-1:**** already exists with the same Token, but different attributes.
. Как проверить, существует ли уже конечная точка и, что более важно, как получить конечную точку для данного токена?
Как проверить, зарегистрировано ли уже мобильное устройство
comment
У меня такая же проблема с SNS для node.js. Вы нашли какие-то решения для этого?
- person Michal Kuklis   schedule 24.10.2013
comment
Я использую библиотеку .net и не получаю сообщения об ошибке, когда пытаюсь зарегистрировать ее снова.
- person Filippo Vitale   schedule 24.10.2013
comment
Вы получаете ошибку только тогда, когда хотите сохранить дополнительные атрибуты, связанные с регистрацией, а затем позже вызываете регистрацию с другим набором атрибутов.
- person Michal Kuklis   schedule 25.10.2013
comment
Я боюсь, что мое решение состоит в том, чтобы использовать регулярное выражение для извлечения его из сообщения об ошибке... Кажется, нет способа проверить, существует ли уже устройство.
- person BvdBijl   schedule 30.10.2013
Ответы (3)
Отдайте должное идее BvdBijl, я сделал метод расширения, чтобы удалить существующий, если он найден, а затем добавить его.
using System;
using System.Text.RegularExpressions;
using Amazon.SimpleNotificationService;
using Amazon.SimpleNotificationService.Model;
namespace Amazon.SimpleNotificationService
{
public static class AmazonSimpleNotificationServiceClientExtensions
{
private const string existingEndpointRegexString = "Reason: Endpoint (.+) already exists with the same Token";
private static Regex existingEndpointRegex = new Regex(existingEndpointRegexString);
public static CreatePlatformEndpointResponse CreatePlatformEndpointIdempotent(
this AmazonSimpleNotificationServiceClient client,
CreatePlatformEndpointRequest request)
{
try
{
var result = client.CreatePlatformEndpoint(request);
return result;
}
catch (AmazonSimpleNotificationServiceException e)
{
if (e.ErrorCode == "InvalidParameter")
{
var match = existingEndpointRegex.Match(e.Message);
if (match.Success) {
string arn = match.Groups[1].Value;
client.DeleteEndpoint(new DeleteEndpointRequest
{
EndpointArn = arn,
});
return client.CreatePlatformEndpoint(request);
}
}
throw;
}
}
}
}
person
tia
schedule
05.11.2013
Настолько сумасшедший, что это буквально единственный способ сделать это.
- person chadkouse; 11.03.2014
Вместо того, чтобы удалять и создавать конечную точку платформы, вы можете просто вызвать: SetEndpointAttributes с атрибутом
Enabled = true
- person Kamil; 07.01.2015
Странно, что приходится анализировать это из сообщения об ошибке, которое может измениться в будущем. Довольно смешно, что они просто не возвращают нам дубликат конечной точки.
- person user3344977; 10.11.2016
Похоже, amazone решила эту проблему. Я использую RoR, и у меня была такая же проблема при попытке зарегистрироваться и существующем коде GCM. Я получил сообщение об ошибке:
"AWS::SNS::Errors::InvalidParameter Invalid parameter: Token Reason: Endpoint arn:aws:sns:us-east-1:**** already exists with the same Token, but different attributes."
хотя я использовал те же (пустые) атрибуты. Теперь, когда я отправляю существующий код GCM (с теми же атрибутами, что и исходный), я получаю конечную точку arn, а не сообщение об ошибке.
person
Gil
schedule
02.10.2014
ListEndpointsByPlatformApplication возвращает только 100 конечных точек, вам нужно использовать nextToken, чтобы получить больше. Вот моя реализация.
public void deleteEndpoint(string token, string PlatformApplicationArn)
{
ListEndpointsByPlatformApplicationRequest listRequest = new ListEndpointsByPlatformApplicationRequest();
listRequest.PlatformApplicationArn = PlatformApplicationArn;
Logger.Info("Deleting endpoint with token -> " + token);
var list = snsClient.ListEndpointsByPlatformApplication(listRequest);
do
{
foreach (var x in list.Endpoints.Where(x => x.Attributes["Token"] == token))
{
snsClient.DeleteEndpoint(new DeleteEndpointRequest() { EndpointArn = x.EndpointArn });
Logger.Info("Endpoint removed-> " + x.EndpointArn);
return;
}
listRequest.NextToken = list.NextToken;
list = snsClient.ListEndpointsByPlatformApplication(listRequest);
}
while (list.NextToken != null);
}
person
Felipe Santos
schedule
27.08.2015
Учтите, что если у меня много конечных точек, это означает 1 лакх, тогда этот процесс потребует некоторой задержки для проверки токена в общих конечных точках. Есть ли способ удалить конечную точку напрямую без обработки?
- person Eswara Reddy; 14.09.2015