Op 28-9-2020 om 16:19 schreef Sven Van Caekenberghe:


On 28 Sep 2020, at 07:28, Roelof Wobben via Pharo-users <pharo-users@lists.pharo.org> wrote:

Hello,

I have this code :

getMoreData
� � | url url2 json json2 artObjectJson levelsJson|
� � url := 'https://www.rijksmuseum.nl/api/nl/collection/' , objectNumber
� � � � , '?key=14OGzuak&format=json'.
� � url2 := 'https://www.rijksmuseum.nl/api/nl/collection/'
� � � � , objectNumber , '/tiles?key=14OGzuak'.
� � "Read the data from the api respons"
� � json := NeoJSONReader fromString: (ZnEasy get: url) contents.
� � artObjectJson := json at: #artObject.
� � painter := ((artObjectJson at: #principalMakers) at: 1) at: #name.
� � title := artObjectJson at: #title.
� � "Read the imageUrl from the api respons"
� � json2 := NeoJSONObject fromString: (ZnEasy get: 'https://www.rijksmuseum.nl/api/nl/collection/SK-C-1368/tiles?key=14OGzuak') contents utf8Decoded.
� � levelsJson := (json2 at: #levels).
� � imageUrl := �levelsJson at: 1.

but now I see that somethimes ZnEasy get: url � gives a document of zero bytes.
Now can I put the rest in a big ifFalse block or make another function for it or is there a better�more smalltalk way of dealing with this "problem".

Roelof

I think it would be good if you ask de rijksmuseum api guys to explain why

https://www.rijksmuseum.nl/api/nl/collection/SK-C-1368

is correctly typed with content-type application/json, while

https://www.rijksmuseum.nl/api/nl/collection/SK-C-1368/tiles

has a missing content-type (while it is clearly also application/json).


Your code can be improved as well. If you do your parsing via NeoJSONObject, you do not get Dictionaries back, but instances of�NeoJSONObject (a subclass of Dictionary). These behave more like JavaScript maps/objects.

You can use accessors, as if they exist, and they will turned into #at: accesses, with the additional feature of returning nil when the property is not found.

So, for example, at the end, you can say

� json2 levels.

Instead of at: 1 you can use first, together this gives you

� json2 levels first.

The same approach is possible for the first json expression and its subsequent use (but parse via NeoJSONObject fromString:).

� json artObject principalMarkers first name.


Coming back to your problem, 'sometimes' is not a bug report we can work on, it does not sound good. It could be that the server returns an empty response. But normally, if something is wrong, you should get a real error.


The API seems cool though, I got a nice painting back retrieving one of the embedded URLs (artObject->webImage->url) using

� ZnEasy getJpeg:�'https://lh3.googleusercontent.com/N2m90mImdcoLacUybb_rxcktTwtr0LFhtuzxbSE9elIhElF6jpWngx96_uZ0L1TGNof5pNt4n_Ygb4KYlPTpA9o6788=s0'.

If you use the Form tab in the inspector, you can see the image




Thanks,

I have asked the maintainers of that api but no respons at all. It looked if someone made this a long time ago and then disappeaed.


So im stuck at a api which does very wierd things and I try to work around it.
Maybe a idea to test first zneasy for the respons and it it's 500 then find a way to display with seaside a message that� no data is found otherwise display the details

Roelof