【问题标题】:http: From python request to equivalent curl commandhttp:从 python 请求到等效的 curl 命令
【发布时间】:2020-09-17 02:47:32
【问题描述】:

我想通过 MS-Flow 上传到 Amazon s3。通过 python 发布的 http 帖子是这样的

    with open('../myfile.txt', 'rb') as f:
        files = {'file': (object_name, f)}
        http_response = requests.post(
            <aws-s3-url>, 
            data={
                'key': 'myfile.txt', 
                'x-amz-algorithm': 'AWS4-HMAC-SHA256', 
                'x-amz-credential': '<creds>',
                'x-amz-date': '20200529T120357Z', 
                'policy': '<policy>', 
                'x-amz-signature': '<signature>'
            }, 
            files=files
        )

原始请求正文和标头如下所示

--ed1fdd226f0d04d8691a17ceaf914a7e
Content-Disposition: form-data; name="key"

myfile.txt
--ed1fdd226f0d04d8691a17ceaf914a7e
Content-Disposition: form-data; name="x-amz-algorithm"

AWS4-HMAC-SHA256
--ed1fdd226f0d04d8691a17ceaf914a7e
Content-Disposition: form-data; name="x-amz-credential"

<creds>
--ed1fdd226f0d04d8691a17ceaf914a7e
Content-Disposition: form-data; name="x-amz-date"

20200529T120357Z
--ed1fdd226f0d04d8691a17ceaf914a7e
Content-Disposition: form-data; name="policy"

<policy>
--ed1fdd226f0d04d8691a17ceaf914a7e
Content-Disposition: form-data; name="x-amz-signature"

<signature>
--ed1fdd226f0d04d8691a17ceaf914a7e
Content-Disposition: form-data; name="file"; filename="myfile.txt"

test test test
--ed1fdd226f0d04d8691a17ceaf914a7e--

{'User-Agent': 'python-requests/2.23.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Length': '1287', 'Content-Type': 'multipart/form-data; boundary=ed1fdd226f0d04d8691a17ceaf914a7e'}

通过 python 发送请求可以正常工作。 但是当我在 MS-Flow 中或通过 curl 使用原始 http-request-body 时,它会失败并显示

The body of your POST request is not well-formed multipart/form-data.

我使用的 curl 命令是

curl \
-d "--ed1fdd226f0d04d8691a17ceaf914a7e\r\nContent-Disposition: form-data; name="key"\r\n\r\nmyfile.txt\r\n--ed1..." \
-X POST \
-H "Content-Type: multipart/form-data" \
-H "boundary: ed1fdd226f0d04d8691a17ceaf914a7e" \
-H "Accept': */*" \
-H "Connection': keep-alive" \
-H "Accept-Encoding': gzip, deflate" \
<aws-s3-url>

我也用过

-d "$(cat body)"

而不是原始字符串。这将换行符从“\r\n”更改为“\n”,但没有帮助。

我的问题有两个:

  1. 如何从上述 python 请求中正确派生一个有效的 curl 命令? (甚至可能是我需要在 MS-Flow 中输入的正确格式的正文)
  2. 为什么我的方法不起作用?

如果有人可以提供帮助会很高兴。非常感谢您,祝您有美好的一天!

【问题讨论】:

    标签: python http curl python-requests


    【解决方案1】:

    --data alias -d 使用 URL 编码对给定字符串进行编码。使用--trace - 查看输出到服务器的结果。

    如果你已经编码过这样的数据,你需要改用--data-binary

    您还可以使用-F key=value 单独指定每个字段并将它们作为多部分表单数据发送,这样更不容易出错,因为您不必自己进行编码。

    【讨论】:

    • 感谢您的帮助@Thomas,但这似乎不是答案。我在这两种情况下都使用了--trace(使用--data-binary 和--data),据我所知,没有区别。此外,我的本地测试服务器上的结果在两种情况下都是相同的,并且正文未成功解析。我可以看到通过 python requests.post 发送请求和使用 curl(在任何情况下)之间的主要区别是,当使用 python 时 request.data 包含正常的单反斜杠,而 curl 数据使用双反斜杠 '\\' 转义它们.知道为什么吗?顺便说一句,使用 -F 的方法效果很好。
    • 这可能是因为 shell 也在破坏字符串,因为它在双引号中。单引号可能会有所帮助,但我建议只使用 -F 并让 curl 担心转义。
    猜你喜欢
    • 1970-01-01
    • 2018-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多