2017-07-31 50 views
2

我正在使用以下PHP代码来响应JavaScript fetch()请求。了解JavaScript响应

$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

因为这就是它的工作原理。 https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch –

+2

您将所有http请求返回的'status'代码与您手动添加的'status'属性混合在一起到你的json响应。 – Jamiec

+0

@Jamiec哦不,你是对的。这正是我所做的。谢谢! – kojow7

回答

1

当你发出一个http请求 - 任何http请求 - 你会得到一个状态码。这在响应对象上可用。

你也派出了status财产作为响应体的一部分,直到你明确地告诉你的代码来读取响应主体为JSON(response.json())您将无法读取任何自定义响应的。

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

+0

谢谢。您在我的问题下发表的评论使一切变得清晰。我没有意识到这里有两个'地位'属性。 – kojow7

0

的响应是actuallay字符串:

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

和字符串处理不当一资源财产。您首先需要将其解析为对象字面值。

澄清一些混乱:

服务器发送一个完整的响应,所以将上限只是,而HTTP响应还包括一个的。如果你这样做:

response.status 

这实际上是头状态。

+0

这不是原因。在这种情况下'obj.status'会返回一个错误。因为你说,这只是一个字符串... – lexith

+0

@lexith没有多数民众赞成在不是jsons .status但标题状态信息 –

+0

我认为我们是沟通不畅;;)响应不是一个字符串。它是一个响应对象,这就是为什么'response.status'可以工作,但是他的'resources'实际上就是响应对象的主体,需要先用'response.json()'来解析。 – lexith

1

如果您使用的是Fetch API,您将永远得到一个不需要解析的对象。它已经是一个对象字面量,特别是https://developer.mozilla.org/en-US/docs/Web/API/Response

该对象有一个名为status的属性,它在第一种情况下返回200。

如果然而调用该方法json()这个对象上,它会分析你的反应,而不是整个事情的。在这个机构中你有你的状态从后台而不是Response的状态。

这就是为什么let resp = await response.json()会将您的实际响应数据返回给您的resources等。