如何获取phpfile_get_contents()错误响应内容
How to get php file_get_contents() error response content
我尝试使用 PHP 使用 .net WebAPI。没有错误时一切正常。但是当 WebApi 中出现一些错误时(假设 POST 数据验证失败)我很容易得到响应 header 但我无法找到如何获取响应内容所以我可以阅读导致的原因错误。
有人知道如何获得它吗?还是不可能?
WebAPI 的 testController 上有 test() 操作,它需要 id 和 text 作为请求的内容,否则它将 return HTTP/1.1 400 Bad Request with content telling the reason.
我使用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}}
所以它在内容中说 "The Text field is required."
与 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 获得了响应 header 数据,但我找不到任何方法来获取我在 Fiddler 中看到的响应内容。
有人知道如何获得它吗?还是不可能?
最后提示 cURL 不是正确答案;P
编辑:在这种情况下($response === false):
,也许值得一提的是 $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',
)
您可以尝试使用 curl
而不是 file_get_contents
,因为 curl 对错误处理有更好的支持:
$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);
所以最终这里发布的所有内容都按预期工作。我应该在来这里之前做一个独立的测试用例。 (但是在调试之后,您似乎已经尝试了所有选项:P)
所以我认为 'ignore_errors' => true, line 以某种方式被覆盖或忽略,但将它与其他代码隔离开来,它像假设的那样工作,如果错误消息的内容是 $response 的值。
所以在这种情况下,您需要使用 if($response === false) 以外的其他方式进行错误检查。非常简单的方法可能是 if($http_response_header[0] != 'HTTP/1.1 200 OK') { 处理错误! }
感谢大家的参与!
我尝试使用 PHP 使用 .net WebAPI。没有错误时一切正常。但是当 WebApi 中出现一些错误时(假设 POST 数据验证失败)我很容易得到响应 header 但我无法找到如何获取响应内容所以我可以阅读导致的原因错误。
有人知道如何获得它吗?还是不可能?
WebAPI 的 testController 上有 test() 操作,它需要 id 和 text 作为请求的内容,否则它将 return HTTP/1.1 400 Bad Request with content telling the reason.
我使用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}}
所以它在内容中说 "The Text field is required."
与 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 获得了响应 header 数据,但我找不到任何方法来获取我在 Fiddler 中看到的响应内容。
有人知道如何获得它吗?还是不可能?
最后提示 cURL 不是正确答案;P
编辑:在这种情况下($response === false):
,也许值得一提的是 $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',
)
您可以尝试使用 curl
而不是 file_get_contents
,因为 curl 对错误处理有更好的支持:
$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);
所以最终这里发布的所有内容都按预期工作。我应该在来这里之前做一个独立的测试用例。 (但是在调试之后,您似乎已经尝试了所有选项:P)
所以我认为 'ignore_errors' => true, line 以某种方式被覆盖或忽略,但将它与其他代码隔离开来,它像假设的那样工作,如果错误消息的内容是 $response 的值。
所以在这种情况下,您需要使用 if($response === false) 以外的其他方式进行错误检查。非常简单的方法可能是 if($http_response_header[0] != 'HTTP/1.1 200 OK') { 处理错误! }
感谢大家的参与!