当前位置: 首页 > 知识库问答 >
问题:

Python相当于curls--form:使用“form”参数中的数据创建多部分表单数据post请求

邴姚石
2023-03-14

我正在寻找与此curl命令等效的python:

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

这将导致以下请求(取自httpbin.org/post):

{
  "args": {}, 
  "data": "", 
  "files": {}, 
  "form": {
    "myparam": "1234"
  }, 
  "headers": {
    "Accept": "*/*", 
    "Connection": "close", 
    "Content-Length": "142", 
    "Content-Type": "multipart/form-data; boundary=----------------------------29a1ce32cc53", 
    "Host": "httpbin.org", 
    "Referer": "https://speedport.ip/hcti_start_passwort.stm", 
    "User-Agent": "curl/7.22.0 (x86_64-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3", 
    "X-Request-Id": "c67c4461-89d2-4c9f-a9f4-ebfe312c026c"
  }, 
...

如您所见,数据“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"
...

因此,数据在错误的地方传递,即在“文件”参数中,这使得Apache被“501未实现”响应窒息。

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

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

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

谢谢

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

编辑:我可能需要的是通过请求的headershtml" target="_blank">参数简单地发送正确的内容类型头、多部分/表单数据。指挥所。但我还必须计算“边界”——多部分/表单数据头字符串的一部分。我想一定有一种比手动构造标题和计算边界更简单的方法。

共有2个答案

孔经武
2023-03-14

不幸的是,如果您不想将数据作为文件发送,则必须使用第三方库——requests_toolbelt。一旦您pip安装请求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文件完整路径的字符串,例如。,

r = requests.get('https://somesite.com', verify='/Users/mhelwig/certificate.pem')
洪承天
2023-03-14

让我们准备好通话所需的一切,从“常规”材料开始:

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

强制请求使用Multipart/form-data的技巧是至少给它一个类似文件的对象。

>>> from StringIO import StringIO
>>> buff = StringIO("")

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通信,请使用验证=False

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

请求的帮助。request还注意到,verify的值可以是“一个CA_BUNDLE路径”,因此您可以明确地确保服务器使用的是您期望的自签名证书。但我从未尝试过这个。

 类似资料:
  • 问题内容: 我正在尝试通过带有POST请求的照片上传 根据自述文件,我应该能够做到这一点 问题是,这不起作用。我收到测试服务器的回复,说它转储了0个post变量。 我已经确认该HTML小页面服务器处于工作状态 所以问题是,请求模块在做什么?有没有更好的方法来发送节点? 问题答案: 经过更多研究后,我决定使用。这使得分段上传非常容易。

  • 在将FreshDesk集成到我的产品中时,我被用附件API创建票证所困扰。我使用高级Rest客户端测试API。我已经看到了许多关于栈溢出本身的论坛和问题,但我仍然对任何关于上传文件的多部分形式数据POST请求的回答不满意。 我想知道Advanced Rest Client中所需的请求格式以及标题 到目前为止,这是我正在使用的请求,但我没有得到正确的响应:

  • 以下API使用postman工作: Spring boot,后端代码: ReactJS,前端代码:我在中有对象数组。 触发功能的按钮: 我需要将我的前端(ReactJS)代码更改为,就像我使用postman发布请求一样。当前JS代码导致以下错误响应: Servlet。路径为[]的上下文中的servlet[dispatcherServlet]的service()引发了异常[请求处理失败;嵌套异常为o

  • 问题内容: 我正在尝试使用go将图像从计算机上传到网站。通常,我使用bash脚本将文件和密钥发送到服务器: 它工作正常,但我正在尝试将此请求转换为我的golang程序。 http://matt.aimonetti.net/posts/2013/07/01/golang-multipart-file-upload- example/ 我尝试了此链接和许多其他链接,但是,对于我尝试的每个代码,服务器的

  • 问题内容: 在Apache Commons HttpClient的3.x版本中,可以进行multipart / form-data POST请求(2004年的示例)。不幸的是,这在HttpClient的4.0版本中不再可能。 对于我们的核心活动“ HTTP”,多部分内容超出了范围。我们很乐意使用由其他项目维护的多部分代码,但我对此一无所知。几年前,我们曾尝试将多部分代码移至commons编解码器,

  • 表格是网络不可分割的一部分。 我们访问的几乎每个网站都为我们提供了提交或获取一些信息的表格。 要开始使用表单,我们将首先安装koa-body。 要安装它,请转到您的终端并使用 - $ npm install --save koa-body 用以下代码替换app.js文件内容。 var koa = require('koa'); var router = require('koa-router')