Curl 混合卷发——数据二进制和对url搜索参数进行编码的能力

Curl 混合卷发——数据二进制和对url搜索参数进行编码的能力,curl,Curl,我想用你的手机发一个post请求。正文是一个二进制文件,但我还想对url搜索参数进行编码 curl——请求发布\ --标题“内容类型:应用程序/八位字节流”\ --数据二进制文件“@file.txt”\\身体部位,原始,未编码 --数据urlencode“name=john”\\ url搜索参数部分,已编码 "https://example.com" 问题是curl将--data urlencode视为主体的一部分,我想要的是name=john像这样附加到url部分:https://examp

我想用你的手机发一个post请求。正文是一个二进制文件,但我还想对url搜索参数进行编码

curl——请求发布\
--标题“内容类型:应用程序/八位字节流”\
--数据二进制文件“@file.txt”\\身体部位,原始,未编码
--数据urlencode“name=john”\\ url搜索参数部分,已编码
"https://example.com"
问题是curl将
--data urlencode
视为主体的一部分,我想要的是
name=john
像这样附加到url部分:
https://example.com?name=john
--data binary
部分作为
POST
正文发送。(实际上,搜索参数是一个包含需要编码的“无效”url字符的字符串)

TLDR: 我想使用
--data urlencode
就好像我在发出
GET
请求(附加参数)一样,并使用
POST
--data binary设置实际的
POST
正文

一个快速的谷歌搜索给我提供了可以使用的信息,但这会将请求转换为一个
获取
请求我不想要的内容,因此已经有十几个关于这方面的问题了(但没有一个涉及我的情况):

  • -另一个问题是,他希望
    --数据二进制文件
    成为url(?)的一部分
  • -是的,我想要这个,但也要使用
    POST
    发送二进制文件
  • 嗯,是的,但我想要一个文件作为正文,在我的情况下,这是一个
    POST
    请求
  • -这正是我所需要的,但是,如果使用
    -X POST
    ,curl将同时将
    --data urlencode
    --data binary
    作为正文的一部分。看一下的评论部分,让我觉得这是不可能与卷曲
。。。还有许多关于如何对正文或url部分进行编码的重复内容。

你不能

--data*
选项用于构建请求主体,或者您可以要求curl将它们全部作为查询参数放在URL中(使用
-G
)。这些选项不能在单个命令行中同时生成这两个选项

我的建议是“手动”构建URL,并保留
--data
选项来构建请求主体,这主要是因为URL部分往往更简单、更小。

curl
不会为您混合发布数据和查询字符串。 我找到了一个方便的解决方案,可以将所有内容保存在一个bash脚本中,而无需添加额外的依赖项。如果python、ruby或node可用,则它们都有url编码库

必须自己构造URL编码的查询字符串 Chris Down提供了一个仅用于构建查询字符串的bash解决方案。它与我认为合适的
urlencode
函数配合使用非常有用。他的要点中的注释作了修改,以便在其他shell中使用

#从Chris开始https://gist.github.com/cdown/1163649
urlencode(){
#URL编码
old_lc_collate=$lc_collate
LC_COLLATE=C
局部长度=“${1}”
for((i=0;i内容类型:应用程序/ld+json
#>内容长度:1215
使用这两个选项会将数据附加到正文中。 试图在帖子中同时使用
--databinary
--data encode
,结果都被附加到正文中。请注意上面示例的内容长度差异

curl-vvv-xput--data binary“@${SPEK_FILE}”\
--标题“内容类型:应用程序/ld+json”\
--“数据编码”图=http://localhost:3030/ds/spek" \
'http://localhost:3030/ds'
#>内容类型:应用程序/ld+json
#>内容长度:1263

谢谢,但是“手动”是什么意思,手动编码部分内容并附加它?我的意思是,是的,这是一个选项,关于如何实现这一点,已经有很多答案,但没有干净的方法…@Daniel Stenberg:拥有
--数据urlencode
--数据二进制
不可能是一个很好的卷曲增强吗?顺便说一句,感谢您构建/维护curl!