任务是将请求发布到某个TTS(文本到语音)端点,并从响应中获取音频。 端点位于专用网络中,因此我无法与您共享以直接进行测试,但是我的问题不是特定于域的,我认为这是一个一般性的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
requests.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脚本主要构造请求内容,然后调用httplib.HTTPConnection..request('POST',uri,一些BytesIO(),标头)。如果需要,我可以在此处粘贴代码。
现在我要使用python 3请求库进行重写。
我搜索了请求doc和一个存在的SO question,并编写了以下代码,但出现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'))
这并不奇怪,因为在我的request.txt
中,有一个特殊的Content-Disposition:Content-Disposition:form-data; name =“ TtsParameter”; paramName =“ TEXT_TO_READ”,在任何教程中都很少见。
所以我的问题是如何将paramName =“ TEXT_TO_READ”传递给请求?
更新
最新的python代码现已推送到github。 https://github.com/LeiYangGH/py3requeststts
答案 0 :(得分:1)
无法通过原始请求执行此操作。
用工具带思想来做是一种不太理想的方法。
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)