如何使用CURL POST两个文件?curl命令执行异常求助
解决curl POST多个JSON文件的问题
嘿,我来帮你搞定这个curl的问题!你遇到的核心矛盾是:当用多个-d参数指定两个JSON文件,同时设置Content-Type: application/json时,curl的处理逻辑和JSON格式要求完全冲突了。
为什么会出错?
-d参数默认会把数据当成表单字段处理,多个-d会生成类似key1=value1&key2=value2的格式,但JSON要求必须是单一的对象或数组结构。直接传两个文件的原始内容,会导致发送的数据是两个JSON字符串生硬拼接(比如{"a":1}{"b":2}),这完全不符合JSON语法,服务器自然解析失败。
正确的解决方案
根据你的需求,分两种常见场景处理:
1. 合并两个JSON为一个对象发送
如果服务器期望接收包含两个文件内容的单一JSON对象,推荐用jq工具(处理JSON的专业工具,更可靠)来合并:
# 合并两个JSON对象为一个,通过标准输入传给curl jq -s '.[0] * .[1]' input.json input2.json | curl -vX POST http://localhost/api/postJSON -d @- --header "Content-Type: application/json"
解释:jq -s会把两个文件的内容转为数组元素,.[0] * .[1]将两个对象合并成一个(重复的键会用第二个文件的值覆盖第一个)。@-表示curl从标准输入读取数据。
如果没安装jq,可以用shell命令临时拼接(适合结构简单的JSON):
# 假设两个文件都是顶级对象,手动合并成一个合法JSON对象 echo -n '{' && cat input.json | sed 's/^{//;s/}$//' && echo -n ',' && cat input2.json | sed 's/^{//;s/}$//' && echo '}' | curl -vX POST http://localhost/api/postJSON -d @- --header "Content-Type: application/json"
2. 把两个JSON作为数组元素发送
如果服务器支持接收JSON数组,可以直接将两个文件内容包装成数组:
jq -s '.' input.json input2.json | curl -vX POST http://localhost/api/postJSON -d @- --header "Content-Type: application/json"
发送的数据格式是[第一个JSON内容, 第二个JSON内容],需要确保服务器能正确解析这种格式。
额外注意
如果你的JSON文件包含换行、特殊字符,建议用--data-binary代替-d,避免curl自动转换格式破坏JSON结构:
jq -s '.[0] * .[1]' input.json input2.json | curl -vX POST http://localhost/api/postJSON --data-binary @- --header "Content-Type: application/json"
内容的提问来源于stack exchange,提问作者Evi
相关产品推荐
相关产品推荐

