2016-05-31 142 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庫。 –

相關問題