urlopen 的 json 数据限制为 64k
64k limit on json data for urlopen
我的头撞在一个问题上。我会提前警告这是不可重现的,因为我无法分享我的终点。我也是一名数据科学家,所以我对网络技术的了解有限。
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 上的 64k 字节以下?是否有处理此问题的行业标准?
HTTP 500 错误表示 "internal server error"。理论上,这意味着不是你的代码有问题,是服务器有问题。
在实践中,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。
服务器或链中某处的代理可能存在一些错误,阻止您按书面发送请求。如果 Content-Length
不适用于 >64 KiB,您可以尝试使用 Transfer-Encoding: chunked
。服务器可能希望使用 100 Continue,但 urllib
不支持此功能。
如果您使用像 Charles 这样的工具对您的 GUI 客户端进行 MITM,您可以看到请求的确切格式,并且可以让您自己的请求使用相同的格式。
我的头撞在一个问题上。我会提前警告这是不可重现的,因为我无法分享我的终点。我也是一名数据科学家,所以我对网络技术的了解有限。
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 上的 64k 字节以下?是否有处理此问题的行业标准?
HTTP 500 错误表示 "internal server error"。理论上,这意味着不是你的代码有问题,是服务器有问题。
在实践中,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。
服务器或链中某处的代理可能存在一些错误,阻止您按书面发送请求。如果
Content-Length
不适用于 >64 KiB,您可以尝试使用Transfer-Encoding: chunked
。服务器可能希望使用 100 Continue,但urllib
不支持此功能。
如果您使用像 Charles 这样的工具对您的 GUI 客户端进行 MITM,您可以看到请求的确切格式,并且可以让您自己的请求使用相同的格式。