Python烧瓶:将POST转发到外部API

时间:2018-09-12 08:23:24

标签: redirect post flask microservices python-3.7

我正在使用python flask和flask_restplus,python 3.7.0为Camunda rest API构建微服务。 Camunda在docker容器中运行,该容器可通过localhost,端口8080访问。对我的微服务的所有GET请求都将通过重定向转发到Camunda API,效果很好。

POST请求(通过邮递员进行测试,如官方教程中所述)未使用正确转发

redirect(camunda_api_url) 要么 request.post(camunda_api_url)

通过邮递员的POST请求是使用

完成的
    Header: Content-Type: multipart/form-data
    Body: upload File Object (somefile.bpmn)

当我直接将帖子发布到Camunda REST-API时,一切正常,但是当我尝试通过微服务重定向帖子时,状态码为200,但文件未上传。

>

在我的端点上调试,我可以看到正在接收文件:

    print(request.files['upload'])
    <FileStorage: 'somefile.bpmn' ('application/octet-stream')>

因此文件传输成功,但是重定向不起作用。

我的端点方法如下:

    def post(self):
        print(request.files['upload'])
        test = requests.post(host_prefix + 'deployment/create', files=request.files)
        print(test.status_code)

通过以下方式修改request.post

    data=request.files
    data=request.files['upload']
    or omiting data completely

始终导致文件未上传。

尝试通过以下方式重定向

redirect(host_prefix + 'deployment/create', code=307)

还会导致文件无法上传。

如何将此发布请求正确重定向到Camunda API? 这不是关于Camunda API的问题,而不是关于如何将POST请求正确重定向到外部端点的问题。

P.S .:我创建了我的api和端点,如下所示:

    app = Flask(__name__)
    api = Api(app, version='0.1', title='BPMN-API', description='A BPMN-API for Camunda, implemented in python')
    ...
    api.add_resource(CreateDeployment,   api_prefix +  'deployment/create', methods=['POST'])

2 个答案:

答案 0 :(得分:0)

好的,我通过使用以下方法解决了这个问题:

requests.post(camunda_api_url, files={file_name:request.files['upload'].read()})

其中camunda_api_url是Camunda REST引擎的端点,file_name是要上传的文件的名称,并通过添加一个 获取方法,只需使用:

def get(self):
    camunda_api_url = "http://localhost:8080/engine-rest/deployment/create"
    return redirect(camunda_api_url)

没有get方法的帖子将无法正常工作。

->设置要解决的主题。 :)

答案 1 :(得分:0)

通过使用请求库很容易。该示例显示了具有相同密钥和其他表单数据的多个文件上传。图像来自一个名为“images”的表单

该示例从带有关键“图像”的表单中获取文件列表,并将该文件转发到另一个 URL 或 API。

images = request.files.getlist('images')
files = []
for image in images:
    files.append(("images", (image.filename, image.read(), image.content_type)))
r = requests.post(url=api_urls.insert_face_data_url, data={"apikey": apikey, "faceid": faceid},
                          files=files)