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

Как передать массив параметров в REST-сервер с использованием Delphi и TRESTRequest: решение проблемы с TJSONObject.ParseJSONValue() и массивами в JSON-структурах

Delphi , Интернет и Сети , XML

 

Введение

При работе с REST API в Delphi часто возникает необходимость передавать сложные структуры данных, включая массивы. В этой статье мы рассмотрим, как правильно передавать массивы параметров через TRESTRequest, решим проблему с TJSONObject.ParseJSONValue() и предложим несколько альтернативных подходов.

Проблема

Пользователь столкнулся со следующей задачей: необходимо отправить JSON-структуру вида:

{
  "payment_method": [
    "credit-card",
    "open-banking"
  ],
  "transaction_type": "SALE",
  "full_name": "Joe Blogs",
  "email": "joe@example.com"
}

Основная сложность заключалась в передаче массива payment_method через TRESTRequest.

Решение 1: Использование TRESTRequestParameter

Первый подход предполагает непосредственное формирование JSON-строки и её передачу через параметр:

var
  aParam: TRESTRequestParameter;
begin
  aParam := RestReq.Params.AddItem();
  aParam.Value := '{"payment_method":["credit-card","open-banking"]}';
  // Добавление остальных параметров
  RestClient.Execute();
end;

Этот метод прост, но требует ручного формирования JSON, что может быть подвержено ошибкам.

Решение 2: Использование TJSONObject

Более структурированный подход с использованием TJSONObject:

var
  aParam: TRESTRequestParameter;
  aObj: TJSONObject;
begin
  aObj := TJSONObject.Create;
  try
    aObj.AddPair('payment_method', TJSONArray.Create(['credit-card', 'open-banking']));
    aObj.AddPair('transaction_type', 'SALE');
    aObj.AddPair('full_name', 'Joe Blogs');
    aObj.AddPair('email', 'joe@example.com');

    aParam := RestReq.Params.AddItem();
    aParam.Value := aObj.ToJSON;
  finally
    aObj.Free;
  end;
  RestClient.Execute();
end;

Решение 3: Сериализация объекта

Альтернативный подход от Uwe Raabe предполагает создание класса и его сериализацию:

type
  TSendParameter = class
  private
    Fpayment_method: TArray<string>;
    Ftransaction_type: string;
    Ffull_name: string;
    Femail: string;
  public
    property email: string read Femail write Femail;
    property full_name: string read Ffull_name write Ffull_name;
    property payment_method: TArray<string> read Fpayment_method write Fpayment_method;
    property transaction_type: string read Ftransaction_type write Ftransaction_type;
  end;

procedure SendRequest;
var
  par: TSendParameter;
begin
  par := TSendParameter.Create;
  try
    par.payment_method := TArray<string>.Create('credit-card', 'open-banking');
    par.transaction_type := 'SALE';
    par.full_name := 'Joe Blogs';
    par.email := 'joe@example.com';
    RestReq.AddBody<TSendParameter>(par);
    RestClient.Execute();
  finally
    par.Free;
  end;
end;

Этот подход наиболее удобен для сложных структур и поддерживает автоматическую сериализацию.

Проблема с заголовком Authorization

В процессе работы пользователь столкнулся с ошибкой 500, которая оказалась связана с неправильным указанием заголовка авторизации. Правильный вариант:

// Установка заголовка Authorization
var
  authParam: TRESTRequestParameter;
begin
  authParam := RestReq.Params.AddItem();
  authParam.Name := 'Authorization';
  authParam.Kind := pkHTTPHEADER;
  authParam.Options := [poDoNotEncode];
  authParam.Value := 'Bearer ' + theAccessToken;
end;

Альтернативное решение: использование TOAuth2Authenticator

Для упрощения работы с OAuth2 можно использовать встроенный аутентификатор:

var
  OAuth2: TOAuth2Authenticator;
begin
  OAuth2 := TOAuth2Authenticator.Create(nil);
  try
    OAuth2.TokenType := ttBEARER;
    OAuth2.AccessToken := theAccessToken;
    RestClient.Authenticator := OAuth2;
    // Отправка запроса
  finally
    OAuth2.Free;
  end;
end;

Заключение

Мы рассмотрели три основных подхода к передаче массива параметров в REST-сервер:
1. Ручное формирование JSON-строки
2. Использование TJSONObject
3. Сериализация объекта

Для работы с авторизацией рекомендуется использовать TOAuth2Authenticator или правильно указывать заголовок Authorization. Выбор метода зависит от сложности структуры данных и предпочтений разработчика.

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

Создано по материалам из источника по ссылке.

В статье рассматриваются различные подходы к передаче массивов параметров через TRESTRequest в Delphi, включая ручное формирование JSON, использование TJSONObject и сериализацию объектов, а также решение проблемы с заголовком авторизации.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




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


:: Главная :: XML ::


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-05-01 10:11:57/0.0037200450897217/0