// *************************************************************************** // // Delphi MVC Framework // // Copyright (c) 2010-2021 Daniele Teti and the DMVCFramework Team // // https://github.com/danieleteti/delphimvcframework // // Collaborators on this file: // João Antônio Duarte (https://github.com/joaoduarte19) // // *************************************************************************** // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // // *************************************************************************** } unit MVCFramework.RESTClient.Intf; {$I dmvcframework.inc} interface uses System.SysUtils, System.Classes, System.TypInfo, System.Net.HttpClient, System.Net.URLClient, MVCFramework.Serializer.Intf, MVCFramework.Commons, MVCFramework.Serializer.Commons, Data.DB, JsonDataObjects; type IMVCRESTResponse = interface; TValidateServerCertificateProc = reference to procedure(const aSender: TObject; const aRequest: TURLRequest; const aCertificate: TCertificate; var accepted: Boolean); TBeforeRequestProc = reference to procedure (aRequest: IHTTPRequest); TRequestCompletedProc = reference to procedure (aResponse: IHTTPResponse; var aHandled: Boolean); TResponseCompletedProc = reference to procedure(aResponse: IMVCRESTResponse); IMVCRESTClient = interface ['{592BC90F-B825-4B3B-84A7-6CA3927BAD69}'] function BaseURL(const aBaseURL: string): IMVCRESTClient; overload; function BaseURL(const aHost: string; const aPort: Integer): IMVCRESTClient; overload; function BaseURL: string; overload; function ProxyServer(const aProxyServer: string): IMVCRESTClient; overload; function ProxyServer: string; overload; function ProxyPort(const aProxyPort: Integer): IMVCRESTClient; overload; function ProxyPort: Integer; overload; function ProxyUsername(const aProxyUsername: string): IMVCRESTClient; overload; function ProxyUsername: string; overload; function ProxyPassword(const aProxyPassword: string): IMVCRESTClient; overload; function ProxyPassword: string; overload; {$IF defined(TOKYOORBETTER)} function SecureProtocols(const aSecureProtocols: THTTPSecureProtocols): IMVCRESTClient; overload; function SecureProtocols: THTTPSecureProtocols; overload; {$ENDIF} /// /// Add a custom SSL certificate validation. By default all certificates are accepted. /// function SetValidateServerCertificateProc(aValidateCertificateProc: TValidateServerCertificateProc): IMVCRESTClient; /// /// Executes before send the request /// function SetBeforeRequestProc(aBeforeRequestProc: TBeforeRequestProc): IMVCRESTClient; /// /// Executes after send the request /// function SetRequestCompletedProc(aRequestCompletedProc: TRequestCompletedProc): IMVCRESTClient; /// /// Executes after the response is processed. /// function SetResponseCompletedProc(aResponseCompletedProc: TResponseCompletedProc): IMVCRESTClient; /// /// Clears all parameters (headers, body, path params and query params). This method is executed after each /// request is completed. /// function ClearAllParams: IMVCRESTClient; /// /// Connection timeout in milliseconds to be used for the requests. /// function ConnectTimeout(const aConnectTimeout: Integer): IMVCRESTClient; overload; function ConnectTimeout: Integer; overload; /// /// Response reading timeout in milliseconds to be used for the requests. /// function ReadTimeout(const aReadTimeout: Integer): IMVCRESTClient; overload; function ReadTimeout: Integer; overload; /// /// Add basic authorization header. Authorization = Basic <Username:Password> (encoded in Base64) /// function SetBasicAuthorization(const aUsername, aPassword: string): IMVCRESTClient; /// /// Add bearer authorization header. Authorization = Bearer <Token> /// function SetBearerAuthorization(const aAccessToken: string): IMVCRESTClient; /// /// Returns the stored authorization. Includes Basic or Bearer prefix /// function Authorization: string; /// /// Removes the authorization header defined in /// SetBasicAuthorization or /// SetBearerAuthorization /// function ClearAuthorization: IMVCRESTClient; /// /// Add a header. /// /// /// Header name /// /// /// Header value /// /// /// Indicates whether the value of this header should be used as is (True), or encoded by the component (False) /// function AddHeader(const aName, aValue: string): IMVCRESTClient; overload; function HeaderValue(const aName: string): string; function Headers: TNameValueArray; /// /// Clears all headers. /// function ClearHeaders: IMVCRESTClient; function AllowCookies(const aAllowCookies: Boolean): IMVCRESTClient; overload; function AllowCookies: Boolean; overload; /// /// Add DMVC session cookie /// function SessionId(const aSessionId: string): IMVCRESTClient; overload; function SessionId: string; overload; /// /// Add a cookie header. /// function AddCookie(const aName, aValue: string): IMVCRESTClient; /// /// Clear all cookie headers. /// function ClearCookies: IMVCRESTClient; /// /// Add a URL segment parameter. The parameters of your url path may be enclosed in braces or in /// parentheses starting with a money sign. /api/{param1}/($param2) /// /// /// Parameter name /// /// /// Parameter value /// function AddPathParam(const aName, aValue: string): IMVCRESTClient; overload; function AddPathParam(const aName: string; aValue: Integer): IMVCRESTClient; overload; function AddPathParam(const aName: string; aValue: Int64): IMVCRESTClient; overload; function AddPathParam(const aName: string; aValue: TGUID): IMVCRESTClient; overload; function AddPathParam(const aName: string; aValue: TDateTime): IMVCRESTClient; overload; function AddPathParam(const aName: string; aValue: TDate): IMVCRESTClient; overload; function AddPathParam(const aName: string; aValue: TTime): IMVCRESTClient; overload; function AddPathParam(const aName: string; aValue: Double): IMVCRESTClient; overload; function ClearPathParams: IMVCRESTClient; /// /// Add a QueryString parameter. /api/person?para1=value&param2=value /// function AddQueryStringParam(const aName, aValue: string): IMVCRESTClient; overload; function AddQueryStringParam(const aName: string; aValue: Integer): IMVCRESTClient; overload; function AddQueryStringParam(const aName: string; aValue: Int64): IMVCRESTClient; overload; function AddQueryStringParam(const aName: string; aValue: TGUID): IMVCRESTClient; overload; function AddQueryStringParam(const aName: string; aValue: TDateTime): IMVCRESTClient; overload; function AddQueryStringParam(const aName: string; aValue: TDate): IMVCRESTClient; overload; function AddQueryStringParam(const aName: string; aValue: TTime): IMVCRESTClient; overload; function AddQueryStringParam(const aName: string; aValue: Double): IMVCRESTClient; overload; function ClearQueryParams: IMVCRESTClient; function Accept(const aAccept: string): IMVCRESTClient; overload; function Accept: string; overload; function AcceptCharset(const aAcceptCharset: string): IMVCRESTClient; overload; function AcceptCharset: string; overload; function AcceptEncoding(const aAcceptEncoding: string): IMVCRESTClient; overload; function AcceptEncoding: string; overload; function HandleRedirects(const aHandleRedirects: Boolean): IMVCRESTClient; overload; function HandleRedirects: Boolean; overload; function MaxRedirects(const aMaxRedirects: Integer): IMVCRESTClient; overload; function MaxRedirects: Integer; overload; function UserAgent(const aUserAgent: string): IMVCRESTClient; overload; function UserAgent: string; overload; function Resource(const aResource: string): IMVCRESTClient; overload; function Resource: string; overload; /// /// Add a body to the requisition. /// /// /// Body in string format. /// /// /// Body content type. /// function AddBody(const aBody: string; const aContentType: string = ''): IMVCRESTClient; overload; /// /// Add a body to the requisition /// /// /// Body in Stream format /// /// /// Body content type /// /// /// If OwnsStream is true, Stream will be destroyed by IMVCRESTClient. /// function AddBody(aBodyStream: TStream; const aOwnsStream: Boolean = True; const aContentType: string = ''): IMVCRESTClient; overload; /// /// Add a body to the requisition /// /// /// Body in Object format. The object will be serialized to a JSON string. /// /// /// If OwnsObject is true, BodyObject will be destroyed by IMVCRESTClient. /// function AddBody(aBodyObject: TObject; const aOwnsObject: Boolean = True): IMVCRESTClient; overload; /// /// Adds a file as the request body. Several files can be added in the same request. In this case the request /// will be of the multipart/form-data type /// /// /// Field name /// /// /// File path /// /// /// File content type /// function AddFile(const aName, aFileName: string; const aContentType: string = ''): IMVCRESTClient; overload; function AddFile(const aFileName: string; const aContentType: string = ''): IMVCRESTClient; overload; function AddBodyFieldFormData(const aName, aValue: string): IMVCRESTClient; overload; {$IF defined(RIOORBETTER)} function AddBodyFieldFormData(const aName: string; aStreamValue: TStream; const aContentType: string = ''): IMVCRESTClient; overload; {$ENDIF} /// /// Add a field to the x-www-form-urlencoded body. You must set ContentType to application/x-www-form-urlencoded /// function AddBodyFieldURLEncoded(const aName, aValue: string): IMVCRESTClient; function ClearBody: IMVCRESTClient; /// /// Executes the next request asynchronously. /// /// /// An anonymous method that will be run after the execution completed. /// /// /// Specifies if aCompletioHandler will be run in the main thread's (True) or execution thread's (False) context. /// /// /// An anonymous method that will be run if an exception is raised during execution. /// function Async(aCompletionHandler: TProc; aCompletionHandlerWithError: TProc = nil; const aSynchronized: Boolean = False): IMVCRESTClient; /// /// Execute a Get request. The GET method requests a representation of the specified resource. /// Requests using GET should only retrieve data. /// Sending body/payload in a GET request may cause some existing implementations to /// reject the request — while not prohibited by the specification, the semantics /// are undefined. It is better to just avoid sending payloads in GET requests. /// function Get(const aResource: string): IMVCRESTResponse; overload; /// /// Execute a Get request. The GET method requests a representation of the specified resource. /// Requests using GET should only retrieve data. /// Sending body/payload in a GET request may cause some existing implementations to /// reject the request — while not prohibited by the specification, the semantics /// are undefined. It is better to just avoid sending payloads in GET requests. /// function Get: IMVCRESTResponse; overload; /// /// Execute a Head request. The HEAD method asks for a response identical /// to that of a GET request, but without the response body. /// function Head(const aResource: string): IMVCRESTResponse; overload; /// /// Execute a Head request. The HEAD method asks for a response identical /// to that of a GET request, but without the response body. /// function Head: IMVCRESTResponse; overload; /// /// Execute a Options request. The OPTIONS method is used to describe the communication options for the target resource. /// function Options(const aResource: string): IMVCRESTResponse; overload; /// /// Execute a Options request. The OPTIONS method is used to describe the communication options for the target resource. /// function Options: IMVCRESTResponse; overload; /// /// Execute a Post request. The POST method is used to submit an entity to the specified resource, often causing a change in state or side effects on the server. /// /// /// Resource path /// /// /// Object to be serialized. It can be a simple object or a list of objects (TObjectList <T>) /// /// /// If OwnsBody is true, Body will be destroyed by IMVCRESTClient.
/// function Post(const aResource: string; aBody: TObject; const aOwnsBody: Boolean = True): IMVCRESTResponse; overload; /// /// Execute a Post request. The POST method is used to submit an entity to the specified resource, often causing a change in state or side effects on the server. /// /// /// Resource path /// /// /// Serialized data sent as body request. It can be a simple object or a list of objects (TObjectList <T>) /// /// /// Format of the body data. Must be one of the allowed media-types
/// function Post(const aResource: string; const aBody: string = ''; const aContentType: string = TMVCMediaType.APPLICATION_JSON): IMVCRESTResponse; overload; /// /// Execute a Post request. The POST method is used to submit an entity to the specified resource, often causing a change in state or side effects on the server. /// function Post: IMVCRESTResponse; overload; /// /// Execute a Patch request. The PATCH method is used to apply partial modifications to a resource. /// function Patch(const aResource: string; aBody: TObject; const aOwnsBody: Boolean = True): IMVCRESTResponse; overload; /// /// Execute a Patch request. The PATCH method is used to apply partial modifications to a resource. /// function Patch(const aResource: string; const aBody: string = ''; const aContentType: string = TMVCMediaType.APPLICATION_JSON): IMVCRESTResponse; overload; /// /// Execute a Patch request. The PATCH method is used to apply partial modifications to a resource. /// function Patch: IMVCRESTResponse; overload; /// /// Execute a Put request. The PUT method replaces all current representations of the target resource with the request payload. /// function Put(const aResource: string; aBody: TObject; const aOwnsBody: Boolean = True): IMVCRESTResponse; overload; /// /// Execute a Put request. The PUT method replaces all current representations of the target resource with the request payload. /// function Put(const aResource: string; const aBody: string = ''; const aContentType: string = TMVCMediaType.APPLICATION_JSON): IMVCRESTResponse; overload; /// /// Execute a Put request. The PUT method replaces all current representations of the target resource with the request payload. /// function Put: IMVCRESTResponse; overload; /// /// Execute a Delete request. The DELETE method deletes the specified resource. /// function Delete(const aResource: string): IMVCRESTResponse; overload; function Delete: IMVCRESTResponse; overload; /// /// Executes any type of HTTP request /// function Execute(const aMethod: TMVCHTTPMethodType; const aResource: string): IMVCRESTResponse; overload; function Execute(const aMethod: TMVCHTTPMethodType): IMVCRESTResponse; overload; /// /// Serialize the current dataset record and execute a POST request. /// function DataSetInsert(const aResource: string; aDataSet: TDataSet; const aIgnoredFields: TMVCIgnoredList = []; const aNameCase: TMVCNameCase = ncAsIs): IMVCRESTResponse; /// /// Serialize the current dataset record and execute a PUT request. /// function DataSetUpdate(const aResource, aKeyValue: string; aDataSet: TDataSet; const aIgnoredFields: TMVCIgnoredList = []; const aNameCase: TMVCNameCase = ncAsIs): IMVCRESTResponse; /// /// Delete the current dataset record by executing a delete request. /// function DataSetDelete(const aResource, aKeyValue: string): IMVCRESTResponse; /// /// Access the RESTClient serializer /// function Serializer: IMVCSerializer; overload; /// /// Add a serializer to the RESTClient /// function Serializer(const aSerializer: IMVCSerializer): IMVCRESTClient; overload; /// /// Register a custom serializer to the RESTClient serializer. /// function RegisterTypeSerializer(const aTypeInfo: PTypeInfo; aInstance: IMVCTypeSerializer): IMVCRESTClient; end; IMVCRESTResponse = interface ['{BF611B46-CCD1-47C7-8D8B-82EA0518896B}'] /// /// Success if StatusCode is >= 200 and < 300 /// function Success: Boolean; function StatusCode: Integer; function StatusText: string; function Headers: TStrings; function HeaderValue(const aName: string): string; function Cookies: TCookies; function CookieByName(const aName: string): TCookie; function Server: string; function ContentType: string; function ContentEncoding: string; function ContentLength: Integer; function Content: string; function ContentRawBytes: TBytes; procedure SaveContentToStream(aStream: TStream); procedure SaveContentToFile(const aFileName: string); function ToJSONObject: TJDOJsonObject; function ToJSONArray: TJDOJsonArray; end; implementation end.