Как преобразовать cURL в PHP cURL

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

curl --get --include 'https://domainnameher.com/[email protected]' \
-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.info(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;
?>

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

Во-первых, подтвердили ли вы, что PHP-скрипт не возвращает ожидаемое значение, отправив его прямо в браузере? Если это так, вы можете избавиться от JS и HTML в своем вопросе.

miken32 20.03.2019 20:33

Почему вы это делаете? $endpoint = urldecode($url); Вы получите недействительные URL-адреса, если ваше электронное письмо содержит проблемные символы, такие как +.

miken32 20.03.2019 20:35

Да, я подтвердил, что PHP-скрипт ничего не возвращает, вынимая js и напрямую публикуя его.

Dirty Bird Design 20.03.2019 20:37

Это твоя проблема? curl_setopt($ch, CURLOPT_POST, 1);

miken32 20.03.2019 20:38

Прежде чем я использовал urldecode, он избегал символа «@», и, очевидно, он нужен API.

Dirty Bird Design 20.03.2019 20:38

Нет, сервер будет декодировать %40 в @ на своей стороне.

miken32 20.03.2019 20:39

черт. да, это было так. Если вам нужны очки, поместите это в ответ, и я приму. Спасибо, из-за деревьев леса не было видно.

Dirty Bird Design 20.03.2019 20:39

так избавиться от декодирования URL?

Dirty Bird Design 20.03.2019 20:40

Извините, преждевременно ударил по ответу, но я думаю, что это поможет вам.

miken32 20.03.2019 20:48
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
9
73
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Пару гнид в вашем коде, кроме очевидной опечатки 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);
}

Спасибо за знания. Один вопрос, зачем вы устанавливаете header("Content-Type: application/json"); в первой строке, а затем и в CURLOpt_HTTPHeader - я предполагаю, что они разные?

Dirty Bird Design 20.03.2019 20:51
header("Content-Type: application/json"); сообщает вашему коду jQuery, какие данные вы отправляете обратно. Как правило, это достаточно умно, чтобы сказать, но никогда не помешает быть откровенным. Установка Accept: application/json в заголовках ваших запросов сообщает API, какие данные вы принимаете.
miken32 20.03.2019 20:53

Другие вопросы по теме