После двух дней исследований и некоторого спешного изучения php. Я, наконец, немного истощился и хочу как-то написать все, что я знаю, и попытаться спросить прямым и понятным способом. Поэтому, возможно, позже какой-нибудь новичок сможет найти здесь полезную информацию.
Вот как я понимаю php proxy, который предназначен для решения проблемы кросс-происхождения / кросс-домена.
Вы не можете просто отправить ajax-запрос в другой домен (GET или POST), он будет заблокирован браузером из-за SOP (та же политика происхождения).
Но, конечно, вы можете указать URL-адрес запроса прямо в браузере и получить необходимую информацию.
Я понимаю, что прокси-php выглядит так: Это похоже на то, что прокси-php делает вещи за 2, он делает запрос к серверу, получает информацию, возвращает информацию вам. Таким образом, вы можете обработать информацию позже.
Я попробовал метод "GET", и он отлично работает:
in proxy.php
:
<?php
$nix="";
$type=$_GET['requrl'];
if ($_GET['requrl'] != $nix) {
$file = file_get_contents($_GET['requrl']);
}
elseif ($_POST['requrl'] != $nix) {
$file = file_get_contents($_POST['requrl'], false, $_POST['data']);
}
else {
$file = "false type";
}
echo $file;
?>
in main.js
:
var url = 'https://www.example.com/example?'
url = encodeURI(url);
$.ajax({
type: 'GET',
url: 'proxy.php',
data: {requrl: url}
}).done(function(res) {
// handle the response
})
довольно легко, верно? Однако я до сих пор не могу понять, почему человек поместил URL в «data» и создал для него «requrl». Но все в порядке. потому что это работает.
Затем я хотел попробовать метод «POST», в котором мне нужно POST-файл xml на целевой сервер, и сервер выполнит некоторые вычисления и вернет мне результат. Вот что я попробовал в proxy.php
(использовал все, что я могу найти в переполнении стека):
<?php
$nix="";
$type=$_GET['requrl'];
if ($_GET['requrl'] != $nix) {
$file = file_get_contents($_GET['requrl']);
}
elseif ($_POST['requrl'] != $nix) {
$postdata = http_build_query(
array(
'data' => $_POST['data']
)
);
$opts = array('http' =>
array(
'method' => 'POST',
'header' => 'Content-type: application/xml',
'content' => $_POST['data']
)
);
$context = stream_context_create($opts);
$file = file_get_contents($_POST['requrl'], false, $context);
}
else {
$file = "false type";
}
echo $file;
?>
и main.js
:
function sendPOSTRequest(xml) {
var url = 'https://www.example.com/example?';
url = encodeURI(url);
$.ajax({
type: "POST",
url: "proxy.php",
data: {
requrl: url,
data: xml
},
success: function (response) {
console.log('POST: ', response);
},
error: function (jqXHR, textStatus, errorThrown) {
console.log("error: ", textStatus, errorThrown);
alert("POST failed");
}
});
}
Код состояния для этого запроса ajax всегда 200 OK, но я никогда не получаю что-либо обратно. Потому что я думаю, что «200 OK» означает только то, что я успешно отправил запрос в proxy.php, но как proxy.php подключил целевой сервер или если в proxy.php есть какие-либо ошибки, я не знаю этого.
Итак, мои вопросы:
если вы видите этот раздел кодов:
$ postdata = http_build_query (
массив (
'data' => $ _POST ['data']
)
);
Зачем мне нужен массив для передачи данных? То, что я хочу передать, это только XML-файл в строке. что будет очень легко сделать с обычным AJAX. (просто data: xml
)
Как узнать состояние соединения между proxy.php и реальным целевым сервером?
Как правильно передать параметры? (Я попробовал POST в POSTMAN, все работает нормально. Для xml-файла, который нужно пропустить через POST, я просто выбрал "body" => "raw" и "XML (application / xml)" в POSTMAN, но я понятия не имею, как передать их с php / ajax на целевой сервер). Другими словами: что такое эквивалентные настройки в javascript / php, когда я успешно попробовал его в POSTMAN?