@@ -6,7 +6,8 @@ interface
66 System.Classes,
77 System.SysUtils,
88 System.Typinfo,
9- VSoft.CancellationToken;
9+ VSoft.CancellationToken,
10+ VSoft.Uri;
1011
1112
1213type
@@ -68,6 +69,8 @@ TRequest = class;
6869 [' {1F09A9A8-A32E-41F3-811B-BA7D5B352185}' ]
6970 function Send (const request : TRequest; const cancellationToken : ICancellationToken = nil ) : IHttpResponse;overload;
7071 procedure ReleaseRequest (const request : TRequest);
72+ function GetBaseUri : string;
73+ function GetUri : IUri;
7174 end ;
7275
7376
@@ -79,7 +82,6 @@ TRequest = class
7982 FRequestParams : TStringList;
8083 FFiles : TStringList;
8184 FUrlSegments : TStringList;
82- FResource : string;
8385 FContent : TStream;
8486 FOwnsContent : boolean;
8587 FSaveAsFile : string;
@@ -90,6 +92,8 @@ TRequest = class
9092 FPassword : string;
9193 FProxyUserName : string;
9294 FProxyPassword : string;
95+
96+ FURI : IUri;
9397 protected
9498 function GetHeaders : TStrings;
9599 function GetParameters : TStrings;
@@ -116,7 +120,8 @@ TRequest = class
116120 function Client : IHttpClientInternal;
117121
118122 public
119- constructor Create(const client : TObject; const resource : string);
123+ constructor Create(const client : TObject; const resource : string);overload;
124+ constructor Create(const client : TObject; const uri : IUri);overload;
120125 destructor Destroy; override;
121126
122127
@@ -187,7 +192,7 @@ TRequest = class
187192
188193 property FollowRedirects : boolean read FFollowRedirects write FFollowRedirects;
189194 property HtttpMethod : THttpMethod read FHttpMethod;
190- property Resource : string read FResource write FResource ;
195+ property Resource : string read GetResource write SetResource ;
191196 property ContentLength : Int64 read GetContentLength;
192197 property SaveAsFile : string read FSaveAsFile write FSaveAsFile;
193198 property UserName : string read FUserName write FUserName;
@@ -224,7 +229,8 @@ TRequest = class
224229 function GetPassword : string;
225230 procedure SetPassword (const value : string);
226231
227- function CreateRequest (const resource : string) : TRequest;
232+ function CreateRequest (const resource : string) : TRequest;overload;
233+ function CreateRequest (const uri : IUri) : TRequest;overload;
228234
229235 procedure UseSerializer (const useFunc : TUseSerializerFunc);overload;
230236 procedure UseSerializer (const serializer : IRestSerializer);overload;
@@ -240,7 +246,9 @@ TRequest = class
240246 end ;
241247
242248 THttpClientFactory = class
243- class function CreateClient (const baseUri: string = ' ' ): IHttpClient;
249+ class function CreateClient (const uri: string): IHttpClient;overload;
250+ class function CreateClient (const uri: IUri): IHttpClient;overload;
251+
244252 end ;
245253
246254 EHttpClientException = class (Exception)
@@ -372,15 +380,46 @@ function TRequest.Client: IHttpClientInternal;
372380 FClient.GetInterface(IHttpClientInternal, result)
373381end ;
374382
375- constructor TRequest.Create(const client: TObject; const resource: string);
383+ constructor TRequest.Create(const client: TObject; const uri: IUri);
384+ var
385+ queryParam : TQueryParam;
376386begin
377387 FClient := client;
378- FResource := resource ;
388+ FURI := uri ;
379389 FFiles := TStringlist.Create;
380390 FHeaders := TStringList.Create;
381391 FRequestParams := TStringList.Create;
382392 FUrlSegments := TStringList.Create;
383393 FFollowRedirects := true;
394+
395+ if Length(uri.QueryParams) > 0 then
396+ begin
397+ for queryParam in uri.QueryParams do
398+ WithParameter(queryParam.Name , queryParam.Value );
399+ end ;
400+ end ;
401+
402+ constructor TRequest.Create(const client: TObject; const resource: string);
403+ var
404+ uri : IUri;
405+ error : string;
406+ clientInf : IHttpClientInternal;
407+ sBaseUri : string;
408+ begin
409+ if not client.GetInterface(IHttpClientInternal, clientInf) then
410+ raise Exception.Create(' Client does not implement interface!' );
411+ sBaseUri := clientInf.GetBaseUri;
412+
413+ if sBaseUri <> ' ' then
414+ sBaseUri := sBaseUri + ' /' + resource
415+ else
416+ sBaseUri := resource;
417+
418+ if not TUriFactory.TryParseWithError(sBaseUri, true, uri, error) then
419+ raise EArgumentException.Create(' Invalid Uri : ' + error);
420+
421+ Create(client, uri);
422+
384423end ;
385424
386425function TRequest.Delete (const cancellationToken: ICancellationToken): IHttpResponse;
@@ -553,7 +592,7 @@ function TRequest.GetParameters: TStrings;
553592
554593function TRequest.GetResource : string;
555594begin
556- result := FResource ;
595+ result := FURI.AbsolutePath ;
557596end ;
558597
559598function TRequest.GetUrlSegments : TStrings;
@@ -695,7 +734,7 @@ procedure TRequest.SetContentType(const value: string);
695734
696735procedure TRequest.SetResource (const value : string);
697736begin
698- FResource := value ;
737+ FURI.Path := value ;
699738end ;
700739
701740
@@ -812,9 +851,20 @@ function TRequest.AddUrlSegement(const name, value: string): TRequest;
812851
813852{ THttpClientFactory }
814853
815- class function THttpClientFactory.CreateClient ( const baseUri: string): IHttpClient;
854+ class function THttpClientFactory.CreateClient (const uri : string): IHttpClient;
855+ var
856+ theUri : IUri;
857+ error : string;
858+ begin
859+ if not TUriFactory.TryParseWithError(uri, true, theUri, error) then
860+ raise EArgumentOutOfRangeException.Create(' Invalid Uri : ' + error );
861+
862+ result := THttpClient.Create(theUri);
863+ end ;
864+
865+ class function THttpClientFactory.CreateClient (const uri: IUri): IHttpClient;
816866begin
817- result := THttpClient.Create(baseUri );
867+ result := THttpClient.Create(uri );
818868end ;
819869
820870{ EHttpClientException }
0 commit comments