如何正确通过curl POST请求提交超长JSON内容?
错误原因排查
- 方案1报错原因:
- Shell变量赋值不允许存在空格,
tempfile = test.txt的写法会被Shell识别为执行tempfile命令,而非赋值变量; - curl的
@语法是给请求参数指定读取文件的标识,不能直接把整段curl参数存入文件后用curl @文件名调用,这种写法会让curl把文件名当成请求的主机地址解析,自然会报无法解析主机的错误。
- Shell变量赋值不允许存在空格,
- 方案2报错原因:
只有--data/--data-binary这类参数支持@前缀读取文件/标准输入,--data-raw会把所有传入内容当成普通字符串传输,你传的@-会直接被发送到服务端,JSON解析时碰到开头的@自然会报错。
正确解决方案
优先选择把超长JSON内容单独存入文件的方案,既不会触发Shell命令行长度限制,也能避免JSON内特殊字符被Shell转义出错:
方案A:JSON内容存单独文件
假设JSON内容存在data.json文件中,直接用--data-binary读取文件即可:
#!/bin/bash curl --location --request POST 'example.com/abcxyz' \ --header 'Content-Type: application/json' \ --header 'Cookie: my_secret_key' \ --data-binary '@data.json'
方案B:从标准输入传入超长JSON
如果不想存本地文件,也可以通过管道或者here string把内容传给--data-binary '@-':
# 管道传参示例 echo '你的超长JSON内容' | curl --location --request POST 'example.com/abcxyz' \ --header 'Content-Type: application/json' \ --header 'Cookie: my_secret_key' \ --data-binary '@-' # here string传参示例 curl --location --request POST 'example.com/abcxyz' \ --header 'Content-Type: application/json' \ --header 'Cookie: my_secret_key' \ --data-binary '@-' <<< '你的超长JSON内容'
方案C:curl参数全放配置文件
如果连curl参数都需要统一存在文件管理,使用curl自带的-K/--config参数读取配置文件即可:
- 新建
curl.conf配置文件,内容如下:
location request = POST url = "example.com/abcxyz" header = "Content-Type: application/json" header = "Cookie: my_secret_key" data-binary = "@data.json"
- 执行请求:
curl -K curl.conf
你之前短JSON能正常运行是因为短字符串没有超过Shell的命令行参数长度限制,一旦内容超长就会触发异常,上述方案都可以彻底规避长度限制问题。
内容的提问来源于stack exchange,提问作者mamatv
相关产品推荐
相关产品推荐

