Curl 混合卷发——数据二进制和对url搜索参数进行编码的能力
我想用你的手机发一个post请求。正文是一个二进制文件,但我还想对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
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!