Я использую 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;
?>
Я не знаю, почему я не получаю такой же ответ от скрипта, как при запуске команды из терминала. Любые советы очень ценятся.
Почему вы это делаете? $endpoint = urldecode($url); Вы получите недействительные URL-адреса, если ваше электронное письмо содержит проблемные символы, такие как +.
Да, я подтвердил, что PHP-скрипт ничего не возвращает, вынимая js и напрямую публикуя его.
Это твоя проблема? curl_setopt($ch, CURLOPT_POST, 1);
Прежде чем я использовал urldecode, он избегал символа «@», и, очевидно, он нужен API.
Нет, сервер будет декодировать %40 в @ на своей стороне.
черт. да, это было так. Если вам нужны очки, поместите это в ответ, и я приму. Спасибо, из-за деревьев леса не было видно.
так избавиться от декодирования URL?
Извините, преждевременно ударил по ответу, но я думаю, что это поможет вам.






Пару гнид в вашем коде, кроме очевидной опечатки 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 - я предполагаю, что они разные?
header("Content-Type: application/json"); сообщает вашему коду jQuery, какие данные вы отправляете обратно. Как правило, это достаточно умно, чтобы сказать, но никогда не помешает быть откровенным. Установка Accept: application/json в заголовках ваших запросов сообщает API, какие данные вы принимаете.
Во-первых, подтвердили ли вы, что PHP-скрипт не возвращает ожидаемое значение, отправив его прямо в браузере? Если это так, вы можете избавиться от JS и HTML в своем вопросе.