Как работает URLENCODE для параметров в curl PHP? - PullRequest
0 голосов
/ 20 февраля 2020

У меня очень странная проблема с urlencode, и теперь я объясняю:

У меня есть бот-телеграмма, отправляющая мне сообщение с URL, поэтому по этой причине я хочу добавить urlencode текст что я вставлю в URL.

Но если использовать CURLOPT_POSTFIELDS, у меня странная проблема.


Сообщение для отправки:

  This is an example my friend

Но если использовать urlencode и CURLOPT_POSTFIELDS, то вывод:

  This+is+an+example+my+friend

Теперь я показываю полный код:

$notifica= urlencode("This is an example my friend");
sendMessage(xxx, $notifica);
sendMessage_2($notifica);


function sendMessage($chat_id, $message){           
   $params=[
    'chat_id' => $chat_id,
    'parse_mode' => 'HTML',
    'text' => $message
   ];

   $url= 'https://api.telegram.org/botxxx';
   $ch = curl_init($url);
   curl_setopt($ch, CURLOPT_HEADER, false);
   curl_setopt($ch, CURLOPT_CONNECTTIMEOUT_MS, 3500);
   curl_setopt($ch, CURLOPT_TIMEOUT_MS, 3500);
   curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
   curl_setopt($ch, CURLOPT_POST, 1);
   curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
   curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
   $result = curl_exec($ch);
   curl_close($ch); 
}

function sendMessage_2($mess){          
    $url= 'https://api.telegram.org/botxxx/sendMessage?chat_id=xxx&parse_mode=HTML&text='.$mess;

    $ch = curl_init();  
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT_MS, 3500);
    curl_setopt($ch, CURLOPT_TIMEOUT_MS, 3500);
    $result = curl_exec($ch);
    curl_close($ch);    
}

Надеюсь, кто-нибудь может помочь мне ... большое спасибо и извините за мой английский sh

Ответы [ 2 ]

1 голос
/ 20 февраля 2020

Не используйте urlencode(), когда вы помещаете параметры в массив с CURLOPT_POSTFIELDS. Документация гласит:

Если value является массивом, заголовок Content-Type будет установлен на multipart / form-data .

Этот формат не требует кодирования URL, поэтому сервер не будет автоматически декодировать его. В результате символы, используемые в кодировке (пробел кодируется как +, другие специальные символы используют %, за которым следуют шестнадцатеричные коды), будут обрабатываться буквально.

0 голосов
/ 20 февраля 2020

Попробуйте использовать curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($params));

...