Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Как правильно обработать ошибку 400 при запросе новостей через API в Delphi/Pascal и вывести сообщение об ошибке?

Delphi , Синтаксис , Ошибки и Исключения

 

Работа с внешними 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;

Ключевые моменты решения:

  1. Двойная обработка исключений: Внешний try..finally гарантирует освобождение ресурсов, внутренний try..except ловит ошибки.
  2. Проверка кодов статуса: Специальная обработка для распространенных кодов (400, 401, 404).
  3. Прерывание выполнения: После обработки ошибки функция немедленно завершается с Exit.
  4. Консистентный формат ответа: Все ошибки возвращаются в 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 Проблема на стороне сервера

Дополнительные улучшения

  1. Валидация параметров:
if Ticker = '' then
begin
  Result := '{"error": "Empty ticker parameter"}';
  Exit;
end;
  1. Обработка таймаутов:
HttpClient.ConnectTimeout := 5000; // 5 секунд
HttpClient.IOTimeout := 10000;     // 10 секунд
  1. Логирование ошибок:
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




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Ошибки и Исключения ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 17:14:06
2025-12-25 03:32:18/0.016021013259888/0