Сообщений: 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 при таких же условиях, вижу просто белый экран(