我正在尝试使用erlcloud根据从客户端收到的endpointArn向移动设备发送推送通知。我能够使用Java应用程序成功推送通知。但是如果我尝试使用erlang,它会发出超时错误。以下是代码示例。
Config = erlcloud_sns:new(<<"Access Key">>,<<"secret Key">>,<<"sns.us-west-2.amazonaws.com">>).
erlcloud_sns:publish(target,<<"arn:aws:sns:us-west-2:2315XXXXXX:endpoint/GCM/testapp/XXXXXXX-fe9a-304e-aa52-XXXXXXXX">>,<<"ok">>,undefined,[],Config).
最后一条陈述显示如下错误。
** exception error: {sns_error,{socket_error,timeout}}
in function erlcloud_sns:sns_xml_request/3 (src/erlcloud_sns.erl, line 670)
in call from erlcloud_sns:publish/6 (src/erlcloud_sns.erl, line 471)
access_key,secret_key,Host和endpointArn的相同值来自Java程序。
答案 0 :(得分:1)
将参数更改为字符串,它将起作用。即:
Config = erlcloud_sns:new("Access Key","secret Key","sns.us-west-2.amazonaws.com").
erlcloud_sns:publish(target,"arn:aws:sns:us-west-2:2315XXXXXX:endpoint/GCM/testapp/XXXXXXX-fe9a-304e-aa52-XXXXXXXX","ok",undefined,[],Config).
erlcloud期望所有参数的字符串。不幸的是,它不是在存储它们之前验证配置值,而是存储您提供的任何内容,然后尝试使用它时失败。在这种情况下,它无法识别凭证here(因为保护功能is_list返回false)。最后,它回退到从ECS(here)获取凭据,在那里达到超时并导致您看到的错误。