Задать вопрос
@termospa

Запрос на создание таблицы в clickhouse Yandex выдает ошибку 400 Bad Request, что не так с моим запросом?

Добрый день знатоки!
Запросы на получение данных работают, а вот создать таблицу в clickhouse не получается
Права на создание таблицы есть (проверял в песочнице и в аккаунте)
Ниже привету код, взят из официальной документации, заменил только метод POST и 2 последних заголовка в $auth

$query_create_table = "CREATE TABLE `iiko-db`.test_sales (Delivery_IsDelivery String) ENGINE = MergeTree() ORDER BY (Delivery_IsDelivery);";

    $host = '******.mdb.yandexcloud.net';
    $db = '****';

    $auth = [
        'X-ClickHouse-User:******',
        'X-ClickHouse-Key:******',
        'Transfer-Encoding: chuncked',
        'Content-Length:' . strlen($query_create_table),
    ];

    $ssl = [
        'cafile' => '/usr/local/share/ca-certificates/Yandex/RootCA.crt',
        'verify_peer' => true, 
    ];

    $context = stream_context_create([
        'http' => [
            'method' => 'POST',
            'protocol_version' => 1.1,
            'header' => $auth
        ],
        'ssl' => $ssl
    ]);

    $url = sprintf('https://%s:8443/?database=%s&query=%s', $host, $db, urlencode($query_create_table));

    $rs = file_get_contents($url, false, $context);
    echo "<pre>";
    print_r($rs);
    echo "</pre>";


На выходе получаю

Warning: file_get_contents(https:/*****.mdb.yandexcloud.net:8443/?database=iiko-db&query=CREATE+TABLE+%60iiko-db%60.test_sales+%28Delivery_IsDelivery+String%29+ENGINE+%3D+MergeTree%28%29+ORDER+BY+%28Delivery_IsDelivery%29%3B): Failed to open stream: HTTP request failed! HTTP/1.1 400 Bad Request in /index.php on line 119
  • Вопрос задан
  • 107 просмотров
Подписаться 1 Простой 2 комментария
Помогут разобраться в теме Все курсы
  • Skillfactory
    Профессия Fullstack веб-разработчик на JavaScript и PHP
    20 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
Пригласить эксперта
Ответы на вопрос 3
ipatiev
@ipatiev Куратор тега PHP
Потомок старинного рода Ипатьевых-Колотитьевых
По хорошему, надо спрашивать надо у Яндекса. Но из очевидных проблем:
Но поправить совсем уж очевидные косяки мы можем помочь
1. У этого запроса нет контента. И, как следствие - у контента нулевая длина (и непонятно, зачем заголовок вообще).
Как вариант, отправлять данные надо не в строке запроса, а в теле запроса, но тогда и длину считать нормально
2. Нет такого слова - "chunck"
3. Если уж посылать враскоряку - методом POST, но в строке запроса, то данные надо форматировать по стандарту, а не то что сейчас
$url = sprintf('https://%s:8443/?%s', 
    $host, 
    http_build_query(['database'=>$db, 'query'=>$query])
);


И да, кстати.
Как подсказывают товарищи ниже, в секцию http надо ещё добавить элемент 'ignore_errors' => true
чтобы увидеть ответ сервера
Ответ написан
Комментировать
2ord
@2ord
1.
Content-Length:
странное двоеточие?! Fullwidth Colon - а не AI ли написал?
2. не нужен ли пробел после двоеточия?
3. Сертификат SSL действителен ли и доступен для чтения?
4. а точно ли 'method' => 'POST' ?
5. Стоит вывести строку в вывод и проверить корректен ли адрес. Попробовать использовать curl -i.
6. попробовать curl с путем /ping для проверки связи и отладки. А когда все будет хорошо, перейти к отладке создания таблицы.

Я не специалист в PHP, но разве нет в языке лучшего HTTP клиента, чем file_get_contents? Тот, который возвращает код, заголовки и пр.?
Ответ написан
@Vitsliputsli
file_get_contents не для этих целей. Не хотите использовать готовое решение для подключения к Клику, используйте хотя бы curl, чтобы получить нормальный ответ с описанием ошибки.
Без описания ошибки можно только гадать, что не так, а это непродуктивно, сегодня решите, а завтра будет новая ошибка и снова гадание.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы