【问题标题】:How does Google App Engine modify HTTP request/response encoding?Google App Engine 如何修改 HTTP 请求/响应编码?
【发布时间】:2016-03-02 17:30:56
【问题描述】:

我正在尝试从 Google App Engine 应用程序发送 JSON HTTP 请求并检索响应,虽然这在本地运行良好,但当我将其部署到 GAE 时它突然中断。

更准确地说,返回给我的应用程序的 HTTP 响应正文最终看起来像这样,而不是简单的 JSON:

�\bD�[��8��ʖϣ�M�M$ �\\�bA` @!r���~pvk�cR]�_7E�

我确实发现了一组我在 GAE 上得到正确响应的情况,这可能会对这种行为提供一些见解 - 如果响应没有 content-type 标头,它会正常运行,但只要有 content-编码标头设置为“gzip”目前我得到不正确的垃圾作为响应正文。

很遗憾,我无法控制我正在调用的服务。所以我唯一的选择就是以某种方式解决这个问题,但为了解决这个问题,我试图了解谷歌所做的回应之间的区别。有人知道吗?

我了解 Google does some things 到 HTTP 流量。它是否也强制我的回复使用 gzip?

我也尝试过使用编码,尝试将响应读取为 utf-8,并按照推荐的 here 将 utf-8 设置为我的 GAE 应用程序的默认编码,但没有任何效果。我已经排除了在我的代码或我正在使用的任何东西中对响应的错误处理,至少我是这么认为的,否则我会在本地遇到同样的问题。我试图了解到底发生了什么,希望这能让我知道如何预防它。

编辑:我想通了并做了一个解决方法,但它仍然是一种解决方法,而不是解决方案。因此,我的 GAE 应用程序从 GAE 外部调用另一个 Web 服务,该服务有时 gzip 响应,有时不响应。如果是这样,GAE 会从响应中删除内容类型标头,从而阻止我的应用程序正确解码响应正文。到目前为止,我的解决方法是获取响应字节并测试响应是否是有效的 JSON,如果不是则手动解压缩。仍然想知道是否可以防止剥离内容类型...

【问题讨论】:

    标签: google-app-engine character-encoding content-type


    【解决方案1】:

    正如https://cloud.google.com/appengine/kb/#compression 中解释的那样,应用程序不应提供内容编码标头:“Google App Engine 尽最大努力为支持它的浏览器提供 gzip 压缩的内容。利用此方案是自动的,不需要修改应用程序”。

    我相信这种架构的起源(内容编码由事物的应用程序端控制 - 在 App Engine 上,您的应用程序代码 - 但由服务器/网关端控制)起源于 WSGI,应用程序到 Web 服务器/网关的 Python 标准接口(App Engine 在 Python 运行时使用),但架构足够有意义,我们对其进行了概括——正如上面的页面所说,“这种方法避免了一些流行浏览器中压缩内容的众所周知的错误。”。

    客户端远非无能为力,事实上,如果它选择,可以控制内容编码——仍然引用,“要强制提供 gzip 压缩的内容,客户端可以提供 'gzip' 作为Accept-Encoding 和 User-Agent 请求标头。如果没有 Accept-Encoding 标头,则永远不会压缩内容。"。

    【讨论】:

    • 感谢您的回答!请看我的编辑。不确定我是否足够清楚 - 我没有将请求从浏览器发送到我的 GAE 应用程序。我正在从我的 GAE 应用程序向外部 Web 服务发送 HTTP 请求。来自该 Web 服务的响应被剥离了“content-encoding:gzip”标头,但正文仍被压缩。这是一个 GAE 错误吗?
    • 如果您正在使用 urlfetch,就像现在看来,请参阅 stackoverflow.com/questions/11088268/…
    • 据我所知,基本上它所暗示的就是我所做的,手动解压缩。希望有更好的方法来确定它是否被压缩然后测试内容。
    猜你喜欢
    • 2015-03-07
    • 1970-01-01
    • 2011-04-18
    • 1970-01-01
    • 2020-02-17
    • 2014-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多