2014-02-04 6 views
2

Создаю сервер Delphi XE5 DataSnap Rest (используя компоненты FireDac).Как использовать параметры TDateTime в Delphi XE5 DataSnap Rest

Все работает нормально, за исключением приема в качестве параметра TDATETIME.

После некоторых исследований я понимаю, что этот тип данных не используется в DataSnap (по крайней мере, прямой).

Так что я хочу сделать основную функцию, как это:

InsertCustomer(aID : Integer; aDateOfBirth : TDateTime) : Integer; 

Как я могу сделать эту функцию, потому что я не могу использовать TDateTime ...

Моей идею (запрос) должны поставить что-то аналогичный (identic) с полем, которое экспортируется из TDataSet.

когда колонна TDateTime из TDataSet экспортируется, как это ... [ «2013-10-10 10: 47: 40,0»]

ответ

1

Там нет стандартного способа передачи даты и времени, используя либо URL параметров или JSON. Имейте в виду, что TDateTime фактически является double за кулисами, поэтому, определяя метод, как в вашем примере, аргумент должен указываться как число с плавающей запятой в URL-адресе.

Если вы хотите принять дату как строку ISO8601, вам необходимо определить аргумент как тип string и выполнить преобразование вручную. Вот одна функция, которую я использую в своем собственном коде для именно такого типа проблемы.

uses 
    Soap.XSBuiltIns; 

function ISODateStrToDate(DateStr: string): TDateTime; 
var 
    xsDate: TXSDate; 
begin 
    xsDate := TXSDate.Create; 
    try 
    xsDate.XSToNative(DateStr); 
    Exit(xsDate.AsDate); 
    finally 
    xsDate.Free; 
    end; 
end; 

Эта функция отбрасывает временную часть строки ISO8601. В большинстве случаев мне это не нужно.

Если вам нужно время часть, возможно, вы можете использовать

function XMLTimeToDateTime(const XMLDateTime: InvString; AsUTCTime: Boolean = False): TDateTime; 

это из того же блока Soap.XSBuiltIns, однако быть предупрежден! Эта функция работает корректно только для полных строк ISO8601, которая включает в себя полную информацию о часовом поясе (конечная часть +01: 00 или -05: 00). Для вашего примера ISO8601 datetime он будет действовать так, как если бы вы дали время в UTC, и он попытается преобразовать его в значение TDateTime по местному времени.

+0

tks для ответа ... поэтому я предполагаю, что это будет строка, потому что в более «читаемом человеком» в случае ошибок. –

+0

Основная проблема заключается в том, что просто нет стандартного способа передачи дат. REST не является надежным стандартом, это просто термин, используемый для описания API HTTP RPC. JSON также не определяет стандартный формат даты. Вот почему вы должны сделать деление на то, что вы поддерживаете для своего API. Вы можете определить свой метод так, чтобы год, месяц, день и т. Д. Были индивидуальными целыми аргументами. Затем соответствующий HTTP-вызов будет выглядеть так: /datasnap/rest/TMyController/InsertCustomer/252/2014/2/4/17/36 –

Смежные вопросы