Как исправить ошибку «error»: «имя_параметра» при использовании REST API IBM Cloud Function? - PullRequest
0 голосов
/ 16 июня 2019

У меня есть действие в IBM Cloud Functions, которое получает только один параметр: "frame". Я использую Postman для проверки конечной точки API REST, предоставленной с действием. Однако, когда я предоставляю параметр frame, он возвращает следующее:

"response": {
        "result": {
            "error": "'frame'"
        },
        "status": "application error",
        "success": false
    }

Я столкнулся с этой проблемой, когда вызывал это действие в консоли IBM Cloud Functions. Я разрешаю это, стирая пробел во входном модале и добавляя его снова, затем он работает как брелок в консоли. Однако я не могу сделать то же самое с HTTP-запросом.

То, как я сейчас выполняю HTTP-запрос, выглядит так:

POST https://us-south.functions.cloud.ibm.com/api/v1/namespaces/{namespace}/actions/{action_name}?blocking=true&frame={value}

Действие должно вернуть ожидаемый результат, но сейчас этого не происходит. Пожалуйста, помогите мне, любые ответы будут великолепны!

EDIT:

Это код действия:

import requests, base64, json, cv2
from PIL import Image
from six import BytesIO

def json_to_dict(json_str):
    return json.loads(json.dumps(json_str))

def frame_to_bytes(frame):
    frame_im = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
    pil_im = Image.fromarray(frame_im)
    stream = BytesIO()
    pil_im.save(stream, format="JPEG")
    stream.seek(0)
    img_for_post = stream.read()
    img_base64 = base64.b64encode(img_for_post)
    return img_base64

def main(dict):
    cap = cv2.VideoCapture(dict['frame'])
    if not cap.isOpened():
        return { "error": "Unable to open video source" }
    ret, frame = cap.read()
    if ret is False:
        return { "error": "Unable to read video source" }

    # openALPR API part
    OPENALPR_SECRET_KEY = {my_secret_key}
    url = "https://api.openalpr.com/v2/recognize_bytes?recognize_vehicle=1&country=us&secret_key=%s" % (
        OPENALPR_SECRET_KEY)
    r = requests.post(url, data=frame_to_bytes(frame))
    resp = json_to_dict(r.json())
    print(resp)
    if not resp['results']:
        return { "error": "Plate number not recognized" }
    plates = []
    for plate in resp['results']:
        if plate['confidence'] < 75:
            pass
        else:
            print(plate['plate'])
            plates.append(plate['plate'])
    return { "plates": plates  }

Это ответ на активацию (возвращен статус 502 Bad Gateway согласно Почтальону):

{
    "activationId": "5a83396b9f53447483396b9f53e47452",
    "annotations": [
        {
            "key": "path",
            "value": "{namespace}/{name}"
        },
        {
            "key": "waitTime",
            "value": 5531
        },
        {
            "key": "kind",
            "value": "python:3.7"
        },
        {
            "key": "timeout",
            "value": false
        },
        {
            "key": "limits",
            "value": {
                "concurrency": 1,
                "logs": 10,
                "memory": 1024,
                "timeout": 60000
            }
        },
        {
            "key": "initTime",
            "value": 3226
        }
    ],
    "duration": 3596,
    "end": 1560669652454,
    "logs": [],
    "name": "{name}",
    "namespace": "{namesapce}",
    "publish": false,
    "response": {
        "result": {
            "error": "'frame'"
        },
        "status": "application error",
        "success": false
    },
    "start": 1560669648858,
    "subject": "{my_email}",
    "version": "0.0.7"
}

РЕДАКТИРОВАТЬ 2: Я также попытался включить его как веб-действие, чтобы увидеть, если оно что-то изменит. Однако это бесполезно. Когда я использую этот HTTP-запрос:

https://us-south.functions.cloud.ibm.com/api/v1/web/{namespace}/default/{action_name}?frame={value}

Я получаю:

{
    "code": "e1c36666f4db1884c48f028ef58243fc",
    "error": "Response is not valid 'message/http'."
}

что понятно, так как мои функции возвращают json. Однако, когда я использую , это HTTP-запрос:

https://us-south.functions.cloud.ibm.com/api/v1/web/{namespace}/default/{action_name}.json?frame={value}

Я получаю:

{
    "code": "010fc0efaa29f96b47f92735ff763f50",
    "error": "Response is not valid 'application/json'."
}

Я действительно не знаю, что здесь делать

1 Ответ

0 голосов
/ 17 июня 2019

Немного погуглив, я нашел кое-что, что работает для меня сейчас, хотя это может не работать для всех.В Apache есть пример python "client" для использования REST API действия, в котором используется библиотека requests.

Дело в том, что для его использования вам необходимо предоставить свой API KEY,что я не знаю, как получить каким-либо другим способом, кроме как получить его непосредственно из CLI IBM Cloud.Поскольку я пытаюсь получить доступ к функции с веб-сервера, мне необходимо сохранить ключ в переменной среды или сохранить его в текстовом файле и получить к нему доступ или установить CLI на сервере, войти в систему с моими учетными данными иcall ibmcloud wsk property get --auth.

Кроме того, этот метод не работал с конечной точкой веб-действия, когда я его пробовал.

...