urlopen的json数据限制为64k

时间:2018-10-24 14:45:41

标签: python urllib

将我的脑袋对准一个问题。我将事先警告不可复制,因为我无法分享自己的终点。另外,我还是数据科学家,所以我对网络技术的了解有限。

from urllib.request import Request, urlopen

url = "https://www.some_endpoint.com/"
req = Request(
    url, headers={"API-TOKEN": "some_token"})
json_string = "{"object": "XYZ".....}"

response = urlopen(req, json_string.encode("utf-8"))

我在urlopen上出现异常行为。当我的JSON小于65536字节时,如评估len(json_string.encode('utf-8'))所示,此urlopen调用工作正常。当超过该限制时,我会收到一个HTTP 500错误。

这纯粹是服务器端在大小调整方面的错误限制吗?不同寻常的是,当大数据通过GUI传递到端点时,它可以正常工作。或者我可以做些什么来将我的数据分块到urlopen上的sub 64k字节中?是否有处理此问题的行业标准?

1 个答案:

答案 0 :(得分:1)

HTTP 500错误表示“内部服务器错误”。从理论上讲,这意味着您的代码没有问题,服务器有问题。

实际上,HTTP 500错误几乎没有任何意义,因为当程序员未提供更具体的错误代码时,许多服务器将使用HTTP 500作为默认错误代码。不幸的是,这意味着您只能猜测别人的代码是如何工作的。

以下是一些可能的方法:

  • 服务器的最大请求大小可能为64 KiB。您可以使用更紧凑的JSON(在分隔符之间删除空格)或使用Content-Encoding: gzip来减小请求大小。

    import gzip
    import json
    
    # Remove whitespace from JSON
    json_string = json.dumps(
        json.loads(json_string),
        separators=(',', ':'))
    # Encode as Gzip
    json_data = gzip.compress(
        json_string.encode('UTF-8'))
    
    req = Request(
        url, headers={"API-TOKEN": "some_token",
                      "Content-Encoding": "gzip"})
    response = urlopen(req, json_data)
    
  • 有可能采用某种方法将请求拆分或分块为多个较小的请求。这将需要您正在使用的确切API的知识。

  • 服务器或代理中的某些错误可能会阻止您按书面形式发送请求。如果Transfer-Encoding: chunked无法用于> 64 KiB,则可以尝试使用Content-Length。服务器可能希望使用100 Continue,但是urllib不支持此功能。

如果您使用Charles之类的工具来使用MITM GUI客户端,则可以看到请求的确切格式,也可以使自己的请求使用相同的格式。