2016-05-31 1 views
3

J'essaie de consommer .net WebAPI avec PHP. Tout fonctionne bien quand il n'y a pas d'erreur. Mais quand il y a une erreur dans WebApi (disons que la validation des données POST échoue) j'obtiens l'en-tête de réponse facilement mais je ne peux pas trouver comment obtenir le contenu de la réponse afin que je puisse lire ce qui a causé l'erreur.Comment obtenir php file_get_contents() error response content

Est-ce que quelqu'un a une idée de comment l'obtenir ou est-ce impossible?

Il y a une action test() sur testController de WebAPI qui nécessite l'id et le texte comme contenu de la requête ou il retournera HTTP/1.1 400 Bad Request avec un contenu indiquant la raison.

Je Fiddler pour tester la 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" : '',} 

La réponse est:

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}} 

Il est dit dans le contenu que "Le champ de texte est nécessaire."

même fait avec 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 
{ 
    ... 
} 

J'obtenir les données d'en-tête de réponse de http_response_header $, mais je ne trouve aucun moyen d'obtenir le contenu de la réponse que je vois avec Fiddler.

Est-ce que quelqu'un a une idée de comment l'obtenir ou est-ce impossible?

Et enfin une astuce cURL n'est pas bonne réponse; P

Edit: Peut-être qu'il vaut la peine de mentionner ce qui est dans http_response_header de $ dans ce cas quand (réponse de $ === false):

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

L'option 'ignore_errors' que vous avez ajoutée aux options de flux devrait prendre soin de cela. Vous n'utilisez pas une très ancienne version de PHP, n'est-ce pas? Comme dans, plus de 5.2.10? – iainn

+0

Je cours sur PHP 5.5 (désolé la réponse a pris longtemps.J'étais supposé revenir après mais j'ai oublié) –

Répondre

1

Ainsi, dans la fin tout a posté e fonctionne comme il se doit. J'aurais dû faire des tests isolés avant de venir ici. Donc, je pense que la ligne 'ignore_errors' => true, a été écrasée ou ignorée, mais l'isoler de l'autre code a fonctionné comme supposé et la valeur de $ response si le contenu du message d'erreur.

Dans ce cas, vous devez effectuer la vérification d'erreur d'une autre manière que si ($ response === false). Un moyen très simple pourrait être if ($ http_response_header [0]! = 'HTTP/1.1 200 OK') {gérer l'erreur! }

Merci pour toutes les entrées!

1

Vous pouvez essayer d'utiliser curl au lieu de file_get_contents car boucle a un meilleur support pour la gestion des erreurs:

$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

Pourtant, il a été explicitement fait allusion à ne pas utiliser cURL: * "Et enfin un conseil cURL n'est pas la réponse correcte; P" * ... – CD001

+0

À droite, la recherche semble devenir à cette conclusion. Le problème est que ce n'est pas dans le noyau de PHP, donc si vous n'avez aucun contrôle sur la façon dont le PHP est compilé sur le serveur, il se peut qu'il n'y ait pas de bibliothèque cURL incluse. –