У меня есть действие в 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'."
}
Я действительно не знаю, что здесь делать