Python的等效curl--form: 创建多部分表单数据POST请求,数据位于“form”参数中。

2024-10-01 17:41:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我在寻找一个与curl命令等价的python:

 curl --referer "https://myreferer" --insecure --form "myparam=1234" https://myurl

这导致以下请求(取自httpbin.org/post)公司名称:

^{pr2}$

如您所见,数据“myparam”是以“form”参数传递的。在

我试图通过pythonsrequests模块构造这样一个请求,最后得到了以下代码:

import requests
payload={'myparam':'1234'}
url="http://httpbin.org/post"
headers={'User-Agent': 'Mozilla 5.0','referer':'https://myreferer'}
r = requests.post(url, files=payload, headers=headers,verify=False)

但是请求库将数据放入“files”参数中。因此结果请求如下所示:

{
  "args": {}, 
  "data": "", 
  "files": {
    "pws": "1234"
  }, 
  "form": {}, 
  "headers": {
    "Accept": "*/*", 
    "Accept-Encoding": "gzip, deflate", 
    "Connection": "close", 
    "Content-Length": "143", 
    "Content-Type": "multipart/form-data; boundary=a878ad29e28d47ffb00e0631319ed0e2", 
    "Host": "httpbin.org", 
    "Referer": "https://myreferer", 
    "User-Agent": "Mozilla 5.0", 
    "X-Request-Id": "60f5d65e-789a-47fe-bba3-dab88f9bbb65"
...

因此,数据在错误的地方传递,即在“files”参数内,这使得Apache被“501 Not Implemented”响应扼杀。在

有人能建议一下如何用Python实现这样的请求吗?(我知道我可以将curl作为一个子进程来调用,但是由于我想执行许多这样的请求,所以我希望有一个仅限于python的解决方案(希望它的性能更好)。在

而且,正如您可能已经注意到的,我还需要接受一个自签名证书并发送一个referer头。在

如果有人能提出一个简单的方法来解决这个问题,我会很高兴的。在

谢谢!在

编辑:我已经尝试使用请求.post命令,但这会导致不同的内容类型头(application/x-www-form-urlencoded)。请注意curl请求的content-type头。在

编辑:我可能需要的是通过请求.post命令。但是我还需要计算多部分/表单数据头字符串的“边界”部分。我想肯定有一种比手动构造页眉和计算边界更简单的方法。在


Tags: 数据httpsorg命令formfilescurlpost
2条回答

file-like object用于files会导致multipart/form-data内容类型

让我们准备好电话所需的一切,从“平常”开始:

>>> import requests
>>> data = {"myparam": "1234"}
>>> headers = {'User-Agent': 'Mozilla 5.0','referer':'https://myreferer'}

强制requests使用“multipart/formdata”的诀窍是至少给它一个类似于 对象。在

^{pr2}$

buff现在是我们可以作为files参数值传入的类似文件的对象。在

>>> req = requests.post(url, data=data, headers=headers, stream=True, files=buff)
>>> print req.text
{
  "args": {}, 
  "data": "", 
  "files": {}, 
  "form": {
    "myparam": "1234"
  }, 
  "headers": {
    "Accept": "*/*", 
    "Accept-Encoding": "gzip, deflate", 
    "Connection": "close", 
    "Content-Length": "130", 
    "Content-Type": "multipart/form-data; boundary=0b3bbec1f5c844a1b7377aacfe701f02", 
    "Host": "httpbin.org", 
    "Referer": "https://myreferer", 
    "User-Agent": "Mozilla 5.0", 
    "X-Request-Id": "988a0467-1c32-45aa-a75c-fba5aa8d632e"
  }, 
  "json": null, 
  "origin": "85.160.45.204", 
  "url": "http://httpbin.org/post"
}

如果要使用自签名证书与https通信,请使用verify=False

>>> req = requests.post(url, data=data, headers=headers, stream=True, files=buff, verify=False)

关于requests.request的帮助还注意到,verify的值可能是“一个CA包路径”,因此 无法显式确保服务器正在使用预期的自签名证书。但是 我从来没有尝试过。在

不幸的是,如果不想将数据作为文件发送,则必须使用第三方库requests_toolbelt。一旦你pip install requests-toolbelt,你就可以

from requests_toolbelt import MultipartEncoder
import requests

payload = MultipartEncoder({'myparam': '1234'})
r = requests.post(url, data=payload, headers={'Content-Type': payload.content_type})

当然,您也可以设置其他标题,这只是根据您的需要使用工具带的一个快速示例。在

如果要验证证书,可以向PEM文件传递一个带有完整路径的字符串,例如

^{pr2}$

相关问题 更多 >

    热门问题