2010-08-12 2 views
2

Мы используем file_get_contents для связи с веб-службой, которая создает пользователей, и если она удалась, она возвращает объект JSON с деталями нового созданного пользователя. приведенный ниже код показывает, как мы это делаем, пользователь успешно создан, что означает, что мы можем видеть его с внешнего сервера, однако мы просто не можем получить ответ JSON, он ничего не возвращает.Почему файл_get_contents ничего не получает от веб-службы?

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

сначала мы думали, что веб-сервис должен был не вернуть ничего, так что мы тестировали против него в C#, который работал прекрасно, означает, что мы получили создать ответ что-то вроде { «stutas»: «успешной», "userCreated": "правда"} здесь 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();} 

есть что-то отсутствует или неправильно настроенное в коде PHP?

+0

Вы проверили, что JSON действительно то, что вы думаете, он использует 'print_r (json_decode ($ USERDATA))'? –

+0

@Peter, мне, наконец, удалось решить эту проблему, используя curl. завиток сначала не работал, потому что настройки php были неправильными. , как только это исправлено, все работает как шарм. Спасибо anyways – walter

ответ

1

Функция PHP file_get_contents получит все содержимое ответа. Вам не нужен $res = stream_get_contents($fp). Ответ будет уже в $fp.

Вы можете просто сделать это:

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

отлично! Большое спасибо! У меня есть ответ, но это исключение Java. Почему он возвращает исключение, учитывая, что URL и данные, переданные в, точно такие же? Почему это работает отлично в C#? – walter

+0

Это, вероятно, связано с вашим веб-интерфейсом. Вы можете попробовать удалить заголовок содержимого и заменить его заголовком длины содержимого, который приблизит его к C# -коду. –

+0

возвращает «исключение неподдерживаемого содержимого», если я заменил заголовок типа содержимого заголовком длины содержимого. это действительно странно. Я до сих пор не понимаю, почему тот же веб-сервис принимает почтовый запрос, отправленный с помощью C#, но не php, это не имеет смысла ... – walter

Смежные вопросы