我在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'."
}
我真的不知道该怎么办
答案 0 :(得分:0)
稍作搜索后,我发现了一些对我现在有用的东西,尽管它可能不适用于每个人。 Apache有一个python "client" example,用于使用使用requests
库的操作的REST API。
事情是,要使用它,您需要提供您的API KEY,除了直接从IBM Cloud CLI获取它以外,我不知道如何通过其他任何方式获得它。由于我正尝试从Web服务器访问该功能,因此需要将密钥保存在环境变量中或将其保存在文本文件中,然后从那里访问它,或者在服务器上安装CLI,然后使用我的凭据登录并致电ibmcloud wsk property get --auth
。
此外,当我尝试该方法时,该方法不适用于Web操作端点。