[fpc-pascal] Troubles with SQLDBRESTBridge

Michael Van Canneyt michael at freepascal.org
Sun Jun 23 11:31:57 CEST 2019



On Sun, 23 Jun 2019, Sven Barth via fpc-pascal wrote:

>>> Okay, independently of whether the REST module is the optimal 
>>> solution or not, it should work, right? (and shouldn't the Wiki entry 
>>> then mention the advantages/disadvantages of the two approaches? 
>>> Cause when looking at the SQLDB REST module I thought "yay, less 
>>> stuff to configure" and rolled with that)
>>
>> What exactly is less to configure ? :)
>
> Looking at the Wiki again I was fooled by the Datamodule having 8 bullet 
> points, the SQLDBRestModule having 5, but the later simply shortening 
> stuff with point five... So yeah... not really less to configure... My 
> fault. ^^'

It's OK. I will try to document it a little better.

>>> Cause with the changes you committed the example provided with 
>>> Lazarus still does not work (even if I change MyDispatcher.Active to 
>>> False and MyDispatcher.BasePath to 'REST'). The error is always 
>>> "INVALID RESOURCE" which means that ExtractRestResourceName returned 
>>> an empty string (which is logical, cause there neither exists a route 
>>> that sets 'resource' nor is HandleMetadataRequest ever called).
>>>
>>
>> Ah. Documentation issue.
>> If you use a restmodule, then I expect the resource to be provided using
>> ?resourceParam=Name, not in the URL.
>>
>> See
>> function TSQLDBRestDispatcher.ExtractRestResourceName(IO: TRestIO): 
>> UTF8String;
>
> Ah! But that isn't mentioned in the Wiki, right? Cause the Wiki only 
> mentioned the URL based stuff and thus I assumed the SQLDBRESTModule to 
> behave the same...

Well, ideally it would be so, and I think I have a way to do it without
additional options: the module can simply set the routing params before
calling HandleRequest.


> By the way: I sometimes get a EStreamError *after* all data had been 
> sent to the client. I have not yet found a reproducible way for this...

Please make sure  you have the latest version of everything: I had this a
couple of times in case of an error. I fixed all occurrences, I hope.

But if you find additional cases: let me know.

>
>>
>> We can of course change that to try and look in the URL as well using
>> GetNextPathInfo on the request if the routes are not registered,
>> that should work.
>>
>> But then it needs to be done early on in the HandleRequest because the
>> rdoInConnection needs to be observed, so the path can be read only 
>> once. It will probably require a new rdoUseRequestPathInfo, which 
>> could be set by
>> the restmodule... I will look at this.
>>
>
> Would at least be nice to not have to care how one needs to call the 
> server side...

I agree, see above :)

>
>>> - localhost:8080/metadata works
>>> - localhost:8080/users returns "INVALID RESOURCE"
>>
>> Because it has rdoConnectionInURL set, and so you must do
>> localhost:8080/expenses/users
>
> Ahhhhhh! Hadn't seen that this option is active... Okay, then it indeed 
> works as expected, both with and without rdoConnectionInURL.
>
> By the way: I noticed a slight annoyance, but I don't know whether one 
> can really do something about that: When I set rdoConnectionInURL to 
> False inside the object inspector it turns on again, because 
> rdoConnectionResource is set. Took me a moment to look at the source 
> code to see that I need to disable rdoConnectionResource first. Don't 
> know what a better solution would be...

Funny you mention this, I was fooled myself yesterday, I also had to look in
the sources :(

One way would be to disable rdoConnectionResource if you disable
rdoConnectionInURL. I will add this.

>
> Further thing I noticed when testing BufClient and CSVClient: Changing 
> the resource doesn't work there either. I don't get an exception like 
> with JSONClient, but simply nothing happens.

Strange. I will test the examples again. Thanks for pointing it out !

Michael.


More information about the fpc-pascal mailing list