Я пытаюсь заставить асинхронный обратный вызов работать для речи IBM Watson в текст.
Я получил работу функции завитка
curl -X POST -u "c94c7025-09f5-4cee-94dd-8f73348b60d8":"4TOriExZooKh" \
--header "Content-Type: audio/wav" \
--data-binary @uploads/001528fe-9545-4c3f-9d0d-aec4cd61caee.wav \
"https://stream.watsonplatform.net/speech-to-text/api/v1/recognitions?callback_url=http://34.234.215.13/callback.php&model=en-US_NarrowbandModel&profanity_filter=false&events=recognitions.completed_with_results&user_token=audio&results_ttl=10"
Насколько я понимаю, результаты или уведомления должны быть отправлены в виде POST на URL обратного вызова
https://console.bluemix.net/docs/services/speech-to-text/async.html#create
Приведенный выше код должен отправлять завершенные результаты на callback.php
callback.php
<?php
header('Content-Type:text/plain');
echo $_GET["challenge_string"];
foreach ($_POST as $key => $value)
error_log($key . "--" . $value);
Эхо для регистрации URL, а затем для любых данных, отправленных через POST, я передаю его в цикл foreach.
Но я не получаю никаких данных или результатов после того, как преобразование сделано.
access log
[14/Oct/2017:00:22:39 +0000] "POST /callback.php HTTP/1.1" 200 166 "-" "Jersey/2.22.1 (Apache HttpClient 4.5)"
error log
[:error] [pid 2046] [client 169.48.114.147:54645] PHP Notice: Undefined index: challenge_string in /var/www/html/callback.php on line 10
Я не могу понять, что не так? Я смог заставить его работать, когда я делаю синхронные вызовы, то есть один POST за другим.
Я полагаю, что вы не регистрируете (белый список) свой обратный вызов, см. Раздел «Регистрация URL обратного вызова» в документации: https://console.bluemix.net/docs/services/speech-to-text/async.html#async
Вы регистрируете URL обратного вызова, вызывая
POST /v1/register_callback
метод. После регистрации URL-адреса обратного вызова вы можете использовать его для получения уведомлений о неопределенном количестве заданий. Процесс регистрации состоит из четырех этапов:
…
Я понял, как обработать запрос POST. Это совершенно новое для меня и не знал об этом.
callback.php
<?php
$request_body = file_get_contents('php://input');
$json = json_decode($request_body);
Одна вещь, на которую я хотел бы обратить внимание всех, кто интересуется, состоит в том, что этот вывод будет содержать дополнительную информацию, как упомянуто здесь.
https://console.bluemix.net/docs/services/speech-to-text/async.html#job
Если вы хотите извлечь только результаты в строку JSON для хранения в БД или где-либо еще, вы можете добавить эту строку
json_encode($json->results[0])
Надеюсь, это поможет любому.
Больше информации о PHP обработке данных POST в теле можно найти здесь
Как получить тело POST в php?