2016-05-31 141 views
3

我尝试使用.net WebAPI和PHP。没有错误时一切正常。但是,当WebApi出现错误(比如验证POST数据失败)时,我很容易得到响应头,但我无法找到如何获取响应内容,以便我可以读取导致错误的原因。如何获取php file_get_contents()错误响应内容

是否有人有想法如何得到它或者是不可能的?

WebAPI的testController上有test()动作,它需要id和text作为请求的内容,否则它会返回HTTP/1.1 400 Bad Request,并告知原因。

我使用Fiddler来测试的WebAPI:

POST http://localhost:56018/api/test/test 
User-Agent: Fiddler 
Content-Type: application/json 
Host: localhost:56018 
Content-Length: 32 
Content: {"id": 5,"text" : '',} 

的回应是:

HTTP/1.1 400 Bad Request 
... 
Content-Length: 304 

{"args.Text":{"_errors":[{"<Exception>k__BackingField":null,"<ErrorMessage>k__BackingField":"The Text field is required."}],"<Value>k__BackingField":null},"Text":{"_errors":[{"<Exception>k__BackingField":null,"<ErrorMessage>k__BackingField":"The Text field is required."}],"<Value>k__BackingField":null}} 

所以它告诉在内容 “文本字段是必需的。”用PHP

同样做到:

$opts = array('http' => 
    [ 
     'method' => 'POST', 
     'header' => 'Content-type: application/x-www-form-urlencoded', 
     'content' => http_build_query(['id' => 1, 'text' => '']), 
     'ignore_errors' => true, 
    ] 
); 
$context = stream_context_create($opts); 
$response = file_get_contents('http://localhost:56018/api/test/test', false, $context); 
if($response === false) 
{ 
    echo json_encode($http_response_header); 
    die; 
} 
else 
{ 
    ... 
} 

所以我从$ http_response_header得到响应报头数据,但我没有找到任何方式得到的回应内容我看到提琴手。

是否有人有想法如何得到它或者是不可能的?

最后一个尖卷曲是不正确的答案,P

编辑:也许这是值得一提的是在$ http_response_header在这种情况下,当($响应===假):

array (
    0 => 'HTTP/1.1 400 Bad Request', 
    1 => 'Cache-Control: no-cache', 
    2 => 'Pragma: no-cache', 
    3 => 'Content-Type: application/json; charset=utf-8', 
    4 => 'Expires: -1', 
    5 => 'Server: Microsoft-IIS/10.0', 
    6 => 'X-AspNet-Version: 4.0.30319', 
    7 => 'X-SourceFiles: =?UTF-8?B?QzpcZG90TmV0NDBcR2FsbGUyV2ViQXBpXEdhbGxlMldlYkFwaVxhcGlcZ2FsbGUyXFRlc3Q=?=', 
    8 => 'X-Powered-By: ASP.NET', 
    9 => 'Date: Wed, 01 Jun 2016 06:33:11 GMT', 
    10 => 'Connection: close', 
    11 => 'Content-Length: 304', 
) 
+0

http://php.net/stream_get_meta_data –

+1

你已经添加到流选项的'ignore_errors'选项应该照顾这个。你没有运行一个非常老的PHP版本吗?如在5.2.10之前? – iainn

+0

我在php 5.5上运行(对不起,答案花了很长时间,我想回来后,但我忘了) –

回答

1

所以最终一切她贴e应该如此工作。在我来之前,我应该做一个独立的测试用例。 (但调试后,虽然它似乎你已经尝试了每一个选项:P)

所以我认为'ignore_errors'=>真,线被某种方式覆盖或忽略,但隔离它形成其他代码它的工作像假设和价值如果错误消息的内容是$ response。

所以在这种情况下,你需要做一些比if($ response === false)更多的错误检查。非常简单的方法可能是($ http_response_header [0]!='HTTP/1.1 200 OK'){处理错误! }

感谢您的每一个输入!

1

您可以尝试使用curl代替file_get_contents因为卷曲有错误处理更好的支持:

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, "http://localhost:56018/api/test/test"); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
$output = curl_exec($ch); 

$output = json_decode($output); 

if(curl_getinfo($ch, CURLINFO_HTTP_CODE) !== 200) { 
    var_dump($output); 
} 

curl_close($ch); 
+1

然而,它明确暗示不使用cURL:“最后一个提示cURL不正确的答案; P”* ... – CD001

+0

正确的,寻找答案似乎成为这个结论。问题在于它不在PHP的核心,所以如果你无法控制如何将PHP编译到服务器,可能是因为没有包含cURL库。 –

相关问题