从PHP脚本获取json字符串输出时,如何解决“输入意外结束”错误

时间:2019-01-23 08:25:13

标签: php json fetch-api

在获取来自PHP脚本输出的json数据时遇到问题。这是脚本中的代码:

header("Content-Type: application/json; charset=UTF-8");

$stmt = $mysqli->prepare($sql);
$stmt->execute();
$result = $stmt->get_result();
$response = $result->fetch_all(MYSQLI_ASSOC);

echo json_encode($response);

/*$fp = fopen('datakomp.json', 'w');
fwrite($fp, json_encode($response));
fclose($fp);*/

如代码的注释部分所示,我使用相同的脚本将数据存储在json文件中。 从生成的json数据文件中获取数据时,不做任何修改,我的应用程序运行良好。
但是,当直接从上述php脚本输入的json字符串中提取相同数据时,会出现错误:“输入意外结束”。 使用chrome dev工具,我看到标题显示的状态码为200(Ok),在预览中,它显示了预期的数据。
我检查了json文件中的数据和json字符串输入之间是否没有差异。

这是在我的React应用程序中获取数据的代码:

fetch('http://localhost:100/myreactappversi2/myapp2/public/data/tes2.php', {
        method: 'GET',
        headers:{
            'Content-Type': ['application/json','charset=UTF-8'],
        },
        mode: "no-cors",
        cache: "no-cache",
        credentials: "include"
    })
    .then(response => response.json())
    .then(rowData => this.setState({rowData}))
    .catch(error =>  alert("Error : " + error))

我一直在尝试解决此问题,包括交替使用内容类型标题,response.text,json.parse等,但是结果基本上是相同的,就像输入为空一样。

我希望从php脚本输入相同的json字符串,就像从json文件中提取相同的数据一样。但是好像输入是空的。

编辑:
回复收到的评论,这是我的解释:
我已经阅读了链接给出的帖子。我的情况与链接中所述的情况有所不同。链接中的请求是POST,而我的是GET。另外,正如我已经解释的那样,我对GET请求进行了比较:一个来自json文件,另一个来自json字符串,但是两者都包含完全相同的数据,这些数据是来自相同的php脚本。
设置“ Access-Control-Allow-Origin”不能解决我的问题。 如果我将“模式”和/或“凭据”更改为默认值或其他值,则错误将为“无法获取”。

编辑2: 是的..可能由于我缺乏HTTP和CORS知识而出现此问题。仔细阅读MDN中有关这些主题的文档后,我开始更好地理解它们。所以我修改了客户端(js文件)和服务器端(php文件)中的代码,如下所示:

  1. 在客户端(js文件):

    mode: "cors",
    cache: "no-cache",
    credentials: "include" // value of "omit" works too            
    

    在标题部分,我添加:

    'Origin':'http://localhost:3000'
    
  2. 在服务器端(php文件)中,添加:

    if($_SERVER['HTTP_ORIGIN'] == "http://localhost:3000") {
        header('Access-Control-Allow-Origin: http://localhost:3000');
        header('Access-Control-Allow-Methods: POST, GET, OPTIONS');
        header('Access-Control-Allow-Headers: origin, Content-Type');
        header('Access-Control-Allow-Credentials: true');
        //header('Access-Control-Max-Age: 1728000');
    }
    

这样做后,我的应用程序运行正常。当然,我的代码仍需要改进。 但是,基本上,问题已解决
我现在很高兴。 :) 无论如何,我应该感谢sideshowbarker的链接,该链接使我彻底阅读了HTTP和CORS的文档,包括如何处理MDN中的CORS预检。

0 个答案:

没有答案