2014-03-06 86 views
5

目前,如果我們想將設備添加到使用SNS應用:AWS博託SNS - 通過設備令牌獲得endpoint_arn

ep = SNSConnection.create_platform_endpoint(app_arn,device_token,user_data) 

有該設備在過去已添加的選項。 要驗證設備是否已添加,我們使用:

def is_device_registered(device_token): 
     list_of_endpoints = SNSConnection.list_endpoints_by_platform_application(AC.INPLAY_CHAT_APPLICATION_SNS_ARN) 
     all_app_endpoints = list_of_endpoints['ListEndpointsByPlatformApplicationResponse']['ListEndpointsByPlatformApplicationResult']['Endpoints'] 
     for ep in all_app_endpoints: 
      ep_device_token = ep['Attributes']['Token'] 
      if device_token == ep_device_token: 
       endpoint_arn = ep['EndpointArn'] 
       print 'Found an endpoint for device_token: %s, entry:%s' % (device_token,endpoint_arn) 
       return endpoint_arn 
     return None 

這是非常低效,不能縮放。

是否有boto sns函數獲取device_token並返回endpoint_arn(如果存在)? (如果不是)。

+0

嘿阿米特 - 你有沒有找到最好的方法來處理這個問題?您是否存儲端點arn或每次使用該令牌查找它?回答你自己的問題,如果你找到了「正確」的方式來做到這一點 – HarrisonJackson

+0

我們可以選擇將它存儲在DB/Redis中,但由於數據存儲在AWS SNS中,我們認爲從那裏檢索它是有用的使用API​​(boto在這種情況下) –

回答

5

亞馬遜給你的錯誤信息arn。你可以從那裏解析它。不是最優的,但保存了一些數據庫查找。

錯誤:SNS錯誤 - 無法將用戶標記爲SNSInvalidParameter:無效的參數:標記原因:端點arn:aws:sns:us-east- [ARN密鑰的其餘部分]已經存在,但具有相同的標記,但屬性不同。這裏有一些咖啡與正則表達式準備去

if err? 
    log.error "SNS ERROR - Could not subcribe user to SNS" + err 
    #Try to get arn from error 

    result = err.message.match(/Endpoint(.*)already/) 
    if result?.length 
    #Assign and remove leading and trailing white spaces. 
    result = result[1].replace /^\s+|\s+$/g, "" 
    log.debug "found existing arn-> #{result} " 
+1

這應該是接受的答案。我將發佈基於@fino答案的Django/Python版本。 –

+1

10x @fino - 我們希望解決方案將在博託API。 –

+2

這有點荒謬嗎?如果錯誤的格式發生變化怎麼辦? – clu

5

相同的答案@fino,但代碼爲Django。希望這個幫助。

import re 

try: 
    sns_connection = sns.connect_to_region(...) 
    response = sns_connection.create_platform_endpoint(...) 
    arn = response['CreatePlatformEndpointResponse']['CreatePlatformEndpointResult']['EndpointArn'] 
    return arn 

except Exception, err: 
    print err 
    #try to get arn from error 
    result_re = re.compile(r'Endpoint(.*)already', re.IGNORECASE) 
    result = result_re.search(err.message) 
    if result: 
     arn = result.group(0).replace('Endpoint ','').replace(' already','') 
     print arn 
     return arn 
    return '' 
+0

10倍@JohnPang。 - 我們希望解決方案將在博託API。 –