Skip to content

Commit c7e8d39

Browse files
committed
Expand GML integrations documentation by adding a custom news API example and updating TOC structure for consistency.
1 parent c0ce3cf commit c7e8d39

File tree

2 files changed

+315
-1
lines changed

2 files changed

+315
-1
lines changed
Lines changed: 308 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,310 @@
11
# Импорт новостей с внешнего ресурса
22

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+
формате, вам потребуется создать промежуточный слой для преобразования данных.
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,11 @@
11
# Интеграция с новостями
22

3+
В данном разделе представлены различные способы интеграции новостей с лаунчером GML.
4+
35
[](gml-integrations-news-vk.md)
6+
47
[](gml-integrations-news-unicore.md)
8+
9+
[](gml-integrations-news-azuriom.md)
10+
11+
[](gml-integrations-news-custom.md)

0 commit comments

Comments
 (0)