используя flask -restplus, я создал минимальный flask API, который должен принимать тело запроса POST JSON, а также анализировать и передавать параметр для вызова функции API и возврата вывода в конечную точку сервера. Я создал api.model
схему для ввода JSON данных. Я хочу, чтобы мой минимальный API-интерфейс правильно понимал и анализировал тело POST requst JSON и передавал параметр в функцию API. Для этого я попытался request
, reqparse
, но это не работает.
input JSON body
{
"body": {
"gender": "M",
"feat_a": {
"value": 11,
"device": "roch"
},
"feat_b": {
"value": 32,
"device": "cobas"
},
"feat_c": {
"value": 45,
"device": "roch"
}
}
}
всякий раз, когда POST-запрос JSON body правильно анализируется и передается моей пользовательской функции, моя пользовательская функция ожидает такой же POST-запрос тело. Вот как my_func
ожидает ввода json_data
в качестве параметра:
library(jsonlite)
my_func <- function(json_data){
query=fromJSON(json_data)
data=query$body
## do something
}
минимальный flask API :
from flask_restplus import fields
from flask import Flask, jsonify
from flask_restplus import Api, Namespace, Resource, fields, reqparse, inputs
import rpy2
import rpy2.robjects as robjects
from rpy2.robjects.packages import importr
##
app = Flask(__name__)
api = Api(app, version='1.0')
ns = Namespace('test')
features_attr = api.model('features', {
'value': fields.Integer(required=True),
'device': fields.String(required=True)
})
feat_root_objs = api.model('main', {
'gender': fields.String(required=True),
'features': fields.List(fields.Nested(features_attr, required=True))
})
@ns.route('/hello')
class helloWorld(Resource):
@ns.expect(feat_root_objs, validate=False)
def post(self):
parser = reqparse.RequestParser()
parser.add_argument('gender', type=str)
parser.add_argument('features', type=str, required=True)
args = parser.parse_args()
myfuncs = robjects.r.source("my_func.R")
res = myfuncs(args)
return jsonify({'which features are used': res})
if __name__ == '__main__':
api.add_namespace(ns)
app.run(debug=True)
, но я не могу понять Как передать данные запроса POST JSON в функцию API. В приведенной выше попытке у меня есть следующее сообщение об ошибке в теле ответа:
{
"errors": {
"features": "Missing required parameter in the JSON body or the post body or the query string"
},
"message": "Input payload validation failed"
}
Есть идеи, чтобы заставить эту работу? Как заставить функцию API потреблять данные запроса POST JSON? есть идеи?