#php #json #curl
#php #json #curl
Вопрос:
Я запускаю эластичный поиск в экземпляре AWS-EC2 и пытаюсь запросить его через curl, но кажется, что я не получаю никакого результата от моего curl_exec() . Когда я пытаюсь получить результаты, я получаю следующее
"Notice: Undefined offset: 0 in /var/www/html/DatabasePage.php on line 35" error
function curlElastic(){
$url = 'http://127.0.0.1:9200/resumes/test_resumes/_search/';
$param = "
{
'query' : {
'match' : {'degree type': 'Masters'}
}";
$header = array(
'Content-Type: application/json'
);
$ch = curl_init();
curl_setopt($ch,CURLOPT_URL, $url);
curl_setopt($ch,CURLOPT_HTTPHEADER, $header);
curl_setopt($ch,CURLOPT_POSTFIELDS, $param);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$res = curl_exec($ch);
curl_close($ch);
return $res;
}
if (isset($_POST['search'])) {
$data = curlElastic();
$dataArr = json_decode($data, true);
$result = count($dataArr[0]["hits"]);
// gives "Notice: Undefined offset: 0 in /var/www/html/DatabasePage.php on line 35" error
}
когда я запускаю
curl -XGET "localhost:9200/resumes/test_resumes/_search" -H 'Content-Type: application/json' -d '{"query":{"match":{"degree type": "Masters"}}}'
из командной строки я получаю результаты
{"took":11,"timed_out":false,"_shards":{"total":5,"successful":5,"skipped":0,"failed":0},"hits":{"total":3,"max_score":0.9808292,"hits":[{"_index":"resumes","_type":"test_resumes","_id":"l5lqtWkBxgH_eRZOiK6d","_score":0.9808292,"_source":{"name": "David McDave", "degree type": "Masters", "degree field": "Compuer Security", "resume text": "I would like to work for you, I have many skills to provide! I can work with HTTP and Java"}},{"_index":"resumes","_type":"test_resumes","_id":"lJlotWkBxgH_eRZONK4V","_score":0.6931472,"_source":{"name": "David McDave", "degree type": "Masters", "degree field": "Compuer Security", "resume text": "I would like to work for you, I have many skills to provide! I can work with HTTP and Java"}},{"_index":"resumes","_type":"test_resumes","_id":"kZlhtWkBxgH_eRZOda7Q","_score":0.6931472,"_source":{"name": "David McDave", "degree type": "Masters", "degree field": "Compuer Security", "resume text": "I would like to work for you, I have many skills to provide! I can work with HTTP and Java"}}]}}
Комментарии:
1. Вы подтвердили, что получаете ответ от удаленного сервера? Если нет, вы проверили
curl_error()
? Если да, вы привыклиjson_last_error()
видеть, почему ответ не декодируется должным образом?2. «Ошибка Curl:» «последняя ошибка json: 0» — это то, что я получаю, когда запускаю этот код
3. Итак, как это
$data_arr
выглядит? Это основное устранение неполадок здесь.4. dataArr пуст, в нем ничего нет
5. запуск stripslashes($res); дает мне следующее: {«ошибка»:{«root_cause»:[{«тип»:»json_parse_exception»,»причина»: «Неожиданный символ («‘ (код 39)): ожидал, что двойная кавычка начнет имя поля в [Источник:org.elasticsearch.transport.netty4. ByteBufStreamInput@48cc8532; строка: 3, столбец: 5]»}],»тип»:»json_parse_exception»,»причина»: «Неожиданный символ («‘ (код 39)): ожидал, что двойная кавычка начнет имя поля в [Источник: org.elasticsearch.transport.netty4. ByteBufStreamInput@48cc8532; строка: 3, столбец: 5]»},»статус»: 500}
Ответ №1:
function curlElastic(){
$url = 'http://localhost:9200/resumes/test_resumes/_search/';
$param = array(
"query" => array(
"match" => array(
"degree type" => "Masters"
)
)
);
$header = array(
'Content-Type: application/json'
);
$ch = curl_init();
curl_setopt($ch,CURLOPT_URL, $url);
curl_setopt($ch,CURLOPT_HTTPHEADER, $header);
curl_setopt($ch,CURLOPT_POSTFIELDS, json_encode($param));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$res = curl_exec($ch);
if ($res === false)
$res = 'curl error: ' . curl_error($ch);
echo 'stripslashes: ' . stripslashes($res);
curl_close($ch);
return $res;
}
if (isset($_POST['search'])) {
$data = curlElastic();
$dataArr = json_decode($data, true);
$result = count($dataArr["hits"]);
}
Ответ №2:
Рекомендация: лучше использовать официальный PHP-клиент для ES https://github.com/elastic/elasticsearch-php
Не пытайтесь заново изобретать колесо … 🙂