调用Microsoft Graph Calendar分块时遭遇504网关超时问题求助
解决Guzzle调用Microsoft Graph Calendar接口时的504超时问题
咱们先揪出问题根源——你不小心把Postman里看到的响应头当成请求头发送了,这才导致了网关超时的坑。我来一步步帮你理顺:
问题核心:冗余且错误的请求头
你当前的$headers数组里混了好几个属于服务器响应头的字段,这些是服务器返回给客户端的信息,根本不该出现在你的请求里:
Transfer-Encoding: chunked:这是服务器告诉客户端“我用分块方式发响应”,不是客户端要发给服务器的请求头Content-Encoding: gzip:同样是服务器说明响应内容的压缩方式,请求里应该用Accept-Encoding: gzip表示你接受压缩响应Vary: Accept-Encoding:用于缓存控制的响应头,和客户端请求无关x-ms-ags-diagnostic:这是Microsoft Graph返回的服务器诊断信息,属于响应头,完全没必要加到请求里
Postman能正常工作,是因为它只会发送必要的请求头,不会把响应头混进去——你大概率是直接复制了Postman Headers标签里的所有内容,连下方的响应头部分也一起抄了。
修正后的请求头配置
只保留真正需要的请求头就行,下面是精简后的版本:
$headers = [ 'Authorization' => 'Bearer ' . $this->getAccessToken(), 'Content-Type' => 'application/json;odata.metadata=minimal;odata.streaming=true;IEEE754Compatible=false;charset=utf-8', 'Preference-Applied' => 'odata.track-changes', 'OData-Version' => '4.0', 'Accept-Encoding' => 'gzip' // 如果你需要接受压缩响应,加这个,而不是Content-Encoding ];
修正后的Guzzle请求代码
$request = $this->guzzle->get( 'v1.0/me/calendarview/delta?startdatetime=2019-12-12T00:00:00Z&enddatetime=2019-12-13T00:00:00Z', ['headers' => $headers] ); print_r($request->getBody()->getContents()); // 建议用getContents()更稳妥,避免直接打印对象
额外提醒
- Guzzle会自动处理传输层的细节(比如
Transfer-Encoding),手动设置反而会打乱它的默认逻辑,导致服务器无法正确解析请求,最终触发504超时。 - 之前不设
Transfer-Encoding就拿不到事件,大概率是其他冗余头的干扰,修正请求头后应该就能正常获取数据了。
内容的提问来源于stack exchange,提问作者Sinan Samet
相关产品推荐
相关产品推荐

