Python urlopen对json数据的64k限制

Python urlopen对json数据的64k限制,python,urllib,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".....}" re

在一个问题上撞我的头。我将提前警告,这是不可复制的,因为我不能分享我的终点。我也是一名数据科学家,所以我对网络技术的知识有限

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"))
我在公开场合有不寻常的行为。当我的JSON小于65536字节时,如计算
len(JSON_string.encode('utf-8'))
所示,这个urlopen调用工作正常。当它超过这个限制时,我得到一个
htp500
错误


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

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

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

以下是一些可能的方法:

  • 服务器的最大请求大小可能为64 KiB。您可以通过使用更紧凑的JSON(删除分隔符之间的空格)或使用
    内容编码: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

  • 可能是服务器或链中某处的代理中存在某种缺陷,阻止您以书面形式发送请求。如果
    内容长度
    对>64 KiB无效,您可以尝试使用
    传输编码:chunked
    。服务器可能希望使用100 Continue,但
    urllib
    不支持此操作


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

这取决于服务器。无论如何,我建议切换到Requests库(),以使事情变得更简单。同样的问题。那么服务器端呢?HTTP 500是服务器端的范围代码,所以yesSomeone说“64k对任何人都应该足够了”:)谷歌搜索这句话。谢谢你的回答。尝试gzip,传输编码;不走运。我会在本地分头进行。