запрос flutter http post возвращает html вместо json

#php #flutter #dart #http-headers #http-post

Вопрос:

В моем приложении flutter я решил запустить свое приложение в реальном времени, разместив его онлайн из локальной базы данных (xampp), но теперь всякий раз, когда я запускаю свое приложение, я продолжаю получать

 FormatException: Unexpected character (at character 1)
<html><body><script type="text/javascript" src="/aes.js" ></script><script>...

//Full html code
<html><body><script type="text/javascript" src="/aes.js" ></script><script>function toNumbers(d){var e=[];d.replace(/(..)/g,function(d){e.push(parseInt(d,16))});return e}function toHex(){for(var d=[],d=1==arguments.lengthamp;amp;arguments[0].constructor==Array?arguments[0]:arguments,e="",f=0;f<d.length;f  )e =(16>d[f]?"0":"") d[f].toString(16);return e.toLowerCase()}var a=toNumbers("f655ba9d09a112d4968c63579db590b4"),b=toNumbers("98344c2eee86c3994890592585b49f80"),c=toNumbers("3bbe2c7d2bd575630c6e4c0b1537ed79");document.cookie="__test=" toHex(slowAES.decrypt(c,2,a,b)) "; expires=Thu, 31-Dec-37 23:55:55 GMT; path=/"; location.href="https://www.quelib.com/src/get_api/get_uni.php?i=1";</script><noscript>This site requires Javascript to work, please enable Javascript in your browser or use a browser with Javascript support</noscript></body></html>
 

Я искал на stackoverflow и других сайтах в Google, но ответы, которые я получил, заключаются в добавлении заголовков

 headers: {
  'Content-Type': 'application/json',
  'Charset': 'utf-8',
  "Accept": 'application/json'
}
 

или проверьте мой код состояния или закодируйте параметры моего тела с помощью jsonEncode (), так как я продолжаю получать Bad State ошибки всякий раз, когда запускаю свое приложение с 'Content-Type': 'application/json',

 Future<List<String>> getAllUni() async {
    List<String> uniAll = [];
    try {
      var apiUrl = url   "get_api.php";
      final Map<String, dynamic> data = {"action": "GET_UNI"};
      await http.post(Uri.parse(apiUrl), body: jsonEncode(data), headers: {
        'Content-Type': 'application/json',
        'Charset': 'utf-8',
        "Accept": 'application/json'
      }).then((response) {
        debugPrint(response.body);
        debugPrint(json.decode(response.body));
        print(response.body);
        print(json.decode(response.body));
        if (json.decode(response.body) == 'no_data') {
        } else {
          List jDecode = json.decode(response.body);

          if (response.statusCode == 200) {
            jDecode.forEach((e) {
              print(e.toString());
              uniAll.add(e['name'].toString());
            });
          } else {}
        }
      });
    } catch (e) {
      ContentReport.report.catchReport("get_api.dart", "getAllUni",
          e.toString());
    }
    return uniAll;
}
 

мой php-код

 $action = $_POST['action'];

if($action == 'GET_UNI') {

    $sql = $conn->prepare("SELECT * FROM uni ORDER BY name ASC");
    $sql->execute();
    $res = $sql->get_result();
    if (mysqli_num_rows($res) > 0) {
        while ($row = $res -> fetch_assoc()) {
            $data[] = $row;
        }
        echo json_encode($data);
    }
    else {
        echo json_encode("error_data");
    }
}
 

Пожалуйста, как мне решить эту проблему, потому что URL — ссылка работает отлично. Кроме того, если вам нужно больше объяснений, пожалуйста, скажите мне

Комментарии:

1. Вы пробовали это с почтальоном и хорошо с этим справлялись ?

Ответ №1:

 header('Content-type: application/json');
$action = $_POST['action'];

if($action == 'GET_UNI') {

    $sql = $conn->prepare("SELECT * FROM uni ORDER BY name ASC");
    $sql->execute();
    $res = $sql->get_result();
    if (mysqli_num_rows($res) > 0) {
        while ($row = $res -> fetch_assoc()) {
            $data[] = $row;
        }
        echo json_encode($data);
    }
    else {
        echo json_encode("error_data");
    }
}
 

Комментарии:

1. заголовок(«Тип содержимого: текст/json»); добавьте его в качестве заголовка в файл кода php.

2. вы также можете использовать XMLHttpRequest.setRequestHeader(заголовок, значение) для установки заголовка в http-запросе.

3. Все та же ошибка

4. заголовок(«Управление доступом-Разрешить-Происхождение: *»); заголовок(«Управление доступом-Разрешить-Заголовки: Происхождение, X-Запрошено С, Тип содержимого, Принять»); попробуйте использовать это также.

5. также попробуйте удалить «Принять»: «приложение/json» из заголовков запросов, а затем проверьте, разрешилось оно или нет.

Ответ №2:

Сделайте свой ответ на PHP — код более информативным. Один раз используйте код, как показано ниже:

 <?php 
$response["error"] = false;
$response["errmsg"] = "No message";
$response["date"] = array();

if(isset($_POST["action"])){
    $action = $_POST['action'];
    if($action == 'GET_UNI') {

        $sql = $conn->prepare("SELECT * FROM uni ORDER BY name ASC");
        $sql->execute();
        $res = $sql->get_result();
        if (mysqli_num_rows($res) > 0) {
            while ($row = $res -> fetch_assoc()) {
                array_push($response["data"], $row);
            }
        }else {
            $response["error"] = true;
            $response["errmsg"] = "NO any row found.";
        }
    }
}else{
     $resposne["error"] = true;
     $response["errmsg"] = "No action parameter submitted through POST.";
}

header('Content-Type: application/json');
echo json_encode($response);
?>
 

Вы можете посмотреть этот пример на FlutterCampus: Допустимый способ создания вложенных или сложных данных JSON с помощью PHP