-
Content Count
44 -
Joined
-
Last visited
-
Days Won
1
Stuart Clennett last won the day on December 13 2018
Stuart Clennett had the most liked content!
Community Reputation
15 GoodTechnical Information
-
Delphi-Version
Delphi 10.1 Berlin
Recent Profile Visitors
The recent visitors block is disabled and is not being shown to other users.
-
Using an API endpoint as src for img tag ?
Stuart Clennett replied to Stuart Clennett's topic in MARS-Curiosity REST Library
Thanks Andrea - I'll look into that. -
Using an API endpoint as src for img tag ?
Stuart Clennett replied to Stuart Clennett's topic in MARS-Curiosity REST Library
Hi @Andrea Magni I implemented it using a simple base64 encoded string. Is there any benefit to using TStringWriter given that I may need the API to support web front ends written in a JS framework like Angular ? Thanks -
Delphi 10.4.1 breaks "[Context] Request: TWebRequest;"
Stuart Clennett replied to Paul Thornton's topic in MARS-Curiosity REST Library
HI, [Context] Request: TWebRequest; should be changed to [Context] Request: IMARSRequest; you'll need to include MARS.Core.RequestAndResponse.Interfaces in your uses clause. Regards -
Updating client side TMARSToken with just a JWT Token string?
Stuart Clennett posted a topic in MARS-Curiosity REST Library
Hi, I am auto-renewing the JWT token on the server (as per the TokenAutoRenew demo). Having received the JWT token string from the server how do I update the client MARSToken with that value. The properties are read-only. Thanks -
Using an API endpoint as src for img tag ?
Stuart Clennett replied to Stuart Clennett's topic in MARS-Curiosity REST Library
So I'm back to this. I'm currently thinking of using Data-URLs to get the base64 image data and embed direcly into the Angular client app. (ref: https://css-tricks.com/data-uris/ & https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/Data_URIs) Note that with the above TBytes solution I seem to get the response "[255, 0, 255, 0, 45, 56, 67 ..... ]" as text rather than raw bytes. The end point has the response type set as 'image/jpeg' -
Using an API endpoint as src for img tag ?
Stuart Clennett posted a topic in MARS-Curiosity REST Library
Hi, Not sure if I'm on the right track here. I have a legacy database that has some images stored in blob fields in the database (I know). I'd like to be able to expose these images directly from the REST API, e.g. localhost:8080/rest/default/images/{id} I guess I have to set the Produces attribute to `image/jpeg` .. but what data type should I return? I've tried TBytes but although I get the bytes returned in Postman - web browsers don't load the image. Thanks -
@alejandro The demo does not save the file at all. You are required to implement that. However it is quite simple. For example, in the `StoreDataAndFile` method in `Server.Resources.pas` you could use a memory stream to access the Bytes and save to a file if SameText(LParam.FieldName, 'image') and LParam.IsFile then begin Result.FileSize := Length(LParam.AsFile.Bytes); Result.FileName := LParam.AsFile.FileName; // This will save the file lStream := TMemoryStream.Create; try lStream.Write(LParam.AsFile.Bytes, Length(LParam.AsFile.Bytes)); lStream.SaveToFile(TPath.Combine(C_RootPath, TPath.GetFileName(LParam.AsFile.FileName))); finally lStream.free; end; end In this instance, `C_RootPath` is just a folder on the server where uploaded files should be saved, but you could make this dynamic based on user info in the Token for example. Hope this helps
-
Server.Ignition.pas(86): E2010 Incompatible types: 'TBeforeHandleRequestProc' and 'Procedure'
Stuart Clennett replied to Stuart Clennett's topic in MARS-Curiosity REST Library
Excellent news & thanks for the merge. -
Server.Ignition.pas(86): E2010 Incompatible types: 'TBeforeHandleRequestProc' and 'Procedure'
Stuart Clennett replied to Stuart Clennett's topic in MARS-Curiosity REST Library
Thanks @Andrea Magni - I spotted the difference immediately after posting my question. Just going through and updating my servers now. Hope you're all safe & well. -
Server.Ignition.pas(86): E2010 Incompatible types: 'TBeforeHandleRequestProc' and 'Procedure'
Stuart Clennett replied to Stuart Clennett's topic in MARS-Curiosity REST Library
FIXED. The function signature now uses IMARSResponse and IMARSRequest from MARS.Core.ResponseAndRequest.Interfaces D'oh 🙂 -
Server.Ignition.pas(86): E2010 Incompatible types: 'TBeforeHandleRequestProc' and 'Procedure'
Stuart Clennett posted a topic in MARS-Curiosity REST Library
Hi all, I've upgraded to MARS 1.4 and I'm hitting this compiler error on all my servers - including the MARSTemplate servers: [dcc32 Error] Server.Ignition.pas(86): E2010 Incompatible types: 'TBeforeHandleRequestProc' and 'Procedure' This is in response to the following: FEngine.BeforeHandleRequest := function (const AEngine: TMARSEngine; const AURL: TMARSURL; const ARequest: TWebRequest; const AResponse: TWebResponse; var Handled: Boolean ): Boolean begin Result := True; { code snip } end; which is in class constructor TServerEngine.CreateEngine. I'm not that great with anonymous methods & can't figure this one out. Thanks in advance, -
Using TFDQuery on DataModule with Resource Result Type TFDDataset
Stuart Clennett replied to Stuart Clennett's topic in MARS-Curiosity REST Library
Hi @Andrea Magni Ah brilliant, I wondered what "IsReference" meant 😄 Thanks again -
FireDAC Connections
Stuart Clennett replied to Stuart Clennett's topic in MARS-Curiosity REST Library
Hello Andrea, That's excellent, thank you very much for your detailed answer. I agree with you that the Connection attribute seems a much cleaner implementation and I will have a go at refactoring my project. Thanks again, Best wishes, Stuart -
Using TFDQuery on DataModule with Resource Result Type TFDDataset
Stuart Clennett posted a topic in MARS-Curiosity REST Library
Hi, Is there anyway I can use a TFDQuery owned by a TDataModule with the resource result type TFDDataset (produces TMediaType.Application_JSON) ? At present MARS adds the FDQuery to the Activation context, so it tries to free it & it's already freed when the Datamodule is freed (as part of the resource cleanup) in the TMARSActivation.Invoke, e.g. function TAssessmentResource.GetAssessment(const id: string): TFDDataSet; begin // result := FData.qryAssessmentProperties; <-- results in Invalid Pointer Operation (FData is private DataModule) result := FD.CreateQuery(SQL_ASSESSMENT_PROPERTIES, nil, True, 'assessmentProperties'); TFDQuery(result).Params[0].AsString := id; end; The cause is as below: procedure TMARSActivation.Invoke; // [..snip..] begin try // [ ... invoke code ... ] finally // teardown phase FTeardownTime := TStopwatch.StartNew; if Assigned(FResourceInstance) then FResourceInstance.Free; //<-- datamodule & TFQuery freed here FreeContext; //<-- TFDQuery is in the current context so attempts to free here = Invalid Pointer Operation FTeardownTime.Stop; end; I'd rather not have to create my own JSON stream, but I'd like to have my DB logic encapsulated in a data module. Thanks Stuart -
FireDAC Connections
Stuart Clennett replied to Stuart Clennett's topic in MARS-Curiosity REST Library
Ah, figured it out. FEngine.BeforeHandleRequest := function (const AEngine: TMARSEngine; const AURL: TMARSURL; const ARequest: TWebRequest; const AResponse: TWebResponse; var Handled: Boolean): Boolean var App: TMARSApplication; begin Result := True; // skip favicon requests (browser) ... [snip] // Handle CORS and PreFlight ... [snip] // Get the default connection name based on the host URL if (pos('localhost', AUrl.URL) > 0) or (pos('192.168.', aUrl.URL) > 0) then cConnectionDefname := 'LOCAL_DB' else cConnectionDefName := 'MAIN_DB'; // apply to every application for App in AEngine.Applications.Values do App.Parameters.Values['FireDAC.ConnectionDefName'] := cConnectionDefName; end; So I get the default connection def name based on the URL. Then set the correct parameter for each hosted application. (My previous mistake was setting the `FireDAC.ConnectionDefName` parameter at the Engine level) If anyone can think of a better or more elegant way, please let me know. Thanks