在获取来自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文件)中的代码,如下所示:
在客户端(js文件):
mode: "cors",
cache: "no-cache",
credentials: "include" // value of "omit" works too
在标题部分,我添加:
'Origin':'http://localhost:3000'
在服务器端(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预检。