Колба Python: отправка POST на внешний API - PullRequest
0 голосов
/ 12 сентября 2018

Я создаю микросервис для API отдыха Camunda, используя python flask и flask_restplus, python 3.7.0. Camunda работает в док-контейнере, доступном через localhost, порт 8080. Все запросы GET к моему микросервису перенаправляются в API Camunda через перенаправление, которое работает отлично.

POST-запросы (проверенные почтальоном, как предлагается в официальном руководстве) не пересылаются должным образом с помощью

redirect(camunda_api_url) или же request.post(camunda_api_url)

Запрос POST через почтальона выполняется с помощью

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

Когда я выполняю POST непосредственно в REST-API Camunda, все работает просто отлично, но когда я пытаюсь перенаправить свой пост через микросервис, я получаю код состояния 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? Вопрос не в API Camunda, а в том, как правильно перенаправить запрос 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'])

1 Ответ

0 голосов
/ 24 октября 2018

ОК, я решил эту проблему с помощью:

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

где camunda_api_url - это конечная точка в движке Camunda REST, file_name - это имя загружаемого файла, И путем добавления get-метод, использующий просто:

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

Без метода get сообщение не работает.

-> установка темы для решения. :)

...