2010-08-12 6 views
2

Nous utilisons file_get_contents pour communiquer avec un service Web, qui crée des utilisateurs et, en cas de succès, renvoie un objet JSON avec les détails du nouvel utilisateur créé. le code ci-dessous montre comment nous le faisons, l'utilisateur est créé avec succès, ce qui signifie que nous pouvons le voir du back-end, cependant, nous ne pouvons pas obtenir la réponse JSON, il ne renvoie rien.Pourquoi file_get_contents ne reçoit rien du service Web?

public function register(){ 
    $username = "testing"; 
    $email = "[email protected]"; 
    $password = "testpsd"; 

    $userData = '{"$xmlns": {"pluser": "http://xml.webservice.com/auth/data/User"},' 
      .'"pluser$userName": "'.$username.'",' 
      .'"pluser$password": "'.$password.'",' 
      .'"pluser$fullName": "fullname",' 
      .'"pluser$email": "'.$email.'"}'; 
    $url = 'https://webservice.com?form=json'; 
    $cparams = array('http' => array('method' => 'POST','ignore_errors' => true)); 
    $cparams['http']['content'] = $userData;  
    $cparams['http']['request_fulluri'] = true; 
    $cparams['http']['header'] = 'Content-type: application/json'; 
    $context = stream_context_create($cparams); 

    $fp = @file_get_contents($url,false,$context);$res = stream_get_contents($fp); 
    print_r($res); 
} 

au début, nous pensions que le service web était censé nous avons testé contre rien renvoyer, il en C# qui fonctionnait parfaitement bien, ce qui signifie que nous avons eu la créer réponse de quelque chose comme { « stutas »: « avec succès », "userCreated": "true"} est ici le code C#:

String url = "https://webservice.com?form=json"; 
HttpWebRequest req = (HttpWebRequest) WebRequest.Create(url); 
     req.Method = "POST"; 

     string strRequest = "exactly the same json string"; 
     req.ContentLength = strRequest.Length; 
     StreamWriter streamOut = new StreamWriter(req.GetRequestStream(), System.Text.Encoding.ASCII); 
     streamOut.Write(strRequest); 
     streamOut.Close(); 
     StreamReader streamIn = new StreamReader(req.GetResponse().GetResponseStream()); 
     while (!streamIn.EndOfStream) 
      Console.WriteLine(streamIn.ReadToEnd()); 
     streamIn.Close(); 

     Console.ReadKey();} 

est quelque chose manquant ou mal configuré dans le code php?

+0

Avez-vous vérifié que le JSON est vraiment ce que vous pensez qu'il utilise 'print_r (json_decode (userData $))'? –

+0

@Peter, j'ai finalement réussi à résoudre ce problème en utilisant curl. curl n'a pas fonctionné au début parce que les réglages php étaient faux. dès que c'est corrigé, tout a fonctionné comme charme. Merci quand même – walter

Répondre

1

La fonction PHP file_get_contents récupérera tout le contenu de la réponse. Vous n'avez pas besoin du $res = stream_get_contents($fp). La réponse sera déjà en $fp.

Vous pouvez simplement faire ceci:

$fp = @file_get_contents($url,false,$context); 
print_r($fp); 
+0

génial! Merci beaucoup! J'ai la réponse mais c'est une exception java. pourquoi il renvoie une exception étant donné que l'URL et les données transmises sont exactement les mêmes? pourquoi cela fonctionne parfaitement bien dans C#? – walter

+0

Cela a probablement à voir avec votre back-end web. Vous pouvez essayer de supprimer l'en-tête content-type et de le remplacer par un en-tête content-length, ce qui le rapprocherait du code C#. –

+0

il renvoie "exception de contenu non pris en charge" si je remplace l'en-tête de type de contenu avec un en-tête de longueur de contenu. c'est vraiment bizarre. Je ne comprends toujours pas pourquoi le même service web accepte la demande de poste envoyée via C# mais pas php, cela n'a pas de sens ... – walter

Questions connexes