Использование PHP cURL для POST JSON данных - PullRequest
0 голосов
/ 26 мая 2020

Я работаю над трехуровневой системой входа в школу, и у меня возникают проблемы с отправкой и получением сообщений с помощью JSON + POST. У меня есть интерфейс, который принимает имя пользователя и пароль:

<div id = "login form" style="text-align: center">
    <input type="text" id="username" name ="username"><br>
    <input type="password" id="password" name ="password"><br>
    <button id="login"> Login</button>
<div>

, а затем ОТПРАВЛЯЕТ его, используя AJAX, на «оборотную сторону лицевой стороны» - сценарий PHP. Сценарий PHP во внешнем интерфейсе просто перемещает то же сообщение в середину, которая направляет его в серверную часть, которая запрашивает базу данных и возвращает результат. Я сделал следующий сценарий PHP для внешнего интерфейса:

header('Content-type: application/json');

    $middle_url = "https://myurl.edu/";
    $username = $_POST['username'];  //extract credentials
    $password = $_POST['password'];

    // load new array
    $credentials = array(
      'username' => $username, 
      'password' => $password
    );

    $ch = curl_init();  // curl handle 
    curl_setopt($ch, CURLOPT_URL, $middle_url . "test.php");
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $credentials);  // load credentials to POST
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);  // set return type to string
    $middle_reply = curl_exec($curl);  // execute curl and store response
    curl_close($ch);

    echo $middle_reply;

Моя проблема в том, что при запуске файла HTML я получаю пустую строку в результате, и я не уверен, почему .

Я создал тестовый файл, в котором я жестко закодировал возврат следующим образом:

<?php
    header('Content-type: application/json');

    $response = array(
      'role' => 0
    );

    echo (json_encode($response));

?>

Если я подключу свой HTML непосредственно к этому тестовому файлу, я получу массив, который Я ожидаю, но когда я пытаюсь сначала выполнить маршрутизацию через свой интерфейсный файл PHP, мне все равно возвращается пустая строка. Пожалуйста, помогите мне.

РЕДАКТИРОВАТЬ: Если это полезно, я размещаю данные из моего HTML файла следующим образом:

<script>

        const form = {
          username: document.getElementById('username'),
          password: document.getElementById('password'),
          login: document.getElementById('login'),
        };

        form.login.addEventListener('click',validate);


        function validate() {

            var ajax = new XMLHttpRequest();

            ajax.onload = function() {
              if (this.status == 200) {
                console.log(this.responseText);
                const response = JSON.parse(this.responseText);

                if(response['role'] == 1){ 
                  location.href = 'teacher.html';
                }
                else if (response['role'] == 0)  {
                  location.href = 'student.html';
                }
              }
            };     

            const postData = `username=${form.username.value} password=${form.password.value}`;
            ajax.open('POST','login.php',true);
            console.log(postData);
            ajax.send(postData);
        }

</script>

1 Ответ

0 голосов
/ 26 мая 2020

Вам необходимо указать формат данных, которые вы хотите отправить, в вашем ajax запросе.

Похоже, вы близки к формату urlencoded, поэтому вам нужно добавить этот заголовок:

ajax.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
ajax.send(postData);

И ваши параметры должны быть разделены амперсандом &, а не пробелом:

const postData = `username=${form.username.value}&password=${form.password.value}`;

Кроме того, вы можете экранировать свои данные с помощью encodeURIComponent ( ) , потому что на данный момент, если ваш логин или ваш пароль содержат амперсанд, это нарушит формат данных POST:

const username = `${form.username.value}` ;
const password = `${form.password.value}`
const postData = 'username=' +  encodeURIComponent(username) + '&password=' +  encodeURIComponent(password);
...