Google app engine 谷歌应用引擎如何修改HTTP请求/响应编码?

Google app engine 谷歌应用引擎如何修改HTTP请求/响应编码?,google-app-engine,character-encoding,content-type,Google App Engine,Character Encoding,Content Type,我试图从Google App Engine应用程序发送JSON HTTP请求并检索响应,虽然这在本地非常有效,但当我将其部署到GAE时,它突然中断 更准确地说,返回到我的应用程序的HTTP响应主体最终看起来是这样的,而不是简单的JSON: �\bD�[��8��ʖϣ�M�M$ �\\�bA` @!r���~pvk�cR]�_7E� 我确实发现了一组在GAE上得到正确响应的情况,这可能会让我对这种行为有一些了解——如果响应没有content-type头,它会正常运行,但是一旦content-en

我试图从Google App Engine应用程序发送JSON HTTP请求并检索响应,虽然这在本地非常有效,但当我将其部署到GAE时,它突然中断

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

�\bD�[��8��ʖϣ�M�M$ �\\�bA` @!r���~pvk�cR]�_7E�
我确实发现了一组在GAE上得到正确响应的情况,这可能会让我对这种行为有一些了解——如果响应没有content-type头,它会正常运行,但是一旦content-encoding头设置为“gzip”时,我就会得到上面作为响应体的错误垃圾

不幸的是,我无法控制我呼叫的服务。因此,我唯一的选择就是以某种方式在我这边解决这个问题,但要解决这个问题,我正试图理解谷歌应对措施之间的区别。有人知道吗

我了解谷歌对HTTP流量的影响。这是不是也在强迫我回答gzip

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

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

如中所述,应用程序不应提供内容编码标题:“Google App Engine尽最大努力将gzip内容提供给支持它的浏览器。利用此方案是自动的,不需要修改应用程序”

我相信这种架构(内容编码不受应用程序端的控制——在应用程序引擎上,您的应用程序代码——而是由服务器/网关端控制)起源于WSGI,即应用程序到web服务器/网关(应用程序引擎在Python运行时使用的)的Python标准接口,但是这个架构有足够的意义,我们对它进行了推广——正如上面的页面所说,“这种方法避免了流行浏览器中gzip内容的一些众所周知的bug。”


客户端远非无能为力,事实上,如果它选择这样做,它可以控制内容编码——仍然引用“为了强制提供gzip内容,客户端可以提供'gzip'作为接受编码和用户代理请求头的值。如果不存在接受编码头,内容将永远不会被gzip。”.

谢谢您的回答!请看我的编辑。不确定我是否足够清楚-我没有将请求从浏览器发送到我的GAE应用程序。我正在从我的GAE应用程序向外部web服务发送HTTP请求。该Web服务的响应去掉了“content encoding:gzip”标题,但主体仍然是压缩的。这是一个GAE错误吗?如果您正在使用urlfetch,就像现在看起来的那样,请看我所理解的,基本上它所建议的就是我所做的,手动解压缩它。希望有一个更好的方法来找出它是否是gzip,然后测试内容。