|
1 | 1 | # Импорт новостей с внешнего ресурса |
2 | 2 |
|
3 | | -Статья в процессе написания... |
| 3 | +В данном разделе описывается API для импорта новостей с внешнего ресурса. Этот API предоставляет доступ к новостям через |
| 4 | +REST интерфейс. |
| 5 | + |
| 6 | +## API Endpoint |
| 7 | + |
| 8 | +### GET /api/news |
| 9 | + |
| 10 | +Этот эндпоинт возвращает список новостей. |
| 11 | + |
| 12 | +#### Параметры запроса |
| 13 | + |
| 14 | +| Параметр | Тип | Обязательный | Описание | |
| 15 | +|----------|--------|--------------|----------------------------------------------| |
| 16 | +| limit | number | Нет | Ограничение количества возвращаемых новостей | |
| 17 | +| offset | number | Нет | Смещение для пагинации | |
| 18 | + |
| 19 | +#### Формат ответа |
| 20 | + |
| 21 | +```json |
| 22 | +[ |
| 23 | + { |
| 24 | + "id": 1, |
| 25 | + "title": "Заголовок новости", |
| 26 | + "description": "Содержание новости", |
| 27 | + "createdAt": "2024-01-01T12:00:00.000Z" |
| 28 | + }, |
| 29 | + { |
| 30 | + "id": 2, |
| 31 | + "title": "Другая новость", |
| 32 | + "description": "Текст другой новости", |
| 33 | + "createdAt": "2024-01-02T15:30:00.000Z" |
| 34 | + } |
| 35 | +] |
| 36 | +``` |
| 37 | + |
| 38 | +#### Описание полей ответа |
| 39 | + |
| 40 | +| Поле | Тип | Описание | |
| 41 | +|-------------|--------|----------------------------------| |
| 42 | +| id | number | Уникальный идентификатор новости | |
| 43 | +| title | string | Заголовок новости | |
| 44 | +| description | string | Полный текст новости | |
| 45 | +| createdAt | string | Дата публикации в формате ISO | |
| 46 | + |
| 47 | +## Примеры использования |
| 48 | + |
| 49 | +### JavaScript (Fetch API) |
| 50 | + |
| 51 | +```javascript |
| 52 | +// Пример получения новостей с использованием Fetch API |
| 53 | +async function getNews(limit = 10, offset = 0) { |
| 54 | + try { |
| 55 | + const response = await fetch(`https://your-api.com/api/news?limit=${limit}&offset=${offset}`); |
| 56 | + |
| 57 | + if (!response.ok) { |
| 58 | + throw new Error(`HTTP error! Status: ${response.status}`); |
| 59 | + } |
| 60 | + |
| 61 | + const newsItems = await response.json(); |
| 62 | + |
| 63 | + console.log(`Получено ${newsItems.length} новостей`); |
| 64 | + |
| 65 | + // Обработка полученных новостей |
| 66 | + newsItems.forEach(news => { |
| 67 | + console.log(`${news.title} (${new Date(news.createdAt).toLocaleDateString()})`); |
| 68 | + console.log(news.description); |
| 69 | + console.log('---'); |
| 70 | + }); |
| 71 | + |
| 72 | + return newsItems; |
| 73 | + } catch (error) { |
| 74 | + console.error('Ошибка при получении новостей:', error); |
| 75 | + return null; |
| 76 | + } |
| 77 | +} |
| 78 | + |
| 79 | +// Использование |
| 80 | +getNews(5, 0).then(result => { |
| 81 | + // Дополнительная обработка результата |
| 82 | +}); |
| 83 | +``` |
| 84 | + |
| 85 | +### PHP с базой данных |
| 86 | + |
| 87 | +```php |
| 88 | +<?php |
| 89 | +// Пример получения и сохранения новостей в базу данных |
| 90 | + |
| 91 | +// Функция для получения новостей из API |
| 92 | +function fetchNews($limit = 10, $offset = 0) { |
| 93 | + $url = "https://your-api.com/api/news?limit={$limit}&offset={$offset}"; |
| 94 | + |
| 95 | + $ch = curl_init($url); |
| 96 | + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); |
| 97 | + curl_setopt($ch, CURLOPT_TIMEOUT, 30); |
| 98 | + |
| 99 | + $response = curl_exec($ch); |
| 100 | + |
| 101 | + if (curl_errno($ch)) { |
| 102 | + echo 'Ошибка cURL: ' . curl_error($ch); |
| 103 | + return null; |
| 104 | + } |
| 105 | + |
| 106 | + curl_close($ch); |
| 107 | + |
| 108 | + return json_decode($response, true); |
| 109 | +} |
| 110 | + |
| 111 | +// Функция для сохранения новостей в базу данных |
| 112 | +function saveNewsToDatabase($newsItems) { |
| 113 | + // Параметры подключения к базе данных |
| 114 | + $host = 'localhost'; |
| 115 | + $dbname = 'news_database'; |
| 116 | + $username = 'root'; |
| 117 | + $password = 'password'; |
| 118 | + |
| 119 | + try { |
| 120 | + // Подключение к базе данных |
| 121 | + $pdo = new PDO("mysql:host={$host};dbname={$dbname}", $username, $password); |
| 122 | + $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); |
| 123 | + |
| 124 | + // Подготовка запроса для вставки или обновления новостей |
| 125 | + $stmt = $pdo->prepare(" |
| 126 | + INSERT INTO news (external_id, title, description, created_at) |
| 127 | + VALUES (:external_id, :title, :description, :created_at) |
| 128 | + ON DUPLICATE KEY UPDATE |
| 129 | + title = :title, |
| 130 | + description = :description, |
| 131 | + created_at = :created_at |
| 132 | + "); |
| 133 | + |
| 134 | + // Обработка каждой новости |
| 135 | + $count = 0; |
| 136 | + foreach ($newsItems as $news) { |
| 137 | + $stmt->execute([ |
| 138 | + ':external_id' => $news['id'], |
| 139 | + ':title' => $news['title'], |
| 140 | + ':description' => $news['description'], |
| 141 | + ':created_at' => $news['createdAt'] |
| 142 | + ]); |
| 143 | + $count++; |
| 144 | + } |
| 145 | + |
| 146 | + echo "Успешно сохранено {$count} новостей\n"; |
| 147 | + return true; |
| 148 | + |
| 149 | + } catch (PDOException $e) { |
| 150 | + echo "Ошибка базы данных: " . $e->getMessage() . "\n"; |
| 151 | + return false; |
| 152 | + } |
| 153 | +} |
| 154 | + |
| 155 | +// Создание таблицы (выполняется один раз при настройке) |
| 156 | +function createNewsTable() { |
| 157 | + $host = 'localhost'; |
| 158 | + $dbname = 'news_database'; |
| 159 | + $username = 'root'; |
| 160 | + $password = 'password'; |
| 161 | + |
| 162 | + try { |
| 163 | + $pdo = new PDO("mysql:host={$host};dbname={$dbname}", $username, $password); |
| 164 | + $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); |
| 165 | + |
| 166 | + $pdo->exec(" |
| 167 | + CREATE TABLE IF NOT EXISTS news ( |
| 168 | + id INT AUTO_INCREMENT PRIMARY KEY, |
| 169 | + external_id INT UNIQUE, |
| 170 | + title VARCHAR(255) NOT NULL, |
| 171 | + description TEXT NOT NULL, |
| 172 | + created_at DATETIME NOT NULL, |
| 173 | + updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP |
| 174 | + ) |
| 175 | + "); |
| 176 | + |
| 177 | + echo "Таблица новостей успешно создана\n"; |
| 178 | + return true; |
| 179 | + |
| 180 | + } catch (PDOException $e) { |
| 181 | + echo "Ошибка создания таблицы: " . $e->getMessage() . "\n"; |
| 182 | + return false; |
| 183 | + } |
| 184 | +} |
| 185 | + |
| 186 | +// Использование |
| 187 | +createNewsTable(); // Выполняется один раз при настройке |
| 188 | +$newsItems = fetchNews(20, 0); |
| 189 | + |
| 190 | +if ($newsItems && is_array($newsItems)) { |
| 191 | + saveNewsToDatabase($newsItems); |
| 192 | +} else { |
| 193 | + echo "Не удалось получить данные новостей\n"; |
| 194 | +} |
| 195 | +?> |
| 196 | +``` |
| 197 | + |
| 198 | +### C# |
| 199 | + |
| 200 | +```csharp |
| 201 | +using System; |
| 202 | +using System.Collections.Generic; |
| 203 | +using System.Net.Http; |
| 204 | +using System.Text.Json; |
| 205 | +using System.Threading.Tasks; |
| 206 | + |
| 207 | +namespace NewsApiClient |
| 208 | +{ |
| 209 | + // Класс для десериализации ответа API |
| 210 | + public class NewsItem |
| 211 | + { |
| 212 | + public int Id { get; set; } |
| 213 | + public string Title { get; set; } |
| 214 | + public string Description { get; set; } |
| 215 | + public DateTime CreatedAt { get; set; } |
| 216 | + } |
| 217 | + |
| 218 | + // Класс для работы с API новостей |
| 219 | + public class NewsApiClient |
| 220 | + { |
| 221 | + private readonly HttpClient _httpClient; |
| 222 | + private readonly string _baseUrl; |
| 223 | + |
| 224 | + public NewsApiClient(string baseUrl) |
| 225 | + { |
| 226 | + _httpClient = new HttpClient(); |
| 227 | + _baseUrl = baseUrl; |
| 228 | + } |
| 229 | + |
| 230 | + public async Task<List<NewsItem>> GetNewsAsync(int limit = 10, int offset = 0) |
| 231 | + { |
| 232 | + try |
| 233 | + { |
| 234 | + string url = $"{_baseUrl}/api/news?limit={limit}&offset={offset}"; |
| 235 | + HttpResponseMessage response = await _httpClient.GetAsync(url); |
| 236 | + |
| 237 | + response.EnsureSuccessStatusCode(); |
| 238 | + |
| 239 | + string responseBody = await response.Content.ReadAsStringAsync(); |
| 240 | + var options = new JsonSerializerOptions |
| 241 | + { |
| 242 | + PropertyNameCaseInsensitive = true |
| 243 | + }; |
| 244 | + |
| 245 | + List<NewsItem> newsItems = JsonSerializer.Deserialize<List<NewsItem>>(responseBody, options); |
| 246 | + return newsItems; |
| 247 | + } |
| 248 | + catch (HttpRequestException e) |
| 249 | + { |
| 250 | + Console.WriteLine($"Ошибка HTTP запроса: {e.Message}"); |
| 251 | + return null; |
| 252 | + } |
| 253 | + catch (JsonException e) |
| 254 | + { |
| 255 | + Console.WriteLine($"Ошибка десериализации JSON: {e.Message}"); |
| 256 | + return null; |
| 257 | + } |
| 258 | + catch (Exception e) |
| 259 | + { |
| 260 | + Console.WriteLine($"Общая ошибка: {e.Message}"); |
| 261 | + return null; |
| 262 | + } |
| 263 | + } |
| 264 | + } |
| 265 | + |
| 266 | + // Пример использования |
| 267 | + class Program |
| 268 | + { |
| 269 | + static async Task Main(string[] args) |
| 270 | + { |
| 271 | + string apiUrl = "https://your-api.com"; |
| 272 | + var client = new NewsApiClient(apiUrl); |
| 273 | + |
| 274 | + var newsItems = await client.GetNewsAsync(5, 0); |
| 275 | + |
| 276 | + if (newsItems != null && newsItems.Count > 0) |
| 277 | + { |
| 278 | + Console.WriteLine($"Получено {newsItems.Count} новостей"); |
| 279 | + |
| 280 | + foreach (var news in newsItems) |
| 281 | + { |
| 282 | + Console.WriteLine($"ID: {news.Id}"); |
| 283 | + Console.WriteLine($"Заголовок: {news.Title}"); |
| 284 | + Console.WriteLine($"Дата: {news.CreatedAt.ToLocalTime()}"); |
| 285 | + Console.WriteLine($"Содержание: {news.Description}"); |
| 286 | + Console.WriteLine(new string('-', 50)); |
| 287 | + } |
| 288 | + } |
| 289 | + else |
| 290 | + { |
| 291 | + Console.WriteLine("Не удалось получить новости"); |
| 292 | + } |
| 293 | + } |
| 294 | + } |
| 295 | +} |
| 296 | +``` |
| 297 | + |
| 298 | +## Интеграция с GML |
| 299 | + |
| 300 | +Для интеграции API новостей с GML: |
| 301 | + |
| 302 | +1. Убедитесь, что ваш API запущен и доступен по сети |
| 303 | +2. В панели управления GML перейдите в раздел интеграций |
| 304 | +3. Выберите "Импорт новостей с внешнего ресурса" |
| 305 | +4. Укажите URL вашего API, который возвращает новости в формате, описанном выше |
| 306 | +5. Сохраните настройки |
| 307 | + |
| 308 | +После успешной интеграции новости будут автоматически отображаться в лаунчере GML. Обратите внимание, что GML ожидает |
| 309 | +получить массив объектов с полями `id`, `title`, `description` и `createdAt`. Если ваш API возвращает данные в другом |
| 310 | +формате, вам потребуется создать промежуточный слой для преобразования данных. |
0 commit comments