cURL post 大小限制

cURL post size limitations

我在 SAS 中调用 cURL 来执行 POST 请求。当我提交更大的请求时,我的代码 运行 很好,除了 post 输出(json 文件)得到 t运行。 json 文件的最大大小为 1098304,即使我将 cURL 中的 --max-filesize 选项和 SAS 中的 lrecl 选项都设置为 10000000。我 运行ning SAS 9.3 on Windows 7. 注意我需要能够下载更大的 json 文件,所以简单地限制输出的大小不是一个选项。有人 运行 解决过这个问题吗?如果是这样,你是如何处理的?

更新 1:现在 运行ning curl 使用 x 命令而不是文件名管道语句。整个文件被转储到 cmd window。我希望将输出存储在文本文件中。我尝试在 cURL 命令的开头和结尾同时使用 -o C:\json.txt 和 -O C:\json.txt ,但它不起作用。文件被转储到 cmd window。有谁知道我做错了什么?也许我可以使用另一个 cURL 命令?

Update2:在花了一些时间试验代码后,我发现 cURL 命令中的 "POST" 文本是不必要的。我删除了它,一切正常。 cURL 将整个输出直接转储到一个文本文件中,然后我可以使用 proc groovy 解析 json。成功!

非常感谢 Joe、Robert 和 user667489 提供的有益建议和分析。

最终代码:

x   "curl -d @C:\Users\Bill\Desktop\curl.txt -H ""Authorization: OAuth oauth_consumer_key=""""&oauth_consumer_key"""",oauth_token=""""&oauth_token"""",oauth_signature_method=""""&oauth_signature_method."""",
        oauth_signature=""""&oauth_signature."""",oauth_timestamp=""""&oauth_timestamp."""",oauth_nonce=""""&oauth_nonce."""",oauth_version=""""&oauth_version."""""" 
        -k &url. -o C:\json.txt";

如您所知,SAS 的最大行数为 32767,因此除非响应包含多行,否则您无论如何都需要找到一种方法来处理它。检查截断值的长度。应该告诉你这是否是问题所在。

编辑: 显然仅适用于 SAS 9.2 和之前的版本。感谢乔的澄清。

根据 Infile Statement for Microsoft Windows,LRECL 的限制应为 1GB(远远超过您所拥有的)。但是,我过去遇到过 1MB (1024^3) 似乎是极限的问题。另一方面,它比你看到的要小。因此,我不确定我是否可以直接说我知道问题出在哪里。

一种可能是您正在阅读 UTF8 字符(或其他一些 unicode 变体)。在那种情况下,LRECL 限制可能是 字节 ,而不是 个字符 。所以我可以看到一个减少 - 根据 unicode 变体,最多 4 倍左右 - 从最大值。您可以在 lrecl= 字段中尝试 MAX ,看看它做了什么;希望不是 32767(因为 LRECL 系统选项仍然声称如此)。仍然没有解释差异,但有可能考虑。如果从 10MB 增加到 MAX 或 30MB 或 100MB 或任何更高的数字会增加总长度,那么这可以解释它。我还会将 curl 最大文件大小提高到相同的数量(或至少尝试将其提高到更大的值)以查看 SAS 如何处理管道是否存在问题。

可以尝试的一件事是用 RECFM=F 读入它。我认为,当您从文件名中读取时,这将在 infile 语句中;您可以将其解析为 1MB(或更小)的数据包并以这种方式处理。如果您的数据具有这种能力,您也可以使用 termstr 或其他某种方式用定界符解析它(一种常见的方法是将 termstr='>' 用于 html,对于 json 我认为 ; 很常见)。您不知道 post 您的 json 解析在做什么,所以我无法发表评论,但我会根据我的 html 解析经验(以及一些 json好吧),当它一开始不是巨大的线条时,它更容易解析。

根据 Joe 的建议,我对 运行 cURL 使用了 x 命令,然后将输出直接保存到文本文件中。这绕过了 SAS 中的任何限制。然后我可以使用 proc groovy 解析 json 数据。最终的 cURL 代码在线程的第一个 post 中。