Python Вызов функции Google Cloud из Flutter. Ответ недействителен JSON объект - PullRequest
0 голосов
/ 02 мая 2020

Я новичок в Google Cloud Platform и Flutter и хочу вызвать функцию из своего проекта flutter. Этот GCF вычисляет расстояние Левенштейна между двумя строками и реализуется следующим образом:

from flask import jsonify, abort
from Levenshtein import distance as levenshtein_distance, ratio, editops as string_ops_needed

def json_abort(status_code, message):
    data = {
        'error': {
            'code': status_code,
            'message': message
        }
    }
    response = jsonify(data)
    response.status_code = status_code
    abort(response)

def word_distance(request, decoded_token = None):

    """HTTP Cloud Function.
    Args:
        request (flask.Request): The request object.
        <http://flask.pocoo.org/docs/1.0/api/#flask.Request>
    Returns:
        The response text, or any set of values that can be turned into a
        Response object using `make_response`
        <http://flask.pocoo.org/docs/1.0/api/#flask.Flask.make_response>.
    """
    request_json = request.get_json(silent=True)
    '''request_args = request.args'''

    if request_json and "candidate_string" in request_json and "correct_string" in request_json:
        candidate_string=request_json["candidate_string"]
        correct_string=request_json["correct_string"]

        distance=levenshtein_distance(candidate_string,correct_string)

        response = jsonify(distance=distance, status_code=200)
        return response
    else:
        json_abort(400, message="Missing params")

Когда я пытаюсь вызвать его из флаттера, со следующим кодом Флаттер возвращает Исключение произошло. PlatformException ( PlatformException (functionsError, функция Cloud завершилась с ошибкой., {Сообщение: Ответ недействителен JSON объект., Подробности: null, код: INTERNAL}))

final HttpsCallable callable = CloudFunctions.instance
        .getHttpsCallable(functionName: 'word_distance')
          ..timeout = const Duration(seconds: 10);

    dynamic result = await callable.call(
      <String, dynamic>{
        "candidate_string": candidateString,
        "correct_string": correctString
      },
    );

Когда я проверяю функцию в GCF с {"candidate_string": "helo worlt", "correct_string": "hello world"}

Возвращает результат {"distance":2,"status_code":200}

Есть идеи о том, почему это происходит и как решить эту проблему? Я нашел этот пост , но он не показывает конкретный c пример того, как продолжить.

Ответы [ 2 ]

1 голос
/ 03 мая 2020

После просмотра журнала GCF, как это было предложено Дастином Ингрэмом, я обнаружил, что к моей функции обращались, но к параметрам и выводу не все в порядке. Поэтому, после тщательной проверки этого примера и учета спецификации Google для https.onCall я обнаружил, что необходимо вернуть 'data' / 'error' json .

Я изменил свой GCF на следующий, и теперь он возвращает ожидаемое значение.

from flask import jsonify, abort

from Levenshtein import distance as levenshtein_distance, ratio, editops as string_ops_needed

def word_distance(request):

    """HTTP Cloud Function.
    Args:
        request (flask.Request): The request object.
        <http://flask.pocoo.org/docs/1.0/api/#flask.Request>
    Returns:
        The response text, or any set of values that can be turned into a
        Response object using `make_response`
        <http://flask.pocoo.org/docs/1.0/api/#flask.Flask.make_response>.
    """

    request_json = request.json.get('data')

    if "candidate_string" in request_json and "correct_string" in request_json:
        candidate_string=request_json["candidate_string"]
        correct_string=request_json["correct_string"]

        distance=levenshtein_distance(candidate_string,correct_string)

        return jsonify({
            'data': {
                'distance': distance
            }
        })
    else:
        data = {
            'error': {
                'code': 400,
                'message': 'Missing params'
            }
        }
        response = jsonify(data)
        response.status_code = 400
        return(response)
0 голосов
/ 02 мая 2020

Ну, вы вызываете функцию с аргументом Map, который, я думаю, вызывает ошибку, потому что она не может быть правильно проанализирована в JSON.

Попробуйте использовать

<String, dynamic>{
        '"candidate_string"': '"$candidateString"',
        '"correct_string"': '"$correctString"'
      }

Я получал эту ошибку много раз при отправке json данных по протоколу TCP, и вышеописанная проблема сработала для меня, по этой причине она может быть легко проанализирована в JSON

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...