如何无需文件中转,用cURL将URL返回的JSON直接POST至另一URL
解决方案:无需本地文件的curl转发方法
嘿,这个问题我之前也碰到过!其实不用本地文件中转完全可以做到,而且有几种不同的方法,我给你详细说下:
方法1:命令替换(最直观)
你之前的尝试无效是因为把curl <resource_link>.json当成了字符串传给了-d参数,而不是让系统执行这个命令并把输出作为数据。正确的做法是用命令替换($())来捕获第一个curl的输出:
curl -X POST "<my_link>" -H "Content-type: application/json" -d "$(curl "<resource_link>.json")"
注意点:
- 这里的
-H是指定请求头的正确参数(你之前的命令里直接写"Content-type: application/json"是错误的,必须用-H前缀) - 命令替换会把第一个curl的所有标准输出(也就是JSON内容)作为第二个curl的请求体
- 如果JSON内容特别大,命令替换可能会因为shell的参数长度限制出问题,这时候可以用下面的管道方法
方法2:管道流式传输(适合大JSON)
用管道把第一个curl的输出直接传给第二个curl,这种方法是流式的,不会把整个JSON加载到内存里,适合大文件:
curl "<resource_link>.json" | curl -X POST "<my_link>" -H "Content-type: application/json" --data-binary @-
关键说明:
--data-binary @-表示从标准输入(也就是管道传来的内容)读取请求体,@-是curl的特殊语法,代表标准输入- 用
--data-binary而不是-d是因为-d会自动对内容做URL编码,可能破坏JSON的格式,--data-binary会完全保留原始内容
方法3:进程替换(内存临时文件)
如果你不想用管道或者命令替换,还可以用bash的进程替换功能,它会在内存中创建一个临时管道文件,不会写到磁盘上:
curl -X POST "<my_link>" -H "Content-type: application/json" -d @<(curl "<resource_link>.json")
解释:
<(curl ...)会创建一个临时的文件描述符,内容是第一个curl的输出,@告诉curl从这个文件描述符读取数据- 这种方法和本地文件的用法很像,但完全是在内存中操作,没有磁盘IO开销
额外提醒
- 如果你的
<resource_link>需要认证(比如Bearer token),直接在第一个curl里加对应的请求头就行,比如:curl "<resource_link>.json" -H "Authorization: Bearer your_token" - 可以先单独执行
curl "<resource_link>.json"确认输出是有效的JSON,避免因为源数据格式问题导致POST失败 - 如果需要调试,可以在第二个curl里加
-v参数查看请求详情,方便排查问题
内容的提问来源于stack exchange,提问作者Confidenc3
相关产品推荐
相关产品推荐

