Amazon SNS: как получить EndpointArn по токену (registrationId) с помощью amazon .net sdk?

Я пытаюсь получить EndpointArn по идентификатору регистрации, используя aws .net sdk. Но я не мог найти хороший способ сделать это.

Моя первая попытка заключалась в запуске CreatePlatformEndpointRequest с тем же регистрационным идентификатором, который ранее был зарегистрирован в приложении SNS, отправленном клиентом (Android). Таким образом, aws API предоставляет EndpointArn для этого регистрационного идентификатора.

Amazon: действие CreatePlatformEndpoint является идемпотентным, поэтому, если инициатор запроса уже владеет конечной точкой с тот же токен и атрибуты устройства, ARN этой конечной точки возвращается без создания новой конечной точки.

Но если вы сохранили что-то в CustomUserData, прежде чем вам нужно будет отправить те же пользовательские данные, чтобы получить конечную точку для этого идентификатора регистрации, в противном случае вы получите исключение, как показано ниже.

Недопустимый параметр: токен. Причина: конечная точка {My Endpoint ARN} уже существует с таким же токеном, но с другими атрибутами.

Я думаю, что буду использовать CreatePlatformEndpoint() без пользовательских данных, и когда мне понадобится Endpoint Arn для RegistrationId, я запущу CreatePlatFormEndpoint только с этим идентификатором регистрации.

Есть ли другой способ получить EndpointArn по токену лучше, чем решение выше?

Спасибо.


person Barbaros Alp    schedule 19.03.2014    source источник
comment
Просто для информации: я просто принимаю это решение... И у меня по-прежнему такая же ошибка. Я отправляю как пользовательские данные, и я продолжаю возвращать ошибку: s   -  person farvilain    schedule 17.05.2014
comment
Я столкнулся с той же проблемой. Не уверен, что идет не так?   -  person Saurabh Wadhwa    schedule 20.05.2014
comment
У нас такая же проблема. см. наш вопрос: stackoverflow.com/questions/22227262/   -  person Amit Talmor    schedule 26.05.2014
comment
вы можете получить ARN конечной точки из сообщения об исключении, SNS возвращает ARN уже существующей конечной точки   -  person iBabur    schedule 15.05.2015
comment
@babur Серьезно, это ужасное решение. Что делать, если формат сообщения об ошибке изменится?   -  person LyteSpeed    schedule 23.06.2015
comment
@clu это просто обходной путь на случай, если кто-то захочет его использовать. ваша возможная проблема также исправлена, если в будущем aws решит удалить arn из сообщения об исключении   -  person iBabur    schedule 23.06.2015
comment
Поздний ответ, но именно этот обходной путь на самом деле предлагает Amazon в своих примерах. У них есть пример кода, который анализирует сообщение об ошибке, используя регулярное выражение для извлечения ARN. Я не поверил в первый раз, когда увидел. Для меня это очень плохая практика делать такие вещи.   -  person Joris Mans    schedule 01.06.2016
comment
Кстати, запрос CreatePlatformEndpoint выглядит идемпотентным. Таким образом, вы можете стрелять в любое время, когда захотите. И каждый раз вы получаете в ответ один и тот же endpointArn. Но идемпотентность требует одинаковых атрибутов в запросе   -  person Deepscorn    schedule 09.11.2017


Ответы (2)


Что мы сделали, так это сохранили ARN конечной точки, возвращенный из CreatePlatformEndpoint, в базе данных нашего приложения. Если у нас уже есть ARN-ассоциация конечной точки для данного регистрационного идентификатора устройства, мы вызываем

getEndpointAttributes, передавая конечную точку из нашей базы данных. Если результат возвращается, мы затем проверяем, помечена ли конечная точка как включенная, и если нет, то вызываем setEndpointAttributes и устанавливаем для ключа «Включено» значение «true».

К сожалению, это не похоже на то, что Amazon API предлагает метод «findBy» для поиска по «CustomUserData» или «Token» и имеет только методы «list», которые перечисляют все существующие конечные точки, которых для большинства приложений будет недостаточно, если есть потенциально тысячи или миллионы записей. Это почти так, как если бы API был написан только для удовлетворения сценариев использования пользовательского интерфейса консоли Amazon.

Кроме того, см. документы Amazon для примеров запросов и ответов API.

http://docs.aws.amazon.com/sns/latest/api/API_GetEndpointAttributes.html http://docs.aws.amazon.com/sns/latest/api/API_SetEndpointAttributes.html

person GameSalutes    schedule 20.09.2015

Согласно блогу AWS по адресу https://mobile.awsblog.com/post/Tx223MJB0XKV9RU/Mobile-token-management-with-Amazon-SNS, они также рекомендуют хранить ARN на стороне приложения.

retrieve the latest token from the mobile OS
if (endpoint arn not stored)
    # first time registration
    call CreatePlatformEndpoint
    store returned endpoint arn
endif

call GetEndpointAttributes on the endpoint arn 

if (getting attributes encountered NotFound exception)
    #endpoint was deleted 
    call CreatePlatformEndpoint
    store returned endpoint arn
else 
    if (token in endpoint does not match latest) or 
        (GetEndpointAttributes shows endpoint as disabled)
        call SetEndpointAttributes to set the 
                     latest token and enable the endpoint
    endif
endif
person Terence    schedule 11.12.2015