使用请求(不是 GET)在 Python 中通过 Post HTTP Request 下载 PDF
Posted
技术标签:
【中文标题】使用请求(不是 GET)在 Python 中通过 Post HTTP Request 下载 PDF【英文标题】:Download PDF via Post HTTP Request in Python using Request (not GET) 【发布时间】:2022-01-11 08:26:11 【问题描述】:我的问题与许多其他问题略有不同。我正在做一个带有下载 PDF(不是文本)响应的 POST,您可以在下面看到堆栈跟踪。我找不到任何答案。
base_url = "https://homeland.my.salesforce.com"
action = base_url + "/sfc/p/#1I000003o0lm/a/8W000001Dmtq/GT9FLcwrLX3QQjVDLCEonLxmCi6nG4VqCUJzDyK80GU"
qdata = "compositePageName",
"1I000003o0lm/a/8W000001Dmtq/GT9FLcwrLX3QQjVDLCEonLxmCi6nG4VqCUJzDyK80GU"
#req = requests.post(url=action, data=qdata)
req = requests.post(url=action, stream=True, data=qdata)
# blows up on above method with message
C:\Users\Quentin_Sarafinchan\PycharmProjects\02_getproperty\venv\Scripts\python.exe "C:\Program Files\JetBrains\PyCharm Community Edition 2021.2.3\plugins\python-ce\helpers\pydev\pydevd.py " --multiproc --qt-support=auto --client 127.0.0.1 --port 50548 --file C:/Users/Quentin_Sarafinchan/PycharmProjects/02_getproperty/main.py index.html --debug 连接到 pydev 调试器(内部版本 212.5457.59) 调试 - 打开 https://homeland.my.salesforce.com/sfc/p/1I000003o0lm/a/8W000001Dmtq/GT9FLcwrLX3QQjVDLCEonLxmCi6nG4VqCUJzDyK80GU" style="mso-style-priority:100 !important;text-decoration:none;-webkit-text-size-adjust:none;-ms-text-size-adjust:none; mso-line-height-rule:exactly;color:#FFFFFF;font-size:14px;border-style:solid;border-color:#BB9A65;border-width:10px 15px;display:inline-block;background:# BB9A65;边框半径:0px; font-family:'open sans', 'helvetica neue', helvetica, arial, sans-serif;font-weight:bold;font-style:normal;line-height:17px;width:auto 文本对齐:中心“目标=“_blank”> 网址:https://homeland.my.salesforce.com/sfc/p/1I000003o0lm/a/8W000001Dmtq/GT9FLcwrLX3QQjVDLCEonLxmCi6nG4VqCUJzDyK80GU 回溯(最近一次通话最后): 文件“C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.2544.0_x64__qbz5n2kfra8p0\lib\http\client.py”,第 1001 行,在发送中 self.sock.sendall(数据) sendall 中的文件“C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.2544.0_x64__qbz5n2kfra8p0\lib\ssl.py”,第 1201 行 以 memoryview(data) 作为视图,view.cast("B") 作为 byte_view: TypeError:memoryview:需要一个类似字节的对象,而不是'str'
在处理上述异常的过程中,又发生了一个异常:
Traceback(最近一次调用最后一次): 文件“C:\Users\Quentin_Sarafinchan\PycharmProjects\02_getproperty\venv\lib\site-packages\requests\api.py”,第 61 行,在请求中 返回 session.request(method=method, url=url, **kwargs) 文件“C:\Users\Quentin_Sarafinchan\PycharmProjects\02_getproperty\venv\lib\site-packages\requests\sessions.py”,第 542 行,在请求中 resp = self.send(prep, **send_kwargs) 文件“C:\Users\Quentin_Sarafinchan\PycharmProjects\02_getproperty\venv\lib\site-packages\requests\sessions.py”,第 655 行,发送 r = adapter.send(request, **kwargs) 文件“C:\Users\Quentin_Sarafinchan\PycharmProjects\02_getproperty\venv\lib\site-packages\requests\adapters.py”,第 439 行,发送 resp = conn.urlopen( 文件“C:\Users\Quentin_Sarafinchan\PycharmProjects\02_getproperty\venv\lib\site-packages\urllib3\connectionpool.py”,第 699 行,在 urlopen httplib_response = self._make_request( _make_request 中的文件“C:\Users\Quentin_Sarafinchan\PycharmProjects\02_getproperty\venv\lib\site-packages\urllib3\connectionpool.py”,第 394 行 conn.request(方法,网址,**httplib_request_kw) 文件“C:\Users\Quentin_Sarafinchan\PycharmProjects\02_getproperty\venv\lib\site-packages\urllib3\connection.py”,第 239 行,在请求中 super(HTTPConnection, self).request(方法, url, body=body, headers=headers) 文件“C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.2544.0_x64__qbz5n2kfra8p0\lib\http\client.py”,第 1285 行,在请求中 self._send_request(方法、url、正文、标头、encode_chunked) _send_request 中的文件“C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.2544.0_x64__qbz5n2kfra8p0\lib\http\client.py”,第 1331 行 self.endheaders(正文,encode_chunked=encode_chunked) 文件“C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.2544.0_x64__qbz5n2kfra8p0\lib\http\client.py”,第 1280 行,在 endheaders self._send_output(message_body, encode_chunked=encode_chunked) _send_output 中的文件“C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.2544.0_x64__qbz5n2kfra8p0\lib\http\client.py”,第 1079 行 自我发送(块) 文件“C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.2544.0_x64__qbz5n2kfra8p0\lib\http\client.py”,第 1005 行,在发送中 self.sock.sendall(d) sendall 中的文件“C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.2544.0_x64__qbz5n2kfra8p0\lib\ssl.py”,第 1201 行 以 memoryview(data) 作为视图,view.cast("B") 作为 byte_view: TypeError:memoryview:需要一个类似字节的对象,而不是'str' python-BaseException
【问题讨论】:
【参考方案1】:需要使用字节数组
#qdata = "compositePageName",
# "1I00EonLxmCi6nG4VqCUJzDyK80GU"
nm = "compositePageName"
val = "LxmCi6nG4VqCUJzDyK80GU"
s = nm + "=" + val
qdata = bytearray(s, 'utf-8')
mv = memoryview(qdata)
req = requests.post(url=action, stream=True, data=mv)
【讨论】:
以上是关于使用请求(不是 GET)在 Python 中通过 Post HTTP Request 下载 PDF的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Dio 或 http 在 Flutter 中通过 GET 请求发送参数
在 Android 的 OKhttp 中通过 POST 请求发送 JSON 正文