Как отправить HTTP-запрос с файлом Avro? - PullRequest
0 голосов
/ 17 января 2020

У меня есть flask API, ожидающий почтовый запрос в Avro. Проблема в том, что я не уверен, как отправлять запросы Avro для проверки. API читает данные, используя fastavro.reader (io.BytesIO (request.data)) *

Я попытался использовать почтальон: в заголовке определение Content-Type как «avro / binary». возможно https://github.com/postmanlabs/postman-app-support/issues/4435

Я также пробовал curl:

curl -X POST -H "Content-Type: avro/binary" --data "{"city": "ALA",
"number_of_points": 42, "transport": "CAR", "subtype": "PURCHASE"}"
"http://localhost:8080/invocations"

Однако Fastavro возвращает следующую ошибку:

Файл "fastavro / _read.pyx ", строка 725, в fastavro._read.file_reader. init

ValueError: невозможно прочитать заголовок - это файл avro?

Ресурсы:

https://github.com/fastavro/fastavro

https://avro.apache.org/

1 Ответ

1 голос
/ 17 января 2020

Хорошо, я предполагаю, что у вас есть действительный файл .avro, в соответствии с примером в документах fastavro.

Это становится простым случаем обработки этого как стандартная загрузка файлов на Flask. Поэтому вместо того, чтобы брать данные из request.data, вы можете сделать что-то вроде:

from fastavro import reader
from flask import Flask, request
app = Flask(__name__)

# This is really basic and could use some validation
@app.route('/invocations', methods=['POST'])
def upload():
    if request.method == 'POST':
        file = request.files['file']
        for record in reader(file):
                print (record)
        return 'uploaded'

Затем вы можете отправить свой файл в конечную точку с помощью curl:

curl -i -X POST -F 'file=@out.avro' "http://localhost:5000/invocations" -H 'ContentType: multipart/form-data'

Это должно привести к что-то на консоли сервера, например:

 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
{'station': '011990-99999', 'time': 1433269388, 'temp': 0}
{'station': '011990-99999', 'time': 1433270389, 'temp': 22}

Если вы хотите sh отправить с использованием библиотеки запросов, вы можете сделать что-то вроде этого:

import requests

def upload(filename):
    headers={'ContentType': 'multipart/form-data'}
    with open(filename,'rb') as f:
        files = {'file': f}
        url='http://localhost:5000/invocations'
        r = requests.post(url, files=files)
        print (r.content, r.status_code)

upload('out.avro')
...