Php JSON_解码从cURL响应返回NULL,即使编码格式似乎正确?
编辑:对于解决方案,请查看下面Barmar的回复。希望这能帮助任何有类似问题的人。 我正试图从test.php文件中获取一个登录名,并将其卷曲到一个站点,该站点使用数据模拟另一个页面上的登录名(我知道这很乏味,但这并不是我作为一个整体所做的全部工作,只是我遇到了问题)。因此,我将一个编码的json发布到index.php url中,对其进行解码没有问题。然后使用传递的信息并编辑解码的json以显示登录成功或失败。json然后再次编码,并在页面上回响,并保存在test.php上的$contents中。当我试图在这个文件上解码时,每次都会得到NULL。我已经尝试了很多事情,我开始认为我在某个地方犯了一个愚蠢的错误,所以我在这里拼命寻求帮助 -如果我回显$contents,它将显示:Php JSON_解码从cURL响应返回NULL,即使编码格式似乎正确?,php,json,curl,post,Php,Json,Curl,Post,编辑:对于解决方案,请查看下面Barmar的回复。希望这能帮助任何有类似问题的人。 我正试图从test.php文件中获取一个登录名,并将其卷曲到一个站点,该站点使用数据模拟另一个页面上的登录名(我知道这很乏味,但这并不是我作为一个整体所做的全部工作,只是我遇到了问题)。因此,我将一个编码的json发布到index.php url中,对其进行解码没有问题。然后使用传递的信息并编辑解码的json以显示登录成功或失败。json然后再次编码,并在页面上回响,并保存在test.php上的$contents
{"user":"user","pass":"password","success":true}
-如果I var_dump(trim($contents)),它会显示(格式完全如图所示):
-最后一个错误消息显示:
SYNTAX ERROR
-我尝试过修剪、utfencoding、iconv、设置卷曲头,以及我在这里看到的其他帖子中推荐的一切
任何帮助都将不胜感激。提前谢谢各位
test.php:
<html>
<head>
<meta charset="UTF-8">
<title>TITLE</title>
</head>
<body>
<form action="test.php" method=POST>
<input type="text" name="user">
<input type="password" name="pass">
<input type="submit" value="Submit">
</form>
<?php
function logInfo(){
class data{
public $user = "";
public $pass = "";
public $success = false;
}
$data = new data();
$data->user = $_POST['user'];
$data->pass = $_POST['pass'];
$ch = curl_init();
$json = json_encode($data);
curl_setopt($ch, CURLOPT_URL, [URL TO INDEX.PHP]);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, array("data"=>$json));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
$contents = curl_exec($ch);
curl_close($ch);
$array = json_decode($contents, true);
var_dump($array);
//VAR_DUMP SHOWS NULL
}
if(isset($_POST['user']) && isset($_POST['pass'])){
logInfo();
}
?>
</body>
</html>
标题
index.php:
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<form action="test.php" method=POST>
<input type="hidden" name="data">
</form>
<?php
header('Context-type: application/json');
function logInfo(){
$datastring = $_POST['data'];
$data = json_decode($datastring);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, [URL TO SIMULATE LOGIN]);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, [LOGIN POST]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_exec($ch);
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if($code == [SUCCESSFUL LOGIN HTTP CODE]){
$data->success = true;
} else {
$data->success = false;
}
echo json_encode($data);
curl_close ($ch);
}
if(isset($_POST['data'])){
logInfo();
}
?>
</body>
</html>
编辑:对于解决方案,请查看下面Barmar的回复。希望这能帮助任何有类似问题的人。你应该这样做
json_encode(get_object_vars($data));
在logInfo函数中
我想推荐几件事。在函数中定义类不是一个好的做法。你应该将你的类放在一个单独的文件中。它有助于保持代码的条理化
其次,在定义类/方法/函数等时,最好遵循snake-case或camel-case
蛇形案例:我的函数名要执行
Camel case例如:MyFunctionNameToExecute
index.php
在JSON之前打印HTML(当var\u dump()
说字符串长365个字符,但你只能看到大约50个字符时,你不怀疑吗?)。当脚本用于返回JSON时,它无法生成任何其他输出
因此,在打印任何输出之前,请检查数据
参数。如果找到了,在发送JSON后退出脚本,这样就不会打印HTML
<?php
if(isset($_POST['data'])){
logInfo();
exit();
}
?>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<form action="test.php" method=POST>
<input type="hidden" name="data">
</form>
<?php
</body>
</html>
<?php
function logInfo(){
header('Context-type: application/json');
$datastring = $_POST['data'];
$data = json_decode($datastring);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, [URL TO SIMULATE LOGIN]);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, [LOGIN POST]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_exec($ch);
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if($code == [SUCCESSFUL LOGIN HTTP CODE]){
$data->success = true;
} else {
$data->success = false;
}
echo json_encode($data);
curl_close ($ch);
}
尝试使用此库检查生成的JSON语法
更新
它可以正确地检测index.php
中的额外HTML以及其他可能的问题
下面的例子
use Seld\JsonLint\JsonParser;
$parser = new JsonParser();
$exception = $parser->lint('<html>{"user":"user","pass":"password","success":true}');
echo $exception->getMessage();
使用Seld\JsonLint\JsonParser;
$parser=新的JsonParser();
$exception=$parser->lint('{“user”:“user”,“pass”:“password”,“success”:true}');
echo$exception->getMessage();
将输出:
Parse error on line 1:
<html>{"user":"user"
^
Expected one of: 'STRING', 'NUMBER', 'NULL', 'TRUE', 'FALSE', '{', '['
第1行的分析错误:
{“用户”:“用户”
^
应为“字符串”、“数字”、“空”、“真”、“假”、“{”、“[”中的一个”
似乎没有任何理由定义该类。他可以使用一个简单的关联数组。它们都生成相同的JSON。更改了您所说的所有内容。感谢您的帮助。不幸的是,解码时仍然为空。他的问题是JSON\u decode()
,而不是JSON\u encode()
。为什么您认为更改正在编码的对象会有所不同?@Barmar它是在我尝试不同方法时创建的,我没有真正的原因就离开了它。感谢您的帮助。不幸的是仍然返回NULL。您应该查看var\u dump()的输出
使用查看源代码
,以防有其他HTML元素。编辑:在测试中使用不同的登录信息,编辑代码,var_dump($contents)显示相同。查看源代码时,您仍然可以看到所有HTML?我完全从页面中删除了所有HTML。之后,我可以让它正常工作。如果您不让我注意HTML在卷曲中的返回,我将永远不会得到它。非常感谢。我从未使用过PHP,因此尝试解决这一问题是一项艰巨的任务。
Parse error on line 1:
<html>{"user":"user"
^
Expected one of: 'STRING', 'NUMBER', 'NULL', 'TRUE', 'FALSE', '{', '['