@WarStyle

Php, json, urlencode — не понимаю?

Всем привет.
Есть у одного хостинга свое api - прикрутил и вроде бы всё ок но(!)
Когда сервер отправляет отчет об ошибке (например из-за того что адрес с таким именем уже существует я получаю вот такое сообщение "{"status":"error","message":"\u041f\u043e\u0447\u0442\..."
\u041f\u043e\u0447\u0442\... - это urlencoded-текст в кодировке UTF-8.
Специально воспроизвожу ошибку

attachment.php?attachmentid=513&stc=1&d=attachment.php?attachmentid=514&stc=1&d=

В доках у провайдера на это API написано:

Ответ на POST запрос всегда возвращается в кодировке UTF-8. Может быть возвращен в формате JSON или XML. В рамках документации рассматриваются только примеры в формате JSON.
Ответ всегда содержит поле status, которое может принимать значения error или success.
error: означает, что при попытке выполнить запрос произошла ошибка. При этом детальное описание ошибки будет возвращено в поле message.
{"status":"error","message":"Почтовый ящик с именем test уже существует."}
success: запрос выполнен успешно. При этом, в зависимости от выполненной операции, сервер может возвратить дополнительные данные в поле data.
{"status":"success","data":"219493"}


То есть, насколько я понимаю, нужно сначала [url]http://php.ru/manual/function.json-decode.html[/url], потом уже взять конкретный элемент массива с ответом и применить к нему [url]http://php.net/manual/en/function.urldecode.php[/url]
Мой запрос

<?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 для меня слишком сложно.
Помогите дописать :(
  • Вопрос задан
  • 768 просмотров
Решения вопроса 1
Melkij
@Melkij
PostgreSQL DBA
это urlencoded-текст в кодировке UTF-8.

Берите выше. Это один целый JSON. JSON таким же образом кодирует не ASCII символы. После json_decode никакого urldecode делать уже не нужно.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы