Как конвертировать CURL в PHP CURL - PullRequest
2 голосов
/ 20 марта 2019

Я использую API для проверки некоторых данных и могу заставить их cURL API работать из командной строки следующим образом:

curl --get --include 'https://domainnameher.com/?domain=whatever@virtual-email.com' \
-H 'X-Mashape-Key: f123456879' \
-H 'Accept: application/json'

Это возвращает немного JSON - Все хорошо. Когда я пытаюсь преобразовать его в PHP и запустить как скрипт процессора форм, я ничего не получаю от сервиса.

HTML

<form id="testF" action="processor.php" method="POST">
    <input type="text" name="Email" id="Email" placeholder="Your Email Address">
    <input type="submit" class="redFlat" value="DOWNLOAD">
</form>

JQuery для AJAX

$(function(){
    $('#testF').validate({
        errorPlacement: function(error, element) {},
        submitHandler: function(form) {
            var dataString = $(form).serialize(); 
            $.ajax({
                type:$('#testF').attr('method'),
                url: form.action,
                data: dataString,
                dataType: 'json',
                success: function(data) {
                    console.log(data);
                }
            });
            return false;
        }
    });
});

И главный вопрос - процессор PHP. Я беру значение POST из формы и добавляю его в URL ...

<?php
    $email  = filter_var($_POST["Email"], FILTER_SANITIZE_EMAIL);
    $fields = array('domain' => $email);
    $url = "https://mailcheck.p.mashape.com/?" . http_build_query($fields, '', "&");
    $endpoint = urldecode($url);

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $endpoint);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    $headers = [
        'X-Mashape-Key: f123456879',
        'Accept: application/json'
    ];

    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

    $server_output = curl_exec ($ch);

    curl_close ($ch);

    echo $server_output;
?>

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

1 Ответ

2 голосов
/ 20 марта 2019

Пара гнид, чтобы выбрать в вашем коде, кроме очевидной опечатки CURLOPT_POST. Вы используете filter_var, но продолжаете, если фильтр выходит из строя; Вы должны проверить на ложное значение. Вы не должны использовать urldecode в URL, вся идея http_build_query в том, что он выполняет кодировку URL для вас. Это личное предпочтение, но я считаю, что с curl_setopt_array работать намного проще. И вы должны проверить, является ли ваш результат допустимым JSON, и использовать правильные заголовки при отправке ответа обратно в jQuery.

header("Content-Type: application/json");
$email  = filter_var($_POST["Email"], FILTER_SANITIZE_EMAIL);
if (!$email) {
    header("HTTP/1.1 500 Server Error");
    $res = ["result"=>false, "message"=>"Invalid email"];
    echo json_encode($res);
    exit;
}
$fields = ['domain' => $email];
$url = "https://mailcheck.p.mashape.com/?" . http_build_query($fields);

$ch = curl_init($url);
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => [
        'X-Mashape-Key: f123456879',
        'Accept: application/json'
    ]
]);
$server_output = curl_exec($ch);

curl_close ($ch);

if (json_decode($server_output)) {
    echo $server_output;
} else {
    header("HTTP/1.1 500 Server Error");
    $res = ["result"=>false, "message"=>"Invalid response from server: $server_output"];
    echo json_encode($res);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...