You are not logged in.
I was playing with Sample 14 - Inteface based services, using named pipe (Project14Client <-> Project14Server). When I deliberately changed the username in Client.SetUser method to User1, I got an - expected - exception, although the error message contained something more than the pure error json (with errorCode, errorText properties):
TServiceFactoryClient.Create(): ICalculator interface or TSQLRestRoutingREST routing not supported by server [{
"errorCode":403,
"errorText":"Authentication Failed: Invalid signature (0)"
}].
How can I get only the error message json as the exception message? Do I have to setup the server to explicitly support TSQLRestRoutingREST routing? If so, how?
Last edited by damiand (2020-05-29 21:05:53)
Offline
By taking a look at the mORMot.pas unit, line 61268 I presumed that the error json is by design embedded into the Exception Message and this was not caused by a routing misconfiguration:
...
if PosEx(SERVICE_CONTRACT_NONE_EXPECTED,ContractExpected)=0 then begin
if not InternalInvoke(SERVICE_PSEUDO_METHOD[imContract],
TSQLRestClientURI(fRest).fServicePublishOwnInterfaces,@RemoteContract,@Error) then
raise EServiceException.CreateUTF8('%.Create(): I% interface or % routing not '+
'supported by server [%]',[self,fInterfaceURI,fRest.ServicesRouting,Error]);
...
So if I want to process the json error on the client side I have to extract it as a substring from the Exception error message by using something like this:
try
Client.ServiceDefine([ICalculator],sicShared);
except on E: EServiceException do
// Extract the json as a substring from inside the brackets of E.Message
end;
Is there any alternative, more orthodox approach? I attempted to use a PServiceRunningContext but with no success, since at the exception point all its record properties had nil values.
Offline
Don't rely on intercepting exceptions on client side.
Especially don't rely on implementation details of the framework on client side.
Check https://synopse.info/files/html/Synopse … l#TITL_165
I don't understand why you wrote about PServiceRunningContext, which is a server-side only feature.
It is always nil on the client side for sure.
The kind of exception you try to intercept is a low-level exception because the client and server don't have matching contract.
You can intercept it via the TSQLRestClientURI.OnFailed event.
Offline
The response of ab helped me to understand better the framework and more, to find the proper and simpler answer to my initial question: How to handle client to server authentication errors and get the error response. The solution is simple: Check the return value of Client.SetUser method and if false, get the error response by calling Client.LastErrorMessage. I should have known it, if I had read properly the documentation before playing with the Sample 14 code.
By the way, by assigning a procedure to the Client.OnFailed event, I also got the error response json from the Call^.OutBody property. Many thanks ab.
Offline