Hello all, Several times in the past couple of years I've found myself attempting to create objects that incorporate/adapt a given APIs specification -- in other words, building a mini, pharo based SDK for the given API. These are always JSON based APIs. I am not sure what the best practices are for doing this and am looking for some wisdom from this list. I have a few questions: 1. When passing around JSON-based objects for a given API, is it better to work with Dictionaries or to create (for example) specific objects for specific kinds of JSON objects in the API -- ie for Stripe, would you just work with objects that read and parse Dictionaries or implement Transaction, User, CreditCard objects, etc, etc? 2. If you create objects for each kind of entity rather than using dictionaries, what do you do in the (rather common) case where the API specification allows for a lot of malleability in a given JSON object that gets passed in for a given kind of request? Often times there can be arbitrary, non-required key-value pairs set by the user for a given transaction/request/whatever on the JSON object. I'm not sure how this would translate to Pharo objects, especially if we are creating a method-per-key 3. Do you create a method per what would be a key in the spec's JSON object? 4. If a given API spec is itself written in JSON, do we have some way of "automatically" creating the equivalent objects in Pharo (since both are machine readable)? I am currently considering developing a bare-bones proof of concept package for making a Matrix Client but I'm a bit flummoxed about how to proceed, since there seem to be many ways to do this -- some that might be worse than others for testing, abstraction, etc, etc. Any advice is much appreciated. Thanks! -- , Eric |
Hi -
1. There is a Stripe package here: http://smalltalkhub.com/#!/~pdebruic/Stripe MCHttpRepository location: 'http://smalltalkhub.com/mc/pdebruic/Stripe/main' user: '' password: '' You can see how it adapts to Stripe's changing API spec. 2. NeoJSONObject, which is part of Svens' NeoJSON package & JsonObject of the JSON package here: http://smalltalkhub.com/#!/~PharoExtras/JSON each overrides #doesNotUnderstand: to return nil when you send messages the JSON object doesn't define. E.g. given JSON of {a: 1, b: 2} you can myJson:=Json readFrom: '{"a": 1, "b":2}' readStream myJson a. "1" myJson b: 25. "sets b to 25" myJson b. "25" myJson zebra. "nil" I like and use both the JSON packages but don't like using the overriden #dnu mechanism because you cannot track implementors. So later when you want to know what #zebra does you cannot see it and have to remember its a JSON object and you're doing a dictionary lookup. But its a flexible way to deal with JSON objects sith varying fields. 3. Yes. Because I want to be able to see implementors. 4. No, not from an arbitrary spec. Google publishes some of their APIs as JSON specs and there is a project to interpret those specs and automatically build objects and interfaces here https://github.com/seandenigris/St-Google-API If there is a standard way to define APIs (swagger maybe? I'm not sure) then you could make something that does what you want for that API spec spec. Hope this helps darth-cheney wrote > Hello all, > > Several times in the past couple of years I've found myself attempting to > create objects that incorporate/adapt a given APIs specification -- in > other words, building a mini, pharo based SDK for the given API. These are > always JSON based APIs. > > I am not sure what the best practices are for doing this and am looking > for > some wisdom from this list. I have a few questions: > > 1. When passing around JSON-based objects for a given API, is it better to > work with Dictionaries or to create (for example) specific objects for > specific kinds of JSON objects in the API -- ie for Stripe, would you just > work with objects that read and parse Dictionaries or implement > Transaction, User, CreditCard objects, etc, etc? > > 2. If you create objects for each kind of entity rather than using > dictionaries, what do you do in the (rather common) case where the API > specification allows for a lot of malleability in a given JSON object that > gets passed in for a given kind of request? Often times there can be > arbitrary, non-required key-value pairs set by the user for a given > transaction/request/whatever on the JSON object. I'm not sure how this > would translate to Pharo objects, especially if we are creating a > method-per-key > 3. Do you create a method per what would be a key in the spec's JSON > object? > 4. If a given API spec is itself written in JSON, do we have some way of > "automatically" creating the equivalent objects in Pharo (since both are > machine readable)? > > I am currently considering developing a bare-bones proof of concept > package > for making a Matrix Client <https://matrix.org/docs/spec> but I'm a > bit > flummoxed about how to proceed, since there seem to be many ways to do > this > -- some that might be worse than others for testing, abstraction, etc, > etc. > > Any advice is much appreciated. Thanks! > > -- , > Eric -- Sent from: http://forum.world.st/Pharo-Smalltalk-Users-f1310670.html |
Free forum by Nabble | Edit this page |