我使用以下PHP代码来响应JavaScript fetch()
请求。
$json = json_encode(array(
'status' => 200,
'resources' => $dataObj
));
http_response_code(200);
header('Content-Type: application/json');
echo $json;
exit;
回到我的JavaScript代码中,收到回复后,我可以执行以下操作:
console.log(response.status);
console.log(response.resources);
console.log(JSON.stringify(response.resources));
第一行有效并显示值200
。其他行显示undefined
。
现在,如果我在代码之前添加response.json(),则所有三个控制台行都会正确显示。
let resp = await response.json();
console.log(resp.status);
console.log(resp.resources);
console.log(JSON.stringify(resp.resources));
我的问题是:为什么在第一个例子中我可以正确地看到200的状态,但我需要使用json()函数才能看到数据对象?
答案 0 :(得分:1)
当您发出http请求时 - 任何http请求 - 您将获得状态代码。这在响应对象上可用。
您还发送了一个status
属性作为响应正文的一部分,直到您明确告诉您的代码将响应正文读作json(response.json()
),您将无法读取任何您的自定义回复。
因此,基本上,您可以阅读的状态是服务器发回的状态 - 而不是您的json上的状态。
答案 1 :(得分:1)
如果你正在使用Fetch API,你将总是得到一个你不需要解析的对象。它已经是一个对象字面值,特别是https://developer.mozilla.org/en-US/docs/Web/API/Response。
此对象有一个名为status
的属性,在第一种情况下返回200.
但是,如果您在此对象上调用方法json()
,它将解析您的响应的正文,而不是整个问题。在此正文中,您从后端的状态而不是Response
的状态。
这就是为什么let resp = await response.json()
会使用您的resources
等回复您的实际回复数据。
答案 2 :(得分:0)
响应是一个字符串:
"{'status':200,'resources':'sth'}"
并且该字符串没有 resources 属性。首先需要将其解析为对象文字。
澄清一些困惑:
服务器发送完整响应,因此上层只是 body ,而http响应也包含标题。如果你这样做:
response.status
这实际上是标题状态。