Конвертирование XML в JSON на PHP 8
 
			Доброго времени суток! В данной статье мы рассмотрим с Вами, как можно создать простой сервис, единственной задачей которого будет конвертирование xml файла в json. Сервис будет принимать ссылку на XML файл и возвращать преобразованный ответ в формате JSON. Где это может пригодиться? Например, с помощью данного простого сервиса я сделал преобразование RSS ленты, которая представляет из себя XML, в JSON формат на сервере, ответ с которого потом передавался в Android приложение и выводился пользователю в интерфейсе.
Итак, приступим к коду. Основной функционал сервиса будет находиться в файле functions.php.
<?php
declare(strict_types=1);
// отформатированный вывод json
function util_json(mixed $value): bool|string
{
    return json_encode($value, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
}
// CORS заголовки, чтобы можно было запрашивать сервис посредством fetch в браузере
function cors(): void
{
    header('Access-Control-Allow-Origin: *');
    header('Access-Control-Allow-Methods: GET, POST');
    header('Access-Control-Max-Age: 1000');
    header('Access-Control-Allow-Headers: Content-Type, Authorization, X-Requested-With');
    header('Content-Type: application/json');
}
// отформатированный код ответа при ошибке
function error_response(string $message, int $code = 501): bool|string
{
    $responseMessage = ['code' => $code, 'error' => $message];
    return util_json($responseMessage);
}
/**
 * Сам конвертер - центральный элемент сервиса
 * 
 * @throws Exception
 */
function convertXml2Json(string $xmlUrl): bool|string
{
    // пытается загрузить ресурс по ссылке и преобразовать
    $element = @simplexml_load_file($xmlUrl, options: LIBXML_NOCDATA);
    // если ссылка не может быть загружена или возникла какая-то другая проблема - бросаем исключение
    if(!$element) {
        throw new Exception('Unable to parse xml resource from ' . $xmlUrl);
    }
    // форматируем в json
    return util_json($element->channel);
}
// обработчик запроса от клиента
function process_request(array $request_data, string $apiKey): string|bool
{
    $response_text = '';
    try {
        // если запрос содержит ключ авторизации и он равен нашему ключу $apiKey
        if($request_data['key'] === $apiKey)
        {
            // если в запросе передан правильный url ресурса
            if(!empty($request_data['resource']) && (filter_var($request_data['resource'], FILTER_VALIDATE_URL) !== false))
            {
                // выполняем конвертацию
                $response_text = convertXml2Json($request_data['resource']);
            }
            else
            {
                $response_text = error_response('Invalid url of xml resource');
            }
        }
        else
        {
            $response_text = error_response('Wrong access key');
        }
    }
    catch (Exception $e) {
        $response_text = error_response($e->getMessage());
    }
    return $response_text;
}
Файл index.php
<?php
require_once ('functions.php');
$url = "https://news.yandex.ru/internet.rss";
$apiKey = "API_KEY";
// данный запроса: resource -> url, key -> key
$mockGET = ['resource' => $_GET['url'] ?: $url, 'key' => $_GET['key']];
// отправляем заголовки
cors();
// и результат
print process_request($mockGET, $apiKey);
Протестировать на локальном ПК можно так:
php -S localhost:8080 index.php
Открываете в браузере адрес:
http://localhost:8080/?key=API_KEY
В результате получим JSON представление XML ресурса. Дальше этот сервис можно разместить на хостинге, например, и использовать его в других приложениях.
- 
					Создано 17.05.2022 08:42:45  
- 
					 Михаил Русаков Михаил Русаков
 
			 
			 
		 
				 
			 
				 
				 
				 
				
Комментарии (0):
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.