使用IBM Cloud Function的REST API时如何解决“错误”:“'parameter_name'”?

时间:2019-06-16 04:11:13

标签: python-3.x ibm-cloud postman openwhisk ibm-cloud-functions

我在IBM Cloud Functions中有一个操作,该操作仅接收一个参数:“ frame”。我正在使用Postman测试随操作提供的REST API端点。但是,当我提供“ 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}

该操作应返回我期望的结果,但现在不执行该操作。请帮助我,任何答案都很好!

编辑:

这是操作的代码:

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  }

这是激活响应(根据Postman,返回的状态为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。但是,当我使用 this 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 :(得分:0)

稍作搜索后,我发现了一些对我现在有用的东西,尽管它可能不适用于每个人。 Apache有一个python "client" example,用于使用使用requests库的操作的REST API。

事情是,要使用它,您需要提供您的API KEY,除了直接从IBM Cloud CLI获取它以外,我不知道如何通过其他任何方式获得它。由于我正尝试从Web服务器访问该功能,因此需要将密钥保存在环境变量中或将其保存在文本文件中,然后从那里访问它,或者在服务器上安装CLI,然后使用我的凭据登录并致电ibmcloud wsk property get --auth

此外,当我尝试该方法时,该方法不适用于Web操作端点。