【问题标题】:Converting curl with --form to python requests使用 --form 将 curl 转换为 python 请求
【发布时间】:2020-05-21 12:11:32
【问题描述】:

我有一个这样的 curl 请求:

curl -X POST http://mdom-n-plus-1.nonprod.appsight.us:8081/mesmerdom/v1/getByScreen -F "data={\"screen\":{\"screen-id\":\"57675\"}}"

我正在尝试使用类似这样的方法将其转换为 python:

import requests
import json
url = "http://mdom-n-plus-1.nonprod.appsight.us:8081/mesmerdom/v1/getByScreen"
payload = {"data": json.dumps({"screen":["screen-id", "57675"]})}
req = requests.post(url, data=payload)
print (req.text)

但我收到以下错误:

io.finch.Error$NotPresent: Required param 'data' not present in the request.

在这种情况下,将 bash curl 调用转换为 python 请求的最佳方法是什么?

【问题讨论】:

  • "data={\"screen\":{\"screen-id\":\"57675\"}}" 由于外壳而被转义。所以你不需要做json.dumps。将{"data":{"screen":{"screen-id":"57675"}}} 中的json 参数传递给json 参数
  • 我这样做 payload = {"data":{"screen":{"screen-id":"57675"}}} req = requests.post(url, data=json.dumps(payload)) 。我仍然得到同样的错误。
  • 即使我使用json参数payload = {"data":{"screen":{"screen-id":"57675"}}} req = requests.post(url, json=payload),我也会得到同样的错误。
  • -F 在 curl 中是表单数据。我认为如果您执行 json.dumps 并在files 中发送内容,这将起作用。您只需将 data=payload 从原始代码更改为 files=payload
  • 如果我这样做payload = {'data': json.dumps({"screen":["screen-id", "57675"]})} req = requests.post(url, files=payload) ,我会得到同样的错误io.finch.Error$NotPresent: Required param 'data' not present in the request.

标签: python curl python-requests


【解决方案1】:

欢迎来到stackoverflow.com

curl-F 开关表示form-encoded 数据。

传递data 使Content-Type: x-www-form-urlencoded 但似乎服务器正在接受Content-Type: multipart/form-data 所以我们也需要传递files。但由于服务器正在寻找form 中的实际数据,我们还需要传递data。 所以这应该有效:

import requests

url = "http://mdom-n-plus-1.nonprod.appsight.us:8081/mesmerdom/v1/getByScreen"

payload = { 'data' : '{"screen" : {"screen-id": "57675"}}'}

req = requests.post(url, files=dict(data='{"screen":{"screen-id":"57675"}}'), data=payload)
print (req.text)

希望这会有所帮助。

【讨论】:

  • 仍然出现同样的错误io.finch.Error$NotPresent: Required param 'data' not present in the request.
  • 你能运行这个req = requests.options(url) 并显示输出吗?
  • <Response [404]>
  • 我有一个这样的 curl 请求: curl -X POST ${HOST}/mesmerdom/v3/getByImageAndDom -F "data=$DATA" -F "dom=@$DOM" -F "图像=@$IMG" 。如何在 python 中传递 dom 和 image 参数?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-30
  • 2020-03-18
  • 2023-04-02
  • 2016-08-24
相关资源
最近更新 更多