使用请求(不是 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 请求发送参数

html中通过js获取接口JSON格式数据解析以及跨域问题

如何在浏览器中通过 POST 请求加载外国图像?

在 Android 的 OKhttp 中通过 POST 请求发送 JSON 正文

解决在Unity3D中通过Post向服务器提交请求,表单中带有中文导致的乱码问题!

解决在Unity3D中通过Post向服务器提交请求,表单中带有中文导致的乱码问题!