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

Python请求POST Multipart/form-data在内容处置中附加参数

冀胤运
2023-03-14

任务是将请求发布到某些TTS(文本到语音)endpoint,并从响应中获取音频。endpoint位于专用网络中,因此我无法与您共享以直接测试,但我的问题不是特定于域的,我认为这是一个一般的http问题。

现有的工作curl和python2脚本如下:

curl -v  -H  "Content-Type:multipart/form-data;boundary=message_boundary_0001" -H "Accept:audio/ogg;codecs=opus;" --data-binary @request.txt ip:port/someother/ -m 10 -o response.txt

请求。txt:

    --message_boundary_0001--
Content-Disposition: form-data; name="RequestData"
Content-Type: application/json; charset=utf-8

{
    jsondata1
}
--message_boundary_0001--
Content-Disposition: form-data; name="TtsParameter"; paramName="TEXT_TO_READ"
Content-Type: application/json; charset=utf-8

{
   jsondata2
}
--message_boundary_0001--

python2脚本主要构造请求内容,然后调用http lib。请求('POST',uri,一些BytesIO(),标头)。

现在我想使用Python3请求库重写。

我已经搜索了请求文档和一个存在的SO问题,并编写了以下代码,但有400个错误:

import requests
from requests_toolbelt import MultipartEncoder

headers = {'Accept': 'audio/ogg;codecs=opus;',
           'Connection': 'keep-alive',
           'Content-Type': 'multipart/form-data;boundary=message_boundary_0001',
           }

RequestData = '''{
    jsondata1
}'''

TtsParameter_TEXT_TO_READ = '''{
   jsondata2
}'''

# url_origin = 'https://httpbin.org/post' # for debugging
url = 'http://ip:port/someother/'
resp = requests.post(url, headers=headers,
                     files={'RequestData': (None, RequestData), 'TtsParameter': (None, TtsParameter_TEXT_TO_READ)},
                     timeout=10)
print(resp.status_code)
print(resp.content.decode('utf-8'))

这并不奇怪,因为在我的curlrequest.txt中有一个特殊的内容处理:内容处理:表单数据;名称="TtsParameter";参数名称="TEXT_TO_READ",这在任何教程中都很少看到。

所以我的问题是如何将paramName=“TEXT\u to\u READ”传递给请求?

最新消息

最新的python代码现在被推送到github。https://github.com/LeiYangGH/py3requeststts

共有1个答案

章烨烨
2023-03-14

对于普通请求,没有办法做到这一点。

有一种不太理想的方法可以用工具带思想来实现。

from requests_toolbelt.multipart import encoder


mpe = encoder.MultipartEncoder(fields={'RequestData': (None, RequestData), 'TtsParameter': (None, TtsParameter_TEXT_TO_READ)})
for part in mpe.parts:
   if 'name="TtsParameter"' in part.headers:
       part.headers = part.headers.replace('name="TtsParameter"',
                                           'name="TtsParameter"; paramName="TEXT_TO_READ"')

headers.update({'Content-Type': mpe.content_type})
requests.post(url, headers=headers, data=mpe)
 类似资料:
  • 我必须使用REST API将文件和信息上传到服务器。该API使用多部分形式,但我似乎无法正确使用它。 null 我尝试了几种方法,比如下面的代码,但是我不断从服务器得到错误的请求。

  • 如何在Python中用请求发送?如何发送文件,我明白了,但是如何用这种方法发送表单数据就不明白了。

  • 我正在使用Spring微服务构建微服务,我有两个相关的问题。 1。我在Api网关(即Zuul服务器)中有Spring安全性,现在Zuul不会转发任何请求,如果我已经从流中读取请求一次以身份验证(从POST请求中获取用户名/通行证) 如何读取请求,然后再次将相同的请求转发给下游服务? 2.Zuul没有转发request.set属性()到下游服务,所以一个解决办法是使用ctx.addZuulask e

  • 问题内容: 如何在python中发送带有请求的请求?我了解如何发送文件,但是通过这种方法如何发送表单数据尚不清楚。 问题答案: 基本上,如果你指定参数(字典),则将发送m而不是。你不限于在该词典中使用实际文件,但是: 可以让你知道你发布了哪些标题;在我们有: 更好的是,你可以通过使用元组而不是单个字符串或字节对象来进一步控制每个部分的文件名,内容类型和其他标题。该元组应该包含2到4个元素;文件名,

  • 使用firefox浏览器,我登录到一个下载站点,然后单击其中一个查询按钮。弹出一个名为“Opening report1.csv”的小窗口,我可以选择“打开”或“保存文件”。我保存文件。 对于这个动作,实时HTTP标头向我展示: https://myserver/ReportPage?下载 获取 /ReportPage?下载 HTTP/1.1 200 OK Date: Sat,30 Dec2017

  • 请求参数: 我想使用以下方法在Spring MVC中获取请求参数: 类定义如下: 发送请求时,我收到错误信息: bean类[com.example.demo.param.User]的无效属性“detail[gender]:非法获取属性“detail”引发异常;嵌套的异常是org。springframework。豆。NullValueInTestedPathException:bean类[com.e