Quick.HttpClient.pas 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  1. unit Quick.HttpClient;
  2. {$i QuickLib.inc}
  3. interface
  4. uses
  5. Classes,
  6. {$IFDEF DELPHIXE8_UP}
  7. System.Net.HttpClient,
  8. System.Net.URLClient,
  9. System.NetConsts,
  10. System.JSON;
  11. {$ELSE}
  12. IdHTTP,
  13. {$IFDEF FPC}
  14. fpjson;
  15. {$ELSE}
  16. Data.DBXJSON;
  17. {$ENDIF}
  18. {$ENDIF}
  19. type
  20. IHttpRequestResponse = interface
  21. ['{64DC58F7-B551-4619-85E9-D13E781529CD}']
  22. function StatusCode : Integer;
  23. function StatusText : string;
  24. function Response : TJSONObject;
  25. end;
  26. THttpRequestResponse = class(TInterfacedObject,IHttpRequestResponse)
  27. private
  28. fStatusCode : Integer;
  29. fStatusText : string;
  30. fResponse : TJSONObject;
  31. public
  32. {$IFDEF DELPHIXE8_UP}
  33. constructor Create(aResponse : IHTTPResponse; const aContent : string);
  34. {$ELSE}
  35. constructor Create(aResponse : TIdHTTPResponse; const aContent : string);
  36. {$ENDIF}
  37. destructor Destroy; override;
  38. function StatusCode : Integer;
  39. function StatusText : string;
  40. function Response : TJSONObject;
  41. end;
  42. TJsonHttpClient = class
  43. private
  44. {$IFDEF DELPHIXE8_UP}
  45. fHTTPClient : System.Net.HttpClient.THTTPClient;
  46. {$ELSE}
  47. fHTTPClient : TIdHTTP;
  48. {$ENDIF}
  49. fUserAgent : string;
  50. fContentType : string;
  51. fResponseTimeout : Integer;
  52. fConnectionTimeout : Integer;
  53. fHandleRedirects : Boolean;
  54. procedure SetContentType(const aValue: string);
  55. procedure SetUserAgent(const aValue: string);
  56. procedure SetResponseTimeout(const aValue: Integer);
  57. procedure SetConnectionTimeout(const aValue: Integer);
  58. procedure SetHandleRedirects(const aValue: Boolean);
  59. public
  60. constructor Create;
  61. destructor Destroy; override;
  62. property UserAgent : string read fUserAgent write SetUserAgent;
  63. property ContentType : string read fContentType write SetContentType;
  64. property ResponseTimeout : Integer read fResponseTimeout write SetResponseTimeout;
  65. property ConnectionTimeout : Integer read fConnectionTimeout write SetConnectionTimeout;
  66. property HandleRedirects : Boolean read fHandleRedirects write SetHandleRedirects;
  67. function Get(const aURL : string) : IHttpRequestResponse;
  68. function Post(const aURL, aInContent : string) : IHttpRequestResponse; overload;
  69. function Post(const aURL : string; aJsonContent : TJsonObject) : IHttpRequestResponse; overload;
  70. end;
  71. implementation
  72. const
  73. DEF_USER_AGENT = 'XLHttpClient';
  74. constructor TJsonHttpClient.Create;
  75. begin
  76. {$IFDEF DELPHIXE8_UP}
  77. fHTTPClient := THTTPClient.Create;
  78. fHTTPClient.ContentType := 'application/json';
  79. fHTTPClient.UserAgent := DEF_USER_AGENT;
  80. {$ELSE}
  81. fHTTPClient := TIdHTTP.Create(nil);
  82. fHTTPClient.Request.ContentType := 'application/json';
  83. fHTTPClient.Request.UserAgent := DEF_USER_AGENT;
  84. {$ENDIF}
  85. end;
  86. destructor TJsonHttpClient.Destroy;
  87. begin
  88. fHTTPClient.Free;
  89. inherited;
  90. end;
  91. function TJsonHttpClient.Get(const aURL : string) : IHttpRequestResponse;
  92. var
  93. {$IFDEF DELPHIXE8_UP}
  94. resp : IHTTPResponse;
  95. {$ELSE}
  96. resp : TIdHTTPResponse;
  97. {$ENDIF}
  98. bodycontent : TStringStream;
  99. responsecontent : TStringStream;
  100. begin
  101. bodycontent := TStringStream.Create;
  102. try
  103. responsecontent := TStringStream.Create;
  104. try
  105. {$IFDEF DELPHIXE8_UP}
  106. resp := fHTTPClient.Get(aURL,responsecontent,nil);
  107. {$ELSE}
  108. {$IFDEF FPC}
  109. fHTTPClient.Get(aURL,responsecontent);
  110. {$ELSE}
  111. fHTTPClient.Get(aURL,responsecontent,nil);
  112. {$ENDIF}
  113. resp := fHTTPClient.Response;
  114. {$ENDIF}
  115. Result := THttpRequestResponse.Create(resp,responsecontent.DataString);
  116. finally
  117. responsecontent.Free;
  118. end;
  119. finally
  120. bodycontent.Free;
  121. end;
  122. end;
  123. function TJsonHttpClient.Post(const aURL, aInContent : string) : IHttpRequestResponse;
  124. var
  125. {$IFDEF DELPHIXE8_UP}
  126. resp : IHTTPResponse;
  127. {$ELSE}
  128. resp : TIdHTTPResponse;
  129. {$ENDIF}
  130. responsecontent : TStringStream;
  131. postcontent : TStringStream;
  132. begin
  133. postcontent := TStringStream.Create;
  134. try
  135. postcontent.WriteString(aInContent);
  136. responsecontent := TStringStream.Create;
  137. try
  138. {$IFDEF DELPHIXE8_UP}
  139. resp := fHTTPClient.Post(aURL,postcontent,nil);
  140. {$ELSE}
  141. {$IFDEF FPC}
  142. fHTTPClient.Post(aURL,postcontent,responsecontent);
  143. {$ELSE}
  144. fHTTPClient.Post(aURL,postcontent,nil);
  145. {$ENDIF}
  146. resp := fHTTPClient.Response;
  147. {$ENDIF}
  148. Result := THttpRequestResponse.Create(resp,responsecontent.DataString);
  149. finally
  150. responsecontent.Free;
  151. end;
  152. finally
  153. postcontent.Free;
  154. end;
  155. end;
  156. function TJsonHttpClient.Post(const aURL : string; aJsonContent : TJsonObject) : IHttpRequestResponse;
  157. begin
  158. {$IFDEF DELPHIXE8_UP}
  159. Result := Self.Post(aURL,aJsonContent.ToJson);
  160. {$ELSE}
  161. {$IFDEF FPC}
  162. Result := Self.Post(aURL,aJsonContent.AsJson);
  163. {$ELSE}
  164. Result := Self.Post(aURL,aJsonContent.ToString);
  165. {$ENDIF}
  166. {$ENDIF}
  167. end;
  168. procedure TJsonHttpClient.SetConnectionTimeout(const aValue: Integer);
  169. begin
  170. fConnectionTimeout := aValue;
  171. {$IFDEF DELPHIXE8_UP}
  172. fHTTPClient.ConnectionTimeout := aValue;
  173. {$ELSE}
  174. fHTTPClient.ConnectTimeout := aValue;
  175. {$ENDIF}
  176. end;
  177. procedure TJsonHttpClient.SetContentType(const aValue: string);
  178. begin
  179. fContentType := aValue;
  180. {$IFDEF DELPHIXE8_UP}
  181. fHTTPClient.ContentType := aValue;
  182. {$ELSE}
  183. fHTTPClient.Request.ContentType := aValue;
  184. {$ENDIF}
  185. end;
  186. procedure TJsonHttpClient.SetHandleRedirects(const aValue: Boolean);
  187. begin
  188. fHandleRedirects := aValue;
  189. {$IFDEF DELPHIXE8_UP}
  190. fHTTPClient.HandleRedirects := aValue;
  191. {$ELSE}
  192. fHTTPClient.HandleRedirects := aValue;
  193. {$ENDIF}
  194. end;
  195. procedure TJsonHttpClient.SetResponseTimeout(const aValue: Integer);
  196. begin
  197. fResponseTimeout := aValue;
  198. {$IFDEF DELPHIXE8_UP}
  199. fHTTPClient.ResponseTimeout := aValue;
  200. {$ELSE}
  201. fHTTPClient.ReadTimeout := aValue;
  202. {$ENDIF}
  203. end;
  204. procedure TJsonHttpClient.SetUserAgent(const aValue: string);
  205. begin
  206. fUserAgent := aValue;
  207. {$IFDEF DELPHIXE8_UP}
  208. fHTTPClient.UserAgent := aValue;
  209. {$ELSE}
  210. fHTTPClient.Request.UserAgent := aValue;
  211. {$ENDIF}
  212. end;
  213. { THttpRequestResponse }
  214. {$IFDEF DELPHIXE8_UP}
  215. constructor THttpRequestResponse.Create(aResponse: IHTTPResponse; const aContent : string);
  216. begin
  217. fStatusCode := aResponse.StatusCode;
  218. fStatusText := aResponse.StatusText;
  219. if aContent <> '' then fResponse := TJSONObject.ParseJSONValue(aContent) as TJSONObject;
  220. end;
  221. {$ELSE}
  222. constructor THttpRequestResponse.Create(aResponse : TIdHTTPResponse; const aContent : string);
  223. begin
  224. fStatusCode := aResponse.ResponseCode;
  225. fStatusText := aResponse.ResponseText;
  226. fResponse := GetJSON(aContent) as TJsonObject;
  227. end;
  228. {$ENDIF}
  229. destructor THttpRequestResponse.Destroy;
  230. begin
  231. if Assigned(fResponse) then fResponse.Free;
  232. inherited;
  233. end;
  234. function THttpRequestResponse.Response: TJSONObject;
  235. begin
  236. Result := fResponse;
  237. end;
  238. function THttpRequestResponse.StatusCode: Integer;
  239. begin
  240. Result := fStatusCode;
  241. end;
  242. function THttpRequestResponse.StatusText: string;
  243. begin
  244. Result := fStatusText;
  245. end;
  246. end.