我正在使用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'])
答案 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)