如何在不使用-F的情况下重写此CURL multipart/form-data请求?

Wil*_*iss 31 curl http multipartform-data

如何重写以下CURL命令,以便它不使用该-F选项,但仍然生成完全相同的HTTP请求?即,以便它直接传递身体中的multipart/form-data.

curl -X POST -F example=test http://localhost:3000/test
Run Code Online (Sandbox Code Playgroud)

Wil*_*iss 62

解决了:

curl \
  -X POST \
  -H "Content-Type: multipart/form-data; boundary=----------------------------4ebf00fbcf09" \
  --data-binary @test.txt \
  http://localhost:3000/test
Run Code Online (Sandbox Code Playgroud)

其中test.txt包含以下文本,最重要的是有CRLF(\ r \n)行结尾:

------------------------------4ebf00fbcf09
Content-Disposition: form-data; name="example"

test
------------------------------4ebf00fbcf09--
Run Code Online (Sandbox Code Playgroud)

注意:重要的是使用--data-binary而不是普通旧,-d因为前者保留行结尾(这是非常重要的).另外,请注意身体的边界以额外的开头--.

我将重复它,因为它非常重要,但该请求体文件必须具有CRLF行结尾.具有良好行结束支持的多平台文本编辑器是jEdit(如何在jEdit中设置行结尾).

如果您对我的工作方式感兴趣(使用Ruby on Rails应用程序进行调试)而不仅仅是最终解决方案,我会在我的博客上编写调试步骤.

  • 干得好,先生.我花了4个小时直接告诉你线路结束需要CRLF.非常感谢. (3认同)

mim*_*ing 26

您可以--form明确地使用该参数

curl -H "Content-Type: multipart/related" \
  --form "data=@example.jpg;type=image/jpeg" http://localhost:3000/test
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,但我特别想传递原始数据进行测试,以便我能理解它 - 然后在非基于卷曲的程序中使用它. (3认同)
  • 谢谢您,“ type = ...”对我帮助很大! (2认同)

Wil*_*iss 15

这是一个替代答案,原始的CURL语句使用-d单行代码重写,没有临时文件.我个人认为临时文件方法更容易理解,但我也把它放在这里作为参考:

curl -X POST -H "Content-Type: multipart/form-data; boundary=----------------------------4ebf00fbcf09" -d $'------------------------------4ebf00fbcf09\r\nContent-Disposition: form-data; name="example"\r\n\r\ntest\r\n------------------------------4ebf00fbcf09--\r\n' http://localhost:3000/test
Run Code Online (Sandbox Code Playgroud)

注意:$'blar'语法是这样的,bash会将\ r \n解析为CRLF令牌.感谢这个提示的答案.


Cam*_*tin 5

这就是我正在使用的,我认为它很干净,不需要临时文件,也不需要占用 RAM,以防您想上传整个文件(因此无需将文件读入内存)。

# Set these two.
file='path/to/yourfile.ext'
url='http://endpoint.example.com/foo/bar'

delim="-----MultipartDelimeter$$$RANDOM$RANDOM$RANDOM"
nl=$'\r\n'
mime="$(file -b --mime-type "$file")"

# This is the "body" of the request.
data() {
    # Also make sure to set the fields you need.
    printf %s "--$delim${nl}Content-Disposition: form-data; name=\"userfile\"${nl}Content-Type: $mime$nl$nl"
    cat "$file"
    printf %s "$nl--$delim--$nl"
}

# You can later grep this, or something.
response="$(data | curl -# "$url" -H "content-type: multipart/form-data; boundary=$delim" --data-binary @-)"
Run Code Online (Sandbox Code Playgroud)