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