Работа с внешними API — неотъемлемая часть современной разработки, но часто сопровождается ошибками, которые требуют корректной обработки. В этой статье разберем, как правильно ловить и обрабатывать HTTP-ошибки (в частности, код 400) при работе с NewsAPI в Delphi/Pascal, используя компонент TFPHTTPClient.
Проблема: Некорректная обработка ошибок HTTP
Как видно из исходного кода пользователя Nicole, при запросе к NewsAPI отсутствует обработка HTTP-статусов. Когда API возвращает ошибку (например, 400 Bad Request), возникает исключение, которое не обрабатывается, что приводит к появлению системных сообщений об ошибках и нарушению работы приложения.
Response := HttpClient.Get(URL); // Может вызвать исключение при статусе >= 400
Основное решение: Использование try..except с обработкой EHttpClient
Для правильной обработки ошибок необходимо обернуть вызов HTTP-запроса в блок try..except и поймать исключение EHttpClient. Вот исправленная версия функции:
function TNews.Suche_NewsZu(Ticker: string; abDatum, bisDatum: TDate): string;
var
URL, Response: string;
HttpClient: TFPHTTPClient;
JsonResponse: TJSONData = nil;
ts_ab, ts_bis: Int64;
begin
Result := '';
HttpClient := TFPHTTPClient.Create(nil);
try
HttpClient.AddHeader('User-Agent', 'Mozilla/5.0...');
try
URL := Format('https://newsapi.org/v2/everything?q=%s&from=%d&sortBy=publishedAt&apiKey=%s',
[Ticker, DateTimeToUnix(abDatum), APIKEY_News]);
Response := HttpClient.Get(URL);
except
on E: EHttpClient do
begin
case HttpClient.ResponseStatusCode of
400: Result := '{"error": "Bad Request: Invalid parameters"}';
401: Result := '{"error": "Unauthorized: Invalid API key"}';
404: Result := '{"error": "Not found: No articles available"}';
else Result := Format('{"error": "HTTP error %d"}', [HttpClient.ResponseStatusCode]);
end;
Exit; // Прерываем выполнение функции
end;
on E: Exception do
begin
Result := Format('{"error": "General error: %s"}', [E.Message]);
Exit;
end;
end;
// Обработка успешного ответа
JsonResponse := GetJSON(Response);
try
Ersetze.JsonWirdDatei(JsonResponse, 'myNews_json');
Result := VerarbeiteArtikel(JsonResponse.FormatJSON([]));
finally
JsonResponse.Free;
end;
finally
HttpClient.Free;
end;
end;
Прерывание выполнения: После обработки ошибки функция немедленно завершается с Exit.
Консистентный формат ответа: Все ошибки возвращаются в JSON-формате, аналогичном успешным ответам.
Альтернативное решение: Отдельное свойство для хранения ошибки
Если требуется сохранять данные и ошибки раздельно, можно использовать подход с хранением последней ошибки в свойстве класса:
type
TNews = class
private
FLastError: string;
public
function Suche_NewsZu(Ticker: string; abDatum, bisDatum: TDate): string;
property LastError: string read FLastError;
end;
function TNews.Suche_NewsZu(Ticker: string; abDatum, bisDatum: TDate): string;
// ...
except
on E: EHttpClient do
begin
case HttpClient.ResponseStatusCode of
400: FLastError := 'Bad Request: Invalid parameters';
// ... другие коды
end;
Result := ''; // Основной результат пустой
Exit;
end;
end;
Преимущества подхода: - Не смешиваются данные и сообщения об ошибках - Возможность проверки ошибки через свойство LastError - Более чистая архитектура для сложных приложений
Типичные HTTP-статусы NewsAPI и их значение
Код
Статус
Причина
400
Bad Request
Неправильные параметры запроса
401
Unauthorized
Недействительный API-ключ
429
Too Many Requests
Превышен лимит запросов
500
Internal Error
Проблема на стороне сервера
Дополнительные улучшения
Валидация параметров:
if Ticker = '' then
begin
Result := '{"error": "Empty ticker parameter"}';
Exit;
end;
on E: Exception do
begin
WriteLn(E.ClassName, ': ', E.Message);
raise; // Перебрасываем исключение дальше
end;
Заключение
Правильная обработка HTTP-ошибок — критически важная часть работы с внешними API. Используя комбинацию try..except с проверкой кодов статуса и правильно организуя поток выполнения приложения, вы можете:
- Избежать необработанных исключений
- Предоставлять пользователю понятные сообщения
- Сохранять стабильность работы приложения
- Упростить диагностику проблем
Для проектов на Delphi/Pascal особенно важно помнить о правильном освобождении ресурсов (HTTP-клиент, JSON-объекты) даже в случае ошибок, что достигается грамотным использованием блоков try..finally.
Приведенные примеры кода можно адаптировать для работы с любыми REST API, изменив только специфичные параметры запросов и обработку ответов.
Контекст посвящён правильной обработке ошибки 400 при запросах к NewsAPI через TFPHTTPClient в Delphi/Pascal с использованием блоков try-except и возвратом структурированных сообщений об ошибках.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS