Delphi framework for multi-tier REST/JSON HTTP/HTTPS application server development and ORM remoting.
v4.7 (September 11, 2019)Version history
- New : $expand query option now also applies for blobs. In previous versions, clients could request associations to be inline in JSON response by using the $expand query option in format "$expand=Customer". Now you can also ask for blob properties to be inline (as base64 string) in the JSON response, by providing the name(s) of blob properties in the $expand query option. For example, "$expand=Photo".
- Improved : Polymorphism when deserializing JSON objects allows deserializing both PODO and XData/Aurelius entities using the same method. For example, suppose a service operation (server-side method) that receives a parameter of type "TObject". Clients can now send either a PODO object or a Aurelius entity object to that method, and either will be serialized correctly. In previous versions it would consider everything as PODO and wrongly serialize the Aurelius entity.
- Fixed : Multiple calls to TXDataWebDataset.ApplyUpdates could cause some errors. That would happen if in the second call to ApplyUpdates, the modifications of the first call were not yet sent to the server, causing the same delta to be processed twice.
- New : HttpPatch attribute to specify service operations responding to PATCH HTTP method.
- Fixed : Swagger not including all service operation actions when the actions endpoints were the same.
- New : SwaggerOptions and SwaggerUIOptions properties allow to easily enable and configure Swagger support for the API.
- New : Support for SwaggerUI provides a built-in web-based environment to test the API from the browser.
- New : FromQuery, FromPath and FromBody attributes allow higher control in parameter binding and URL routing for service operations.
- New : EnableEntityKeyAsSegment property allows single-entity URL endpoints to follow the format "entity/id" - for example, customer/10, in addition to existing default format customer(10).
- Improved : String and enumeration literals now can be sent in URL without being enclosed by single quotes (e.g., CustomerByName?Name=John instead of CustomerByName?Name='John').
- Fixed : TXDataWebClient invoking service operations with default parameters was requiring all parameters to be passed, including the ones with default values.
- Fixed : Index out of range error in TMS XData Web Application Wizard when XData server has no entities.
- Fixed : Generated XData Web Application not supporting filtering by subproperties (e.g., Invoice/Customer/Name eq 'John').
- New : XData Server wizards generate XData server applications using the new design-time components instead of pure code. The generated application is now way easier to maintain and evolve, given it uses the RAD approach with design-time components. There is now wizard for server as VCL application. Next versions will include console application, Apache module or Windows service.
- New : TXDataWebDataset.EnumAsInteger property controls how enumerated type properties will be represented in the dataset. This is a breaking change.
- Improved : TXDataWebClient.OnLoad method now provides the newly created entity in the Args.Result property, when using Post method.
- Improved : All demos refactored, now using the new non-visual components: TXDataServer, TAureliusConnection, TXDataConnectionPool and TSparkleHttpSysDispatcher, making them easier to understand for beginners and easier to change them.
- Fixed : XData Service wizard did not appear if there was no open project in IDE.
- Fixed : XData Music Demo was issuing JSON Web Tokens with wrong expiration date/time.
- Fixed : Workaround a bug in Delphi Rio causing serialization of TJSONNumber values to be always serialized as null (TJSONNumber.Null always returning true).
- Fixed : Type mismatch when passing an empty array to a service operation that receives the dynamic array as var/out parameter.
- Fixed : TXDataWebDataset now creates TFloatField field for XData properties of type Currency, instead of TCurrencyField (unsupported in TMS Web Core clients).
- Fixed : TXDataWebClient.OnRequest event not being called when executing service operations with RawInvoke method.
- Fixed : Inoffensive memory leak in TSparkleHttpSysDispatcher when the dispatcher was never activated.
- Improved : TXDataWebConnection now "disconnects" (cleans model object, requiring a new connection) when URL is modified.
- Fixed : XData Web App Application Wizard was incorrectly creating TExtendedField fields for Int64 types in server.
- Fixed : Workaround a bug in Delphi Rio causing JWT tokens to be always rejected due to expiration (TJSONNumber.Null always returning true).
- Fixed : Typo in generated XData service code: "form the client" should be "from the client".
- Fixed : TXDataWebClient.RawInvoke was not allowing receiving a full JSON object as a single parameter.
- New : XData Web Application Wizard now can optionally generate GUI for performing CRUD operations on entities. You can now generate a web application that allows users to insert, modify and/or delete entities.
- New : Support for Delphi 10.3 Rio.
- Fixed : XData Service Wizard was creating new service units in the first project of a project group. Now it's being created in the currently active project.
- Fixed : TTime fields not correclty supported in TXDataWebDataset.
- New : XData Web App Generator wizard. This wizard creates a full TMS Web Core client app based on a responsive Bootstrap template. The generated application should be based on a XData server and will provide user-interface for listing XData server entities, including searching, ordering and pagination.
- New : XData Service Operation wizard. Makes it very easy to create new service operations (server-side business logic).
- New : Design-time support with new set of components for XData: TXDataServer and TXDataConnectionPool components.
- Improved : TXDataWebDataset.Load now automatically connects the TXDataWebConnection if it's still not connected.
- Improved : TXDataServerModule.SetEntitySetPermissions allows providing '*' as the entity set name which will be considered the default permissions for all entity sets.
- Improved : TXDataClientResponse.ResultAsArray and ResultAsObject for quick access to Result as Json array or object.
- Fixed : TXDataWebDataset not setting correct datetime values on entity properties.
- Fixed : TXDataWebClient.RawInvoke was incorrectly requiring parameters of type "out".
- New : TXDataWebDataset properties QueryTop, QuerySkip, ServerRecordCount, ServerRecordCountMode. This makes it easier to retrieve paged results from server (QueryTop, QuerySkip) and retrieve the total number of records in server (ServerRecordCount, ServerRecordCountMode), regardless of the page number and size
- New : TJwtMiddleware.AllowExpiredToken and ForbidAnonymousAccess properties. This makes it easier to reject requests with expired tokens or requests without tokens (anonymous) just by setting those properties. This is a breaking change as the middleware now rejects expired tokens by default. Please refer to TMS Sparkle documentation for more info.
- New : TCorsMiddleware middleware makes it straightforward to add CORS support to any Sparkle module. Please refer to TMS Sparkle documentation for more info.
- Improved : XData Music Demo now includes options for ordering, paging and filtering (search) of listed records.
- Improved : URIPathSegment attribute with empty string is now possible in a service contract, allowing creating service operations at the "root" of the server.
- Improved : "New TMS XData Server" Wizard now adds commented code to include CORS and Compress middleware. Uncomment the generated code to easily enable it.
- Fixed : TXDataWebDataset now correctly creates TStringField for GUID properties (TGuidField is not supported in TMS Web Core).
- Fixed : Removed memory leaks in desktop client JWT Auth demo.
- Fixed : "New TMS XData Server" wizard updated with option to use new TMS Aurelius native database drivers.
- New : TXDataWebConnection.OnResponse event intercepts any successful HTTP request made by XData web client framework
- Improved : XData Music demo improvements
- Fixed : Servers with Int64 type in model were not supported when used from TMS Web client
- New : XData Music Web Application demo. A full web application example using TMS XData server using TMS Web Core as web front-end. Full source code is provide, and the online version of demo is available at https://app.devgems.com/xdata/music/app.
- New : TXDataWebClient.ReferenceSolvingMode allows automatic solving of $ref occurrences in JSON response, which is now the default behavior.
- New : Demos XData Web-Client Framework, showing use of TXDataWebClient, TXDataWebDataset and integration with FNC Grid.
- New : TXDataWebDataset.CurrentData provides the underlying JSON object of the current web dataset record.
- New : TXDataWebConnection.Open method allows providing callbacks for connection successful and connection error.
- New : TXDataWebConnection.OnRequest and TXDataWebClient.OnRequest events allow intercepting and modifying outgoing requests (for example, to add authentication headers).
- New : TXDataWebConnection.OnError event which is fired whenever an error happens while performing requests to XData server from TMS Web Core apps.
- New : TXDataWebConnection.DesignData allows adding custom headers at design-time (for example authorization) to properly connect to XData server.
- New : TXDataWebClient.RawInvoke allows high-level invoking of service operations from TMS Web Core applications.
- New : TXDataWebClient request methods (List, Get, Post, RawInvoke, etc.) now have overloaded methods that accept callback functions.
- New : Full-featured TMS XData Web-Client Framework provides RAD, design-time and high-level components for building web applications using TMS Web Core and TMS XData. Buildling a REST API-based web application has never been as easy, including dataset-like usage that feels home to Delphi developers.
- Improved : TXDataWebDataset.SetJsonData now accepts non-array values (to edit a single object, for example).
- Improved : TXDataWebClient.Get overloaded method allows passing an additional query string (to use $expand option for example).
- Improved : TXDataServerModule.Create overload requiring just BaseUrl - no database connection pool is needed. Useful for XData servers that do not connect to a database or have specific database usage.
- Improved : TMS Web Core-only TXDataConnection and TXDataDataset components has been renamed to TXDataWebConnection and TXDataWebDataset. This is a breaking change.
- Improved : Smooth design-time experience with TXDataWebDataset. Manually loading field defs are not necessary anymore - just connect dataset to a web connection, provide the URL and fields will be loaded automatically at both design-time or runtime. Design-time menu option "Load Field Defs" has been removed.
- Improved : Editing TXDataWebDataset.EntitySetName at design-time in object inspector now provides a combobox with the list of available names retrieved from the server.
- Improved : Dataset fields now supported in TXDataWebDataset. They will contain data (list of objects) for associated lists (many-valued associations).
- Fixed : Memory leaks when using mobile/Linux compilers (when using automatic reference counting)
- Fixed : Exceptions that were not inherited from EXDataHttpException were wrongly reporting an error code (regression)
- New : OnModuleException event allows for a more flexible custom error-handling processing of exception raised during XData processing request.
- Fixed : deserialization of array of objects was keeping the same instance for all objects in the array.
- Fixed : OnEntityModifying event was being fired before merge operation thus not providing correct information about the object in manager and previous state. Breaking change that can be disabled by using _FixEntityModifyingOnUpsert := False
- New : TXDataClient.Count method. Allows retrieving the number of entities in a specific resource endpoint, optionally using a query filter
- New : TQueryParser.AddMethod allows registering custom SQL Functions to be called from XData query API.
- New : TMS RADical WEB enabled! The TMS framework for front-end Web development, TMS RADical WEB has been released and TMS XData is immediately a first-class citizen of this new ecosystem.
- New : MultiTentant Demo included in distribution shows how to use XData with multi-tentant applications (multiple databases being accessed by the same server).
- New : /$model built-in URL returns metadata for the whole XData API.
- Improved : A connection was being retrieved from the pool even when the context manager was not being used by a service operation.
- Fixed : Service operations invoked via GET method using enumerated type parameters are now supported.
- New : TXDataRequestHandler.ManagedObjects property.
- New : Support for default parameter values in service operations from non-Delphi clients (default parameters were already supported in Delphi clients).
- New : Several new types supported in service operations. Generic arrays, Generics lists of primitive types, Sets, TStrings type.
- New : OpenAPI/Swagger support.
- New : JsonNamingStrategy attribute.
- New : JsonInclude attribute in PODO classes.
- New : JsonEnumValues attribute.
- Fixed : Error when using params of type TDate (TDateTime was not affected) in service operations (Regression).
- Fixed : Design-time wizard icon not showing correctly in Delphi 10.2 Tokyo.
- New : XDataProperty and XDataExcludeProperty attributes.
- New : TXDataSeverModule.UnknownMemberHandling property.
- New : Support for passing parameters by reference in service operations.
- New : JsonProperty and JsonIgnore attributes.
- New : Filter functions startswith, endswith and contains.
- New : Filter function concat.
- Fixed : Using TStream as a parameter for service operations was causing "JSON converter not found" error.
- New : Linux support using Delphi 10.2 Tokyo and later.
- Fixed : Location header of POST responses now uses host of the client request, not the host configured in XData module.
- New : Delphi 10.2 Tokyo Support
- Fixed : Server-side stack overflow when trying to load a proxy property sent by the client, if the parent entity of that proxy was merged into the current Object Manager
- New : Demo project showing authentication using JWT (JSON Web Token)
- Fixed : XData Server Wizard generating corrupted source code when TMS Component Pack was installed
- Fixed : Sporadic server error loading proxied lists sent by the client
- Fixed : JWT encoding not working on XE6
- New : Url convention now allows $count path segment to retrieve number of entities in a resource.
Fixed : TXDataClient.Service
failing for Android clients when compiling in Release config
- Fixed : RefCount property was wrongly being serialized in PODO objects from mobile clients
- New : TXDataServerModule.SerializeInstanceType property controls how xdata type metadata will appear in JSON response
- New : TXDataServerModule.SerializeInstanceRef property controls how instances of same object will be represented in JSON response
- New : Support for entities that have associations in ID (primary key containing foreign keys)
- New : Support for Variant-type parameters in service operations when using GET HTTP method.
New : Support for Nullable
values in PODO classes
- New : Breaking change: TXDataServerModule.PutMode property controls how PUT will behave at server-side
- New : $expand query option allows clients to have full control on how associated entities appear in JSON response.
- Improved : Errors on query syntax now return http code 400 instead of 500
- Fixed : JSON Proxies (@xdata.proxy) sent by the client were not being solved when reading such properties at server-side
- Fixed : Association references (@xdata.ref) were not being solved when receiving entities in service operations parameters.
- New : TXDataServerModule.SetEntitySetPermissions allows configuring what operations are available in each resource type
- New : Service operations can now receive and return any type of object. This increases flexibility significantly as you can use any type of object for structure input/output parameters, or to send/receive DTO classes, etc.
- New : Service operations can now receive and return TJSONAncestor objects (Delphi XE6 and up only). This allows full control over the JSON request and response.
- New : Service operations can now receive and return TCriteriaResult objects, making it easy to return Aurelius query results that use projections.
- New : Server-Side Events allow subscribing listeners events and perform additional server-side logic
- New : Method TXDataModelBuilder.RemoveEntitySet for more flexibility when building XData models.
- New : JWT (Json Web Token) authentication and Basic authentication, thanks to new TMS Sparkle
- New : Delphi 10.1 Berlin support
- New : Authentication and authorization mechanism, based on TMS Sparkle
- New : $inlinecount query option allow retrieving the total number of entities when using paged results
- Improved : TXDataOperationContext.Current now also available in entity resources
- Improved : All server-side operation (entity CRUD, service operation execution) are now performed in database transactions
- New : Design-time wizard to create a XData Server with a few clicks
- Fixed : Service operation using enumerated types as parameters or function results not working properly
- Fixed : EntitySet requests were not taking xdata-expandlevel header into consideration. This is a breaking change.
- New : Delphi 10 Seattle support
- New : TXDataServerModule.DefaultExpandLevel allows defining the expand level of JSON responses when it's not defined by client request
- New : TXDataOperationContext Request and Response properties gives full control for service implementations to customize the processing of client requests
- New : TXDataClient.HttpClient property provides low level access to the Http client and allows using OnSendingRequest events to customize requests
- New : Several built-in functions available to increase flexibility when querying objects in REST requests. New available functions are Upper, Lower, Length, Substring, Position, Year, Month, Day, Hour, Minute and Second
- Fixed : TXDataClient Get, Delete, Patch and Put operations were broken when using entities with composite id
- Fixed : POST requests not working correctly with entities with composite key
- Fixed : Data Modification requests sending content-type header with parameter (for example, ";charset=UTF8") were causing errors
- New : URIPathSegment attribute allows specifying a different name for operation/service to be used in URL
- New : HttpMethod attribute allows specifying the HTTP method a service operation should respond to
- Fixed : GET requests with query order was sometimes causing the same column to appear multiple times in a "ORDER BY" SQL clause
- New : Support for Delphi XE8
- New : Support for CORS (Cross-origin resource sharing) preflighted requests
- Improved : Installer
- New : TXDataClient methods Get, Post, Put, Delete and List allows easy and high-level access to XData server objects from Delphi clients
- New : Server support for "x-http-method-override" header (allowing clients to tunnel HTTP methods to server through POST requests)
- New : Android and iOS support for XData client objects
- Fixed : Service operations returning nil entities should respond with status code 404
- Fixed : Issues with floating-point literals in Query URL with non-English server systems
- New : UserName and Password properties in TXDataServerModule for basic authentication protection
- New : Service Operations allow adding custom business logic to your server using interfaces and methods
- New : Multi-Model design makes it easy to create multiple servers with different mapping, types and service operations
- Fixed : Malfunctioning with $skip and $top query options
- New : Added Delphi XE7 support
for Delphi XE2, XE3, XE4, XE5, XE6, XE7, XE8, 10 Seattle, 10.1 Berlin, 10.2 Tokyo, 10.3 Rio (Prof/Enterprise/Architect)
View licensing FAQ
- License for commercial use: Single developer license, Small team license, Site license
- Includes full source code
- Free 1 year updates and new releases
- After 1 year, a 70% discount renewal is offered for a one year extension (offer valid for 30 days)
- Free priority support through email and forum