// ***************************************************************************
//
// Delphi MVC Framework
//
// Copyright (c) 2010-2020 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;
type
TValidateServerCertificateProc = reference to procedure(const aSender: TObject; const aRequest: TURLRequest;
const aCertificate: TCertificate; var accepted: Boolean);
IMVCRESTResponse = interface;
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;
///
/// 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;
///
/// 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¶m2=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.
///
function Get(const aResource: string): IMVCRESTResponse; overload;
function Get: IMVCRESTResponse; overload;
///
/// Execute a Head request.
///
function Head(const aResource: string): IMVCRESTResponse; overload;
function Head: IMVCRESTResponse; overload;
///
/// Execute a Options request.
///
function Options(const aResource: string): IMVCRESTResponse; overload;
function Options: IMVCRESTResponse; overload;
///
/// Execute a Post request.
///
///
/// 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;
function Post(const aResource: string; const aBody: string = '';
const aContentType: string = TMVCMediaType.APPLICATION_JSON): IMVCRESTResponse; overload;
function Post: IMVCRESTResponse; overload;
///
/// Execute a Patch request.
///
function Patch(const aResource: string; aBody: TObject;
const aOwnsBody: Boolean = True): IMVCRESTResponse; overload;
function Patch(const aResource: string; const aBody: string = '';
const aContentType: string = TMVCMediaType.APPLICATION_JSON): IMVCRESTResponse; overload;
function Patch: IMVCRESTResponse; overload;
///
/// Execute a Put request.
///
function Put(const aResource: string; aBody: TObject; const aOwnsBody: Boolean = True): IMVCRESTResponse; overload;
function Put(const aResource: string; const aBody: string = '';
const aContentType: string = TMVCMediaType.APPLICATION_JSON): IMVCRESTResponse; overload;
function Put: IMVCRESTResponse; overload;
///
/// Execute a Delete request.
///
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;
///
/// 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);
end;
implementation
end.