使用HTTP GET请求的PHP URL编码


PHP URL encoding with HTTP GET request

我已经设置了一个PHP脚本来使用Nexmo API发送文本消息,但是我如何编码HTTP GET请求存在问题。该脚本从存储的数据中提取一些变量,然后触发。我没有经验的PHP和已经花了这么多的时间在这方面,这是我最后的手段,有人能看到我在下面的代码出错了吗?

请求的预期格式:

https://rest.nexmo.com/sms/json?api_key=XXX&api_secret=XXX&to=XXX&from=XXX&text=XXX

代码:

function sendText () {
    $api_key = $settings['consumer_key'];
    $api_secret = $settings['consumer_secret'];
    $recipient = $settings['recipient'];
    $from = $settings['from'];
    $text = $settings['sms_contents'];
    $url = 'https://rest.nexmo.com/sms/json';
    $data = array_merge($data, array('api_key' => $api_key, 'api_secret' => $api_secret, 'to' => $recipient, 'from' => $from, 'text' => $text));
    $post = '';
    foreach($data as $k => $v) {
        $post .= "&$k=$v";
    }
    $opts = array('http' =>
            array(
                'method'  => 'POST',
                'header'  => 'Content-type: application/x-www-form-urlencoded',
                'content' => $post
            )
        );
    $context = stream_context_create($opts);
    $from_nexmo = file_get_contents($url, false, $context);
}
sendText();

我不认为你在做任何编码。下面是我要做的:

foreach($data as $k => $v){
    $post .= "&$k=" . urlencode($v);
}

尝试使用urlencode()传输值:

$post = array();
foreach($data as $k => $v){
    $post[] = $k . '=' . urlencode($v);
}
$post = implode('&', $post);
$opts = array('http' =>
        array(
            'method'  => 'POST',
            'header'  => 'Content-type: application/x-www-form-urlencoded',
            'content' => $post
        )
    );

请尝试执行以下代码片段:

function sendText () {
    $api_key = $settings['consumer_key'];
    $api_secret = $settings['consumer_secret'];
    $recipient = $settings['recipient'];
    $from = $settings['from'];
    $text = $settings['sms_contents'];
    $url = 'https://rest.nexmo.com/sms/json';
    $data = array_merge($data, array('api_key' => $api_key, 'api_secret' => $api_secret, 'to' => $recipient, 'from' => $from, 'text' => $text));
    $post = http_build_query($data);
    $opts = array('http' =>
            array(
                'method'  => 'POST',
                'header'  => 'Content-type: application/x-www-form-urlencoded',
                'content' => $post
            )
        );
    $context = stream_context_create($opts);
    $from_nexmo = file_get_contents($url, false, $context);
}
sendText();