将我的脑袋对准一个问题。我将事先警告不可复制,因为我无法分享自己的终点。另外,我还是数据科学家,所以我对网络技术的了解有限。
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字节中?是否有处理此问题的行业标准?
答案 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客户端,则可以看到请求的确切格式,也可以使自己的请求使用相同的格式。