Nano Hash - криптовалюты, майнинг, программирование

Ошибка Curl: пустой ответ с сервера

Я пытаюсь сделать сообщение CURL и столкнулся с некоторыми проблемами.

По сути, я отправляю в API список почтовых индексов, и в зависимости от того, что выбрано, это потенциально может быть очень большой список. Когда я публикую только несколько почтовых индексов, все работает идеально. Когда я добавляю больший список почтовых индексов, происходит сбой с ошибкой «Пустой ответ с сервера».

private function sendApiRequest($action, $request)
{
    // Testing
    $request['Test'] = $this->apitest;

    // Build URL
    $postURL = "{$this->apiurl}?Key={$this->apikey}&API_Action={$action}";

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $postURL);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($request));
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:'));
    curl_setopt($ch, CURLOPT_TIMEOUT, 10);
    $resp = curl_exec($ch);

    if(curl_errno($ch))
    {
        var_dump(curl_getinfo($ch));
        throw new Exception('Curl Error: ' . curl_error($ch));
    }
    curl_close($ch);
    return $resp;
}

Вот дамп curl_getinfo():

array
  'url' => string 'https://api.example.com/api.php?Key=xxx&API_Action=insertFilterSet' (length=147)
  'content_type' => null
  'http_code' => int 0
  'header_size' => int 0
  'request_size' => int 11736
  'filetime' => int -1
  'ssl_verify_result' => int 20
  'redirect_count' => int 0
  'total_time' => float 0.374
  'namelookup_time' => float 0
  'connect_time' => float 0.093
  'pretransfer_time' => float 0.203
  'size_upload' => float 11486
  'size_download' => float 0
  'speed_download' => float 0
  'speed_upload' => float 30711
  'download_content_length' => float -1
  'upload_content_length' => float 11486
  'starttransfer_time' => float 0.374
  'redirect_time' => float 0
  'certinfo' => 
    array
      empty
  'redirect_url' => string '' (length=0)

Как я уже сказал, он отлично работает для небольших запросов, но выдает ошибки при больших запросах.

28.08.2012

  • Не зная, что находится на странице, которую вы выполняете вызов CURL, может быть трудно сказать, но вы даете только 10 секунд с curl_setopt($ch, CURLOPT_TIMEOUT, 10);. Вы получаете что-то пустое, потому что это занимает слишком много времени? Попробуйте поднять это и посмотреть, исправит ли это ситуацию. 28.08.2012
  • Если единственной переменной между рабочими и нерабочими ответами является размер отправляемых вами данных, скорее всего, это проблема с сервером. Сказав это, почему вы явно устанавливаете пустой заголовок Expect:? Это не имеет смысла для меня в данном контексте и может быть источником проблемы. 28.08.2012
  • @DaveRandom Пустой заголовок Expect якобы решает другую проблему, когда он возвращает тот же ответ, но с HTTP-кодом 100 вместо 0. Я погуглил это, и это было предполагаемое исправление для этого. 28.08.2012
  • @DaOgre Запуск занимает менее 10 секунд. Я тоже пробовал накрутить. 28.08.2012
  • @MarkRoach Ну, я немного удивлен, что это необходимо с телом application/x-www-form-urlencoded, но тем не менее - я подозреваю, что это проблема с сервером. Вы связывались с поставщиком услуг? 29.08.2012

Ответы:


1

Я столкнулся с той же проблемой. Мой код состояния HTTP вернул 200, но мой ответ был пустым. На это может быть много причин, как я понял.

Ваши заголовки могут быть неверными

CURLOPT_HTTPHEADER => array('Content-Type:application/json', 'Expect:')

Возможно, вам потребуется отправить данные в виде полей сообщения в CURL, а не прикреплять к URL-адресу, например url?p1=a1&p2=a2.

$data = array (p1=>a1, p2=>a2)
CURLOPT_POSTFIELDS => $data

Таким образом, ваш массив параметров будет похож на следующий

array(
    CURLOPT_URL => $url,
    CURLOPT_FAILONERROR => TRUE, // FALSE if in debug mode
    CURLOPT_RETURNTRANSFER => TRUE,
    CURLOPT_TIMEOUT => 4,
    CURLOPT_HTTPHEADER => array('Content-Type:application/json', 'Expect:'),
    CURLOPT_POST => TRUE,
    CURLOPT_POSTFIELDS => $data,
);
21.08.2013
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..