了解 JavaScript 回复

Understanding JavaScript responses

我正在使用以下 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()函数才能看到数据对象?

响应实际上是一个字符串:

  "{'status':200,'resources':'sth'}"

并且该字符串没有 资源 属性。您首先需要将其解析为 object 文字。

澄清一些困惑:

服务器发送一个完整的响应,所以上面的只是 body ,而 http 响应也包含 header。如果你这样做:

response.status

这实际上是 header 的状态。

当您发出 http 请求(任何 http 请求)时,您将获得一个状态代码。这在响应对象上可用。

您还发送了 status 属性 作为响应正文的一部分,直到您明确告诉您的代码将响应正文读取为 json(response.json()) 您将无法阅读 任何 的自定义回复。

所以,基本上,您可以读取的状态是服务器发回的状态 - 而不是您 json 上的状态。

如果您使用 Fetch API you will always get an object back which you don't need to parse. It's already an object literal, specifically a https://developer.mozilla.org/en-US/docs/Web/API/Response

此对象有一个名为 status 的 属性,在您的第一种情况下 returns 200。

如果您确实在此对象上调用方法 json(),它将解析您响应的 正文,而不是整个内容。在这个正文中,你有 你来自后端的状态 而不是 Response.

的状态

这就是为什么 let resp = await response.json() 将 return 你的实际响应数据与你的 resources 等。