ВебмастерскаяНовостиСекреты вебмастера

Конвертирование XML в JSON на PHP 8

Конвертирование 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 ресурса. Дальше этот сервис можно разместить на хостинге, например, и использовать его в других приложениях.

Источник

Статьи по теме

Добавить комментарий

Ваш адрес email не будет опубликован.

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

Back to top button