2017-06-05 87 views
0

我试图通过调用file_get_contents函数获得完整的HTTP答案。我正在执行HTTP POST调用,将凭据登录到我的网站,处理一些工作,然后将HTTP答复返回给调用者。
当凭证都不好,我送HTTP 403返回代码,与消息如下(原始HTTP响应如图了SoapUI):file_get_contents - 获取真正完整的HTTP答案(不只是标题)

HTTP/1.1 403 Forbidden 
Server: Apache-Coyote/1.1 
X-UA-Compatible: IE=edge 
Pragma: no-cache 
Cache-Control: no-cache 
Expires: Mon, 05 Jun 2017 09:02:13 GMT 
Content-Type: text/plain;charset=utf-8 
Content-Length: 515 
Date: Mon, 05 Jun 2017 09:02:13 GMT 

L'authentification user/password n'est pas autorisée pour le login 'sebastien' depuis l'adresse '127.0.0.1'. 

我怎么能在底部得到的消息在PHP中调用file_get_contents之后?消息不在标题中,所以$ http_response_header将不起作用。有没有办法做到这一点?

+0

“服务器:Apache-Coyote .... X-UA兼容:IE =边缘” - 这里很奇怪。 – symcbean

回答

0

甲HTTP响应身体应该从标头由一个空行被分离:https://www.w3.org/Protocols/rfc2616/rfc2616-sec6.html

然后身体应该作为file_get_contents调用的结果。

+0

嗯身体是从标题分开(它没有正确显示在我的第一篇文章,我编辑它),但由于HTTP响应代码是403,身体不返回file_get_contents,这是一个布尔(假)在这种情况下不是字符串。 – Sooron

1

您可以创建一个HTTP stream context用的file_get_contents使用(),然后调用stream_get_meta_data()但我个人只想用卷曲带CURLOPT_HEADER=true

注意,因为该服务返回一个403而不是401,那么你会需要cookies(如果可能的话)进行身份验证。为此你需要卷曲。

+0

是的。使用卷曲。或者更好的是,使用Guzzle。卷曲可能有点痛苦,但Guzzle使它变得容易(就像使用'file_get_contents()'一样简单)。还要注意,PHP可以配置为阻止'file_get_contents()'在http上运行;如果你打算让你的代码在你不控制系统配置的系统上运行,那么你必须改用Curl或Guzzle。 – Simba