Request-URI слишком длинный — SMS API

Моя проблема какая-то своеобразная. У меня есть API-интерфейс bulksms от моего провайдера:

http://www.estoresms.com/smsapi.php?username=user&password=1234&sender=@@sender@@&recipient=@@recipient@@&m
essage=@@message@@&

затем я завернул его в PHP и передал в cURL:

$api = "http://www.estoresms.com/smsapi.php?username=".$sms_user."&password=".$sms_pwd."&sender=".$sender_id."&recipient=".$numbers."&message=".$text."&";

function curl_get_contents($url)
{   
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
$data = curl_exec($ch);
curl_close($ch);
return $data;
}
$send_it =  curl_get_contents($api);

обычно это работало нормально, но когда $recipient (номера телефонов) превышает, скажем, 300, я получаю сообщение об ошибке:

Слишком длинный URL-адрес запроса Длина запрошенного URL-адреса превышает предел емкости для этого сервера. Кроме того, при попытке использовать ErrorDocument для обработки запроса возникла ошибка 414 Request-URI Too Long.

Но BulkSMS должна иметь возможность отправлять на тысячи номеров одновременно. Из моего исследования я узнал, что существует ограничение на URL. Я не владелец сервера. Я работаю над планом виртуального хостинга. пожалуйста, как я могу обойти эту проблему. Я знаю, что есть решение, которое не означает покупку собственного сервера.

Спасибо


person david    schedule 11.07.2017    source источник


Ответы (3)


Можете ли вы попытаться заставить API использовать POST вместо GET. Это решило бы проблему.

Редактировать:

Я не уверен, что ваш API проверяет POST, но попробуйте следующее:

$api = "http://www.estoresms.com/smsapi.php";
$data = array('username' => $sms_user, 'password' => $sms_pwd, 'sender' => $sender_id , 'recipient' => $numbers , 'message' => $text);

function curl_get_contents($url)
{   
$ch = curl_init($url);
curl_setopt($handle, CURLOPT_POST, true);
curl_setopt($handle, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
$data = curl_exec($ch);
curl_close($ch);
return $data;
}
$send_it =  curl_get_contents($api);
person m.nachury    schedule 11.07.2017
comment
Пожалуйста, как я могу использовать POST? Спасибо - person david; 11.07.2017
comment
я пробовал, не получилось. Даже для любых чисел, будь то мало или много. Мой исходный код работает. Проблема в том, что когда чисел так много, это терпит неудачу. - person david; 13.07.2017
comment
Это означает, что API не читает данные POST, это странно, поскольку, как я понял, они обслуживаются, чтобы блокировать запрос? - person m.nachury; 13.07.2017
comment
Я думаю, что это одна из двух возможностей, 1-я: это способы (странный способ) для API ограничить количество телефонных номеров. 2-й: Вы проходите через прокси, которые делают блокировку - person m.nachury; 13.07.2017
comment
Если это первый, попробуйте связаться с API и рассказать им о своей проблеме. - person m.nachury; 13.07.2017

Взгляните на этот пример кода (от bulksms.com).

http://developer.bulksms.com/eapi/code-samples/php/send_sms/

person Willem    schedule 14.07.2017

Итак, мне пришлось найти способ обойти мою собственную проблему. если API не пропустит тысячи чисел за раз, то давайте разобьем его на куски в момент выполнения.

    function curl_get_contents($url)
    {   
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
    $data = curl_exec($ch);
    curl_close($ch);
    return $data;
    }

    $how_many = count(explode(',',  $numbers));
    if ($how_many > 250){
    $swi = range(0, ceil($how_many/250)-1); 
    foreach ($swi as $sw){$numbers_a = implode(',', (array_slice(explode(',', $numbers), $sw*250, 250)));
    $api = "http://www.estoresms.com/smsapi.php?username=".$sms_user."&password=".$sms_pwd."&sender=".$sender_id."&recipient=".$numbers_a."&message=".$text."&";


    $send_it =  curl_get_contents($api);
    }
    }

if ($how_many <= 250){
    $api = "http://www.estoresms.com/smsapi.php?username=".$sms_user."&password=".$sms_pwd."&sender=".$sender_id."&recipient=".$numbers."&message=".$text."&";
$send_it =  curl_get_contents($api);    
}
person david    schedule 03.08.2017