Сообщений: 104
	Тем: 17
	Зарегистрирован: Oct 2013
	
Репутация: 
52  
	 
 
	
		
		
		09-23-2015, 05:36 PM 
(Сообщение последний раз редактировалось: 09-23-2015, 07:01 PM   desolator .) 
  
		
	 
	
		Всем привет. 
Есть у одного хостинга свое api - прикрутил и вроде бы всё ок но(!)
 Когда сервер отправляет отчет об ошибке (например из-за того что адрес с таким именем уже существует я получаю вот такое сообщение "{"status":"error","message":"\u041f\u043e\u0447\u0442\..."
 
\u041f\u043e\u0447\u0442\...  - это urlencoded-текст в кодировке UTF-8.
Специально воспроизвожу ошибку
В доках у провайдера на это API написано: 
			API DOC 
			
Ответ на POST запрос всегда возвращается в кодировке UTF-8. Может быть возвращен в формате JSON или XML. В рамках документации рассматриваются только примеры в формате JSON. 
Ответ всегда содержит поле status, которое может принимать значения error или success. 
error: означает, что при попытке выполнить запрос произошла ошибка. При этом детальное описание ошибки будет возвращено в поле message. 
{"status":"error","message":"Почтовый ящик с именем test уже существует."} 
success: запрос выполнен успешно. При этом, в зависимости от выполненной операции, сервер может возвратить дополнительные данные в поле data. 
{"status":"success","data":"219493"} 
		 
То есть, насколько я понимаю, нужно сначала 
http://php.ru/manual/function.json-decode.html , потом уже взять конкретный элемент массива с ответом и применить к нему 
http://php.net/manual/en/function.urldecode.php 
Мой запрос 
PHP код:
<?php 
$fields  = array( 
     'auth_login'  =>  "moi_login" , 
     'auth_token'  =>  "moi_token" , 
    
     'class'  =>  "hosting_mailbox" , 
     'method'  =>  "create" , 
    
     'account'  =>  "moi_acc" ,  
     'mailbox'  =>  $_POST [ 'mailbox' ], 
     'password'  =>  $_POST [ 'password' ], 
); 
 
 $fields_string  =  "" ;  
foreach( $fields  as  $key  =>  $value ) { 
      $fields_string  .=  $key . '=' . urlencode ( $value ). '&' ; 
} 
 
 rtrim ( $fields_string ,  '&' ); 
  
 $ch  =  curl_init (); 
 curl_setopt ( $ch ,  CURLOPT_URL ,  "https://HOSTING/api.php" ); 
 curl_setopt ( $ch ,  CURLOPT_RETURNTRANSFER ,  1 ); 
 curl_setopt ( $ch ,  CURLOPT_POST ,  count ( $fields )); 
 curl_setopt ( $ch ,  CURLOPT_POSTFIELDS ,  $fields_string ); 
 $response  =  curl_exec ( $ch ); 
 curl_close ( $ch ); 
echo  "Ответ на Ваш запрос: " . $response ; 
 ?> Проблема заключается в том, что я очень хреново знаю php и js. urldecode на пару с json-decode для меня слишком сложно.
Помогите дописать 
 
	 
	
Файлы вложений  
 
 
  one.jpg  (Размер: 9.85 KB / Загрузок: 107)
 
 
  dva.jpg  (Размер: 7.52 KB / Загрузок: 104)
 
	
	
	
 
 
 
	
	
	
		
	Сообщений: 104
	Тем: 17
	Зарегистрирован: Oct 2013
	
Репутация: 
52  
	 
 
	
		
		
		09-24-2015, 10:05 AM 
(Сообщение последний раз редактировалось: 09-24-2015, 10:35 AM   desolator .) 
  
		
	 
	
		Вот так работает.
PHP код:
<?php  
$json_string  =  'https://HOSTING/api.php' ; 
 $jsondata  =  file_get_contents ( $json_string ); 
 $response  =  json_decode ( $response , true ); 
echo  "<pre>" ; 
 print_r ( $response );  
  В моем случае это просто целый JSON. После json_decode никакого urldecode делать уже не нужно.
	
 
	
	
	
	
 
 
	
	
	
		
	Сообщений: 134
	Тем: 18
	Зарегистрирован: Aug 2015
	
Репутация: 
156  
	 
 
	
	
		Если вы про ответ, то не надо никаких urldecode делать.
Цитата: \u041f\u043e\u0447\u0442\... - это urlencoded-текст в кодировке UTF-8.
с чего вы взяли? 
 
	 
	
	
	
	
 
 
 
	
	
	
		
	Сообщений: 104
	Тем: 17
	Зарегистрирован: Oct 2013
	
Репутация: 
52  
	 
 
	
	
		Hett Написал: Если вы про ответ, то не надо никаких urldecode делать. 
 
 
с чего вы взяли? 
Та что-то мне так санчала показалось. Потом понял что это просто json
	
 
	
	
	
	
 
 
 
	
	
	
		
	Сообщений: 134
	Тем: 18
	Зарегистрирован: Aug 2015
	
Репутация: 
156  
	 
 
	
	
		Кстати делать 
Код:
foreach($fields as $key => $value) { 
     $fields_string .= $key.'='.urlencode($value).'&'; 
}
нет необходимости, можно просто передать массив key=>value как есть (энкодить ничего не нужно). 
С пхп 5.3 по крайней мере точно 
 
	 
	
	
	
	
 
 
 
	
	
	
		
	Сообщений: 104
	Тем: 17
	Зарегистрирован: Oct 2013
	
Репутация: 
52  
	 
 
	
	
		Появился еще один вопрос.
После ввода данных в форму и нажатия сабмит вроде бы всё ок. Ответы от сервера API приходят нормально (
либо error либо success ).
			pehepe 
			
PHP код:
<?php 
$fields  = array( 
     'auth_login'  =>  "q" , 
     'auth_token'  =>  "c" , 
    
     'class'  =>  "hosting_mailbox" , 
     'method'  =>  "create" , 
    
     'account'  =>  "c" ,  
     'mailbox'  =>  $_POST [ 'mailbox' ], 
     'password'  =>  $_POST [ 'password' ], 
); 
 
 $fields_string  =  "" ;  
foreach( $fields  as  $key  =>  $value ) { 
      $fields_string  .=  $key . '=' . urlencode ( $value ). '&' ; 
} 
 
 rtrim ( $fields_string ,  '&' ); 
  
 $ch  =  curl_init (); 
 curl_setopt ( $ch ,  CURLOPT_URL ,  "https://asd/api.php" ); 
 curl_setopt ( $ch ,  CURLOPT_RETURNTRANSFER ,  true ); 
 curl_setopt ( $ch ,  CURLOPT_POST ,  count ( $fields )); 
 curl_setopt ( $ch ,  CURLOPT_POSTFIELDS ,  $fields_string ); 
 curl_setopt ( $ch ); 
 $response  =  curl_exec ( $ch ); 
 curl_close ( $ch );  
 $json_string  =  'https://asd/api.php' ; 
 $jsondata  =  file_get_contents ( $json_string ); 
 $response  =  json_decode ( $response , true ); 
echo  "<pre>" ; 
 print_r ( $response ); 
 
 ?>   
		
Т.е. меня перенаправляет с 
http://192.168.0.117/new/  на 
http://192.168.0.117/new/mail.php 
Теперь хочу седлать так, что бы при нажатии "submit" проверялось значение 
PHP код:
<?php  
print_r ( $response );  
   сейчас оно выводится на экран в браузере(см. IMG), а мне надо проверить его средствами php и при условии 
success  перенаправлять например на /new/skype.html, а при 
error  очищать поля в форме и выводить popup на странице формы с ошибкой от  
PHP код:
<?php  
print_r ( $response );  
  . 
Пытался сделать так: 
PHP код:
<?php  
 if ( $response  ==  "хз как опредялять success в  $response " ) { $redirect_url  =  "/new/skype.html" ;} 
else { $redirect_url  =  "/new" ;} 
 
  
 header ( 'HTTP/1.1 200 OK' ); 
 header ( 'Location: http://' . $_SERVER [ 'HTTP_HOST' ]. $redirect_url ); 
exit();  
  Думал парсить страницу... но по-моему это п*ц плохо(  
Не знаю как выйти из ситуации. Может кто-то что-то подскажет 
	
	
	
	
	
 
	
	
	
		
	Сообщений: 604
	Тем: 16
	Зарегистрирован: Feb 2013
	
Репутация: 
4,248  
	 
 
	
	
		PHP код:
<?php  
 if( $response [ "status" ] ==  "error" ) 
{ 
 header ( 'Location: http://' . $_SERVER [ 'HTTP_HOST' ]. '/errorpage.php' ; 
die(); 
} 
else if( $response [ "status" ] ==  "success" ) 
{ 
 header ( 'Location: http://' . $_SERVER [ 'HTTP_HOST' ]. '/successpage.php' ; 
die(); 
}  
  
если я верно понял
	
 
	
	
	
	
 
 
	
	
	
		
	Сообщений: 104
	Тем: 17
	Зарегистрирован: Oct 2013
	
Репутация: 
52  
	 
 
	
	
		Попытался вот так:
			variant1 
			
PHP код:
<?php 
$fields  = array( 
     'auth_login'  =>  "clic.display@yandex.ru" , 
     'auth_token'  =>  "bbntf2ege3vz2p6b2e6a3ue435x07lu4fax4zv52c7ba4cj5as46q3g388x5x3p2" , 
    
     'class'  =>  "hosting_mailbox" , 
     'method'  =>  "create" , 
    
     'account'  =>  "clicinde" ,  
     'mailbox'  =>  $_POST [ 'mailbox' ], 
     'password'  =>  $_POST [ 'password' ], 
); 
 
 $fields_string  =  "" ;  
foreach( $fields  as  $key  =>  $value ) { 
      $fields_string  .=  $key . '=' . urlencode ( $value ). '&' ; 
} 
 
 rtrim ( $fields_string ,  '&' ); 
  
 $ch  =  curl_init (); 
 curl_setopt ( $ch ,  CURLOPT_URL ,  "https://adm.tools/api.php" ); 
 curl_setopt ( $ch ,  CURLOPT_RETURNTRANSFER ,  true ); 
 curl_setopt ( $ch ,  CURLOPT_POST ,  count ( $fields )); 
 curl_setopt ( $ch ,  CURLOPT_POSTFIELDS ,  $fields_string ); 
 curl_setopt ( $ch ); 
 $response  =  curl_exec ( $ch ); 
 curl_close ( $ch );  
 $json_string  =  'https://adm.tools/api.php' ; 
 $jsondata  =  file_get_contents ( $json_string ); 
 $response  =  json_decode ( $response , true ); 
echo  "<pre>" ; 
 print_r ( $response ); 
if( $response [ "status" ] ==  "error" ) 
{ 
 header ( 'Location: http://' . $_SERVER [ 'HTTP_HOST' ]. '/new' ; 
die(); 
} 
else if( $response [ "status" ] ==  "success" ) 
{ 
 header ( 'Location: http://' . $_SERVER [ 'HTTP_HOST' ]. '/new/skype.html' ; 
die(); 
}   
 ?>   
		
Получаю просто белый экран
Попытался ещё вот так:
			variant 2 
			
PHP код:
<?php 
$fields  = array( 
     'auth_login'  =>  "clic.display@yandex.ru" , 
     'auth_token'  =>  "bbntf2ege3vz2p6b2e6a3ue435x07lu4fax4zv52c7ba4cj5as46q3g388x5x3p2" , 
    
     'class'  =>  "hosting_mailbox" , 
     'method'  =>  "create" , 
    
     'account'  =>  "clicinde" ,  
     'mailbox'  =>  $_POST [ 'mailbox' ], 
     'password'  =>  $_POST [ 'password' ], 
); 
 
 $fields_string  =  "" ;  
foreach( $fields  as  $key  =>  $value ) { 
      $fields_string  .=  $key . '=' . urlencode ( $value ). '&' ; 
} 
 
 rtrim ( $fields_string ,  '&' ); 
  
 $ch  =  curl_init (); 
 curl_setopt ( $ch ,  CURLOPT_URL ,  "https://adm.tools/api.php" ); 
 curl_setopt ( $ch ,  CURLOPT_RETURNTRANSFER ,  true ); 
 curl_setopt ( $ch ,  CURLOPT_POST ,  count ( $fields )); 
 curl_setopt ( $ch ,  CURLOPT_POSTFIELDS ,  $fields_string ); 
 curl_setopt ( $ch ); 
 $response  =  curl_exec ( $ch ); 
 curl_close ( $ch );  
 $json_string  =  'https://adm.tools/api.php' ; 
 $jsondata  =  file_get_contents ( $json_string ); 
 $response  =  json_decode ( $response , true ); 
echo  "<pre>" ; 
 print_r ( $response ); 
if ( $response [ 'status' ] ===  'error' ) { 
 
 $redirect_url  =  "/new" ; 
} else { 
 
 $redirect_url  =  "/new/skype.html" ; 
} 
 ?>   
		 
Получаю экран с ошибкой.
Что в первом, что во втором вариантах никакого редиректа не происходит(
	
 
	
	
	
	
 
	
	
	
		
	Сообщений: 604
	Тем: 16
	Зарегистрирован: Feb 2013
	
Репутация: 
4,248  
	 
 
	
	
		проще все
убрать
PHP код:
<?php  
 echo  "<pre>" ; 
 print_r ( $response );  
 а дальше написать
PHP код:
<?php  
 if ( $response [ 'status' ] ==  'error' ) { 
 //вместо  redirect_url  какое-то действие 
 $redirect_url  =  "/new/skype.html" ; 
} else { 
 //вместо  redirect_url  какое-то действие 
 $redirect_url  =  "/new" ; 
}  
  
так как последний вариант и не факт что будет работать.
еще бы по-хорошему, при дебаге не плохо в начале скрипта ставить
PHP код:
<?php  
error_reporting ( E_ALL );  
   
и обращаю внимание: в данном случае лучше все же ставить не ===, а ==
	
	
	
	
	
 
	
	
	
		
	Сообщений: 104
	Тем: 17
	Зарегистрирован: Oct 2013
	
Репутация: 
52  
	 
 
	
	
		Включл вывод ошибок
забахал вот так:
PHP код:
<?php  
 if ( $response [ 'status' ] ==  'error' ) { 
 //вместо  redirect_url  какое-то действие 
 echo  "error" ; 
} else { 
 //вместо  redirect_url  какое-то действие 
 echo  "success" ; 
}  
 Отображается правильно error когда действительно ответ приходит error.
success -тоже верно выводится. Но когда пишу вместо echo - redirect_url при таких же условиях, вижу просто белый экран(