离子推送错误请求 400
Ionic Push Bad Request 400
编辑:
所以看起来问题是我看到的输出包含单引号而不是双引号,并且还有一个 "u" 字符被抛入。是否任何人都知道是什么原因造成的?如果我尝试通过将所有内容更改为双引号并删除 "u" 来验证 JSON,那么它会正确验证。
编辑:2
事实证明,问题出在使用 urlencode,当我改为使用 json.dumps() 时,一切都运行良好。
我正在努力将 Ionic Push 实施到我的 Ionic 应用程序中,但在为 "Push" 服务创建格式正确的请求时遇到问题,您需要点击该服务才能实际发送推送通知。
我正在执行 python 实施,并按照他们所说的方式在 documentation 中进行设置。
因此在下面的代码中您可以看到我正在注销 Logger.info(post_data)
,如果我准确地获取从那里注销的内容并执行手动 curl 请求,我将能够收到推送通知到设备正确。
但是,一旦我尝试向服务发送 POST
请求以发送消息,我就会收到 400 BAD REQUEST
响应,所以这让我相信我一定遗漏了一些东西我的headers/authentication?我使用 urllib2
的实现似乎与设置中显示的相匹配,但我仍然发现问题。任何帮助将不胜感激。
这是 Logger.info(post_data)
的记录输出,您还将找到以下代码:
# Output
{'notification': {'alert': u"Automatic Investments is disabled! We aren't buying you Bitcoin!"}, 'tokens': [u'APA91bGyHR56ANGhiDvlgY7DM7fda2EG4Hp8hSw2arJmaib-BXHT8YWLw5xMloUgZSQvOdzD3Qpg6FMTZeS8b9c2Tl0Rd86qbDa2h_HJKY-pOMP95uNdbUSjJJMuvd-TOs-rhh8gaj6Hs9G0q2LsG7Bc0HtII-O3cQ']}
# Code
class PushService(object):
def __init__(self, app=None):
self.app = app
if app is not None:
self.init_app(app)
def init_app(self, app):
self.url = app.config['IONIC_PUSH_ENDPOINT']
self.app_id = app.config['IONIC_PUSH_APP_ID']
self.api_key = app.config['IONIC_PUSH_API_KEY']
self.secret_api_key = app.config['IONIC_PUSH_PRIVATE_KEY']
Logger.info('URL: ' + str(self.url))
Logger.info('APP_ID: ' + str(self.app_id))
Logger.info('API_KEY: ' + str(self.api_key))
Logger.info('SECRET_KEY: ' + str(self.secret_api_key))
def send(self, user, device, message):
Logger.info('DEVICE_ID: ' + device.device_id)
tokens = [device.device_id]
# Set up the data of POST for the push
post_data = {"tokens": tokens,
"notification": {
"alert": message
}
}
# Encode for passing to urllib
data = urllib.urlencode(post_data)
Logger.info(post_data)
Logger.info('RIGHT BEFORE ATTEMPTING TO SEND')
app_id = self.app_id
app_key = self.secret_api_key
url = self.url
req = urllib2.Request(url, data=data)
req.add_header("Content-Type", "application/json")
req.add_header("X-Ionic-Application-Id", app_id)
b64 = base64.encodestring('%s:%s' % (app_key, '')).replace('\n', '')
req.add_header("Authorization", "Basic %s" % b64)
resp = urllib2.urlopen(req)
print resp
如果其他人遇到同样的问题,请确保您不使用 urllib.urlencode(post_data),而是使用 json.dumps(post_data) 并且上面的代码将起作用。
编辑:
所以看起来问题是我看到的输出包含单引号而不是双引号,并且还有一个 "u" 字符被抛入。是否任何人都知道是什么原因造成的?如果我尝试通过将所有内容更改为双引号并删除 "u" 来验证 JSON,那么它会正确验证。
编辑:2 事实证明,问题出在使用 urlencode,当我改为使用 json.dumps() 时,一切都运行良好。
我正在努力将 Ionic Push 实施到我的 Ionic 应用程序中,但在为 "Push" 服务创建格式正确的请求时遇到问题,您需要点击该服务才能实际发送推送通知。
我正在执行 python 实施,并按照他们所说的方式在 documentation 中进行设置。
因此在下面的代码中您可以看到我正在注销 Logger.info(post_data)
,如果我准确地获取从那里注销的内容并执行手动 curl 请求,我将能够收到推送通知到设备正确。
但是,一旦我尝试向服务发送 POST
请求以发送消息,我就会收到 400 BAD REQUEST
响应,所以这让我相信我一定遗漏了一些东西我的headers/authentication?我使用 urllib2
的实现似乎与设置中显示的相匹配,但我仍然发现问题。任何帮助将不胜感激。
这是 Logger.info(post_data)
的记录输出,您还将找到以下代码:
# Output
{'notification': {'alert': u"Automatic Investments is disabled! We aren't buying you Bitcoin!"}, 'tokens': [u'APA91bGyHR56ANGhiDvlgY7DM7fda2EG4Hp8hSw2arJmaib-BXHT8YWLw5xMloUgZSQvOdzD3Qpg6FMTZeS8b9c2Tl0Rd86qbDa2h_HJKY-pOMP95uNdbUSjJJMuvd-TOs-rhh8gaj6Hs9G0q2LsG7Bc0HtII-O3cQ']}
# Code
class PushService(object):
def __init__(self, app=None):
self.app = app
if app is not None:
self.init_app(app)
def init_app(self, app):
self.url = app.config['IONIC_PUSH_ENDPOINT']
self.app_id = app.config['IONIC_PUSH_APP_ID']
self.api_key = app.config['IONIC_PUSH_API_KEY']
self.secret_api_key = app.config['IONIC_PUSH_PRIVATE_KEY']
Logger.info('URL: ' + str(self.url))
Logger.info('APP_ID: ' + str(self.app_id))
Logger.info('API_KEY: ' + str(self.api_key))
Logger.info('SECRET_KEY: ' + str(self.secret_api_key))
def send(self, user, device, message):
Logger.info('DEVICE_ID: ' + device.device_id)
tokens = [device.device_id]
# Set up the data of POST for the push
post_data = {"tokens": tokens,
"notification": {
"alert": message
}
}
# Encode for passing to urllib
data = urllib.urlencode(post_data)
Logger.info(post_data)
Logger.info('RIGHT BEFORE ATTEMPTING TO SEND')
app_id = self.app_id
app_key = self.secret_api_key
url = self.url
req = urllib2.Request(url, data=data)
req.add_header("Content-Type", "application/json")
req.add_header("X-Ionic-Application-Id", app_id)
b64 = base64.encodestring('%s:%s' % (app_key, '')).replace('\n', '')
req.add_header("Authorization", "Basic %s" % b64)
resp = urllib2.urlopen(req)
print resp
如果其他人遇到同样的问题,请确保您不使用 urllib.urlencode(post_data),而是使用 json.dumps(post_data) 并且上面的代码将起作用。