AVS V2 建立 HTTP2 连接

Posted

技术标签:

【中文标题】AVS V2 建立 HTTP2 连接【英文标题】:AVS V2 Establishing HTTP2 Connection 【发布时间】:2016-10-27 10:14:16 【问题描述】:

我正在尝试使用 Python、Requests 和 Hyper HTTP20Adapter(用于 HTTP/2 支持)到 AVS(API 版本 20160207)创建 HTTP/2 连接。我问了一个类似的问题here,并确定我的主要问题来自不支持 HTTP/2 的请求——我相信我已经通过使用 Hyper 模块解决了这个问题。

Amazon's instructions 对 GET 说下行通道流,然后在同一连接上,POST SynchronizeState 事件。

这是我发送两个请求的尝试:

downstream = requests.Session()
downstream.mount('https://avs-alexa-na.amazon.com', HTTP20Adapter())
qheader = "authorization": "Bearer " + ACCESS_KEY
sheader = "authorization": "Bearer " + ACCESS_KEY, "Content-Disposition": "form-data; name=metadata","Content-Type": "application/json; charset=UTF-8"
spayload = "context": [],"event": "header":"namespace":"System","name":"SynchronizeState","messageId":"SyncState",,"payload": 

q = downstream.get("https://avs-alexa-na.amazon.com/v20160207/directives", headers=qheader, stream=True)

s = downstream.post("https://avs-alexa-na.amazon.com/v20160207/events", headers=sheader, data=json.dumps(spayload)

但是,我一直收到此错误消息:

INVALID_REQUEST_EXCEPTION, description: No multipart body found in the payload.

即使我在post 请求中取出data=json.dumps(spayload) 行并将其替换为json = spayload,这种情况仍然存在。

我有两个主要问题:

1) 我不确定我是否按照指示在“同一连接”上发出两个请求。我是吗(我以为requests.Session() 会解决这个问题,但是......)?如果没有,我该怎么做?

2) 如何解决“No multipart body found in payload”消息?我准确地发送了他们的example SynchronizeState event,它特别说包含一个空的有效载荷。

提前感谢您的帮助!任何事情都值得赞赏!

【问题讨论】:

【参考方案1】:

1) 抱歉,我不知道 - 我在使用适配器时遇到了问题 - 我的请求没有终止,所以我切换到使用 hyper server example 中显示的基于 asyncio 协议的流程(转换还不错到客户用例)

2) 我通过确保在初始 GET 中发送标头和在 POST 中发送数据后结束流来解决此问题。 (self._conn.send_data(stream_id, sync_post_data, end_stream=True)

【讨论】:

以上是关于AVS V2 建立 HTTP2 连接的主要内容,如果未能解决你的问题,请参考以下文章

HTTP2多路复用指什么

具有多个套接字连接的 HTTP2 和 TLS

nghttp2如何建立下载通道? (c/c++) (AVS)

如何在来自 AVS 的 http2 连接上接收超过 65535 字节的数据?

HTTP1.0和HTTP1.1以及HTTP2.0的区别

HTTP2.0协议