Print

Print


Yeah, I'm going to disagree a bit with the original post in this thread, 
and with Richard's contribution too. Or at least qualify it.

My experience is that folks trying to be pure and avoid an API do _not_ 
make it easier for me to consume as a developer writing clients. It's 
just not true that one always leads to the other.

The easiest API's I have to deal with are those where the developers 
really understand the use cases clients are likely to have, and really 
make API's that conveniently serve those use cases.

The most difficult API's I have to deal with are those where the 
developers spent a lot of time thinking about very abstract and 
theoretical concerns of architectural purity, whether in terms of REST, 
linked data, HATEOS, or, god forbid, all of those and more at once (and 
then realizing that sometimes they seem to conflict) -- and neglected to 
think about actual use cases and making them smooth.

Seriously, think about the most pleasant, efficient, and powerful API's 
you have used.  (github's?  Something else?).  How many of them are 
'pure' non-API API's, how many of them are actually API's?

I'm going to call it an "API" even if it does what the original post 
says, I'm going to say "API" in the sense of "how software is meant to 
deal with this" -- in the base case, the so-called "API" can be "screen 
scrape HTML", okay.

I am going to agree that aligning the API with the user-visible web app 
as much as possible -- what the original post is saying you should 
always and only do -- does make sense.  But slavish devotion to avoiding 
any API as distinct from the human web UI at all leads to theoretically 
pure but difficult to use API's.

Sometimes the 'information architecture' that makes sense for humans 
differs from what makes sense for machine access. Sometimes the human UI 
needs lots of JS which complicates things.  Even without this, an API 
which lets me choose representations based on different URI's instead of 
_only_ conneg (say, "/widget/18.json" instead of only "/widget/18" with 
conneg) ends up being significantly easier to develop against and debug.

Spend a bit of time understanding what people consider theoretically 
pure, sure, because it can give you more tools in your toolbox.  But 
simply slavishly sticking to it does not, in my experience, result in a 
good 'developer experience' for your developer clients.  And when you 
start realizing that different people from different schools have 
different ideas of what 'theoretically pure' looks like, when you start 
spending many hours going over "HTTP RANGE 14" and just getting more 
confused -- realize that what matters in the end is being easy to use 
for your developers use cases, and just do it.

Personally, I'd spend more time making sure i understand my developers
use cases and getting feedback from developers, and less time on 
architecting castles in the sky that are theoretically pure.

On 12/2/13 9:56 AM, Bill Dueber wrote:
> On Sun, Dec 1, 2013 at 7:57 PM, Barnes, Hugh <[log in to unmask]>wrote:
>
>> +1 to all of Richard's points here. Making something easier for you to
>> develop is no justification for making it harder to consume or deviating
>> from well supported standards.
>
>
>
> ​I just want to point out that as much as we all really, *really* want
> "easy to consume" and "following the standards" to be the same
> thing....they're not. Correct content negotiation is one of those things
> that often follows the phrase "all they have to do...", which is always a
> red flag, as in  "Why give the user  different URLs ​when *all they have to
> do is*...". Caching, json vs javascript vs jsonp, etc. all make this
> harder. If *all * *I have to do* is know that all the consumers of my data
> are going to do content negotiation right, and then I need to get deep into
> the guts of my caching mechanism, then set up an environment where it's all
> easy to test...well, it's harder.
>
> And don't tell me how lazy I am until you invent a day with a lot more
> hours. I'm sick of people telling me I'm lazy because I'm not pure. I
> expose APIs (which have their own share of problems, of course) because I
> want them to be *useful* and *used. *
>
>    -Bill, apparently feeling a little bitter this morning -
>
>
>
>