在 POST 请求(python 请求)后获取响应/返回值

时间:2021-01-09 13:05:33

标签: python python-requests

我正在尝试将图像发送到我的 API,然后从中获取结果。例如我使用

发送一个bmp图像文件
file = {"img": open("img.bmp)}
r = requests.post(url, files = file)

现在我陷入了如何从 API 读取结果的问题。

通常我们将数据值发送到 API 并获得结果

data = {"data":"MyDataString"}
r = requests.get(url, params = data)

但我需要发送一个图像。我尝试寻找在 GET 请求中发送图像或在 POST 请求中使用 r.content 的方法,但无法使其工作。

为了更好地可视化问题,这里是一个例子: 考虑一个 API,您可以在其中发送图像并在结果中获取处理后的图像。

希望你能指引我走向正确的方向。

2 个答案:

答案 0 :(得分:1)

这是对您的程序的修改,它将您的程序发布到一个 URL,并期望返回 BMP 图像并将输出写入 stdout,您可以将其重定向到磁盘文件。然而,关键是返回的图像是字节流 r.content。随心所欲。

import requests
import sys

url = 'some-url'
with open("img.bmp", "rb") as f:
    file = {"img": f}
    r = requests.post(url, files=file)
sys.stdout.buffer.write(r.content)

这是一个位于 URL“some-url”的 Python CGI 程序示例。这只是返回原始 BMP:

#!/usr/bin/env python3
import cgi
import cgitb
import sys

cgitb.enable()

form = cgi.FieldStorage()
fileitem = form['img']
bmp = fileitem.file.read()

print('Content-Type: img/bmp\r\n\r\n', end='', flush=True)
# just send back the original image unmodified
sys.stdout.buffer.write(bmp)

答案 1 :(得分:1)

我找到了完成这项工作的方法。 (使用 POST 请求发送和接收图像)

在使用与有问题的 POST 请求相同的方法发送文件时,我收到作为 base64 编码字符串的结果图像。我只需要从 r.content 读取它并解码。

调试 我在 POST 请求中使用 httpbin.org 作为我的 url 来查看我发送的数据。

r = requests.post("https://httpbin.org", files = file)

解决方案 为了解决这个问题,我根据本指南使用了解码/编码方法here

Booboo 的回答帮助我找到了这个解决方案。

希望这会对其他人有所帮助。