了解JavaScript响应

时间:2017-07-31 16:04:27

标签: javascript response

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

3 个答案:

答案 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

这实际上是标题状态。