News for hackers. Stuff that matters.
Re:Roy Fielding's Misappropriated REST Dissertation by mattmcknight on Sunday June 28, 2020 @04:11PM (#23671683)
This used to be bother me a fair bit, but I learned to noun a lot of the verbs I wanted to use. You don't sell, you create a sale. You don't move, make a movement.
Re:Roy Fielding's Misappropriated REST Dissertation by WClayFerguson on Sunday June 28, 2020 @05:24PM (#23672184)
Right. So you bought into it, sounds like. Almost every other software developer did too. They all think they had an epiphany. They didn't.

As for me, for 30 years I've known software function calls are inherently verbs and I'm not gonna let a trending "meme" (like REST) convince me otherwise. haha.

I mean it's not so much the "nouning" of verbs that's the problem, but it's the loss of the ability to use verbs that I find so appalling.

I mean if I need to run some reports it had better be called "runReports()" not some janky update of a state of some 'report' object to change it to 'running' state. So silly. REST is so jank.

I mean what if "runReports()" needs to start N number of independent reports and return the status of startup of each one. With REST you always end up fighting things like that which are totally trivially easy without the REST nonsense.

Re:Roy Fielding's Misappropriated REST Dissertation by jayd16 on Sunday June 28, 2020 @06:55PM (#23672721)
Creating nouns out of your RPC is actually powerful and transformative. Verbs are transitive but nouns can be queried, handled asynchronously etc.

It feels like jumping through hoops but you end up with a more solid API for the web.

Re:Roy Fielding's Misappropriated REST Dissertation by WClayFerguson on Sunday June 28, 2020 @09:40PM (#23673584)
I like code that's simple to understand like this:

``` let user = api.getUser(); user.setName("Clay"); api.saveUser(user); ```

That's just a basic RPC API. No one will ever convince me that turning all that into some kind of noun-based equivalent is better.

The fact that a GET and a POST are HTTP verbs that match up to that is is meaningless to me because I could care less about the HTTP layer in my API design. APIs should be decoupled from all underlying architecture as much as possible. REST is about TIGHTLY COUPLING THEM as much as possible. Bad idea.

Re:Roy Fielding's Misappropriated REST Dissertation by jayd16 on Sunday June 28, 2020 @10:05PM (#23673709)
> No one will ever convince me

Well for anyone else listening, a RESTful design would help you know whether you're creating or updating a user. You would know if you're allowed to repeat the request without side effects. That's useful in a distributed api where half open requests are inevitable.

Re:Roy Fielding's Misappropriated REST Dissertation by WClayFerguson on Monday June 29, 2020 @08:45AM (#23677059)
I think with functional programming developers are capable of knowing whether they're creating or updating a user.

However with REST I can't "transmogrify" a user. Do you know what a "transmogrification" is? No you don't. Because REST doesn't do that. It's a domain specific verb I made up.

To force REST to work you'd have to invent a new noun called "transmogrify state", even if no one would have ever conceived of that state in a functional programming design. Whenever you end up inventing new objects specifically to work around architectural limitations, that's not a simplification. :)

Functional Programming works. Nothing invalidates verbs just because you're doing them over HTTP, for example. Your API design should have no clue if it's running over HTTP or something else.

Re:Roy Fielding's Misappropriated REST Dissertation by jayd16 on Tuesday June 30, 2020 @12:20AM (#23686517)
You're right. No one knows what rules apply to transmogrification. That's why people use the http verbs to consistently create and edit things without having to look up the caching and idempotency rules of every random thing your API does.

If your API had a /transmogrification/<id> resource. I would know how to query its state and possibly edit it. I have a clear place to look for previous transmogrifications without crating a new one and I even have a nice query syntax support.

Or maybe you don't support GET and return a 405 response. That's ok too.

Re:Roy Fielding's Misappropriated REST Dissertation by WClayFerguson on Tuesday June 30, 2020 @06:34PM (#23695572)
You basically just explained how REST works. :)

* Limits number of verbs to CRUD ones (HTTP).

* Makes every verb into a noun.

* Tightly couples HTTP-codes into your API.

* Requires creation of many endpoints you don't really need.

* Makes it awkward to have a single request that updates multiple different types of objects, or queries different types of data.

yeah, I don't want any of the above in my life.

Re:Roy Fielding's Misappropriated REST Dissertation by dragonwriter on Monday June 29, 2020 @10:23AM (#23677857)
> The fact that a GET and a POST are HTTP verbs that match up to that is is meaningless to me because I could care less about the HTTP layer in my API design.

REST is a protocol-neutral architectural pattern, so, yes, you should care less about the specific protocol and it's verbs. REST is about resource representation (the nouns and the ways they are represented as data) driving everything, not wire protocol verbs. HTTP is itself a REST API built on top of TCP/IP, but other REST APIs don't have to be built on top of HTTP, or even tied to a single underlying protocol.

> APIs should be decoupled from all underlying architecture as much as possible. REST is about TIGHTLY COUPLING THEM as much as possible.

No, it's not, even approximately.

Re:Roy Fielding's Misappropriated REST Dissertation by WClayFerguson on Monday June 29, 2020 @10:53AM (#23678127)
If REST is "not even approximately" coupled to HTTP, then how do you explain that people attempt to use the fixed set of CRUD-type of verbs (GET, POST, etc.)? Just a coincidence I guess. lol.
Re:Roy Fielding's Misappropriated REST Dissertation by dragonwriter on Monday June 29, 2020 @11:10AM (#23678294)
> If REST is "not even approximately" coupled to HTTP, then how do you explain that people attempt to use the fixed set of CRUD-type of verbs (GET, POST, etc.)?

REST over HTTP uses standard HTTP methods with their HTTP-defined semantics rather than unnecessary ad hoc, API-specific extensions because, well, first, why would you do anything else if you want to use a standardized underlying protocol? And second because: “A REST API should not contain any changes to the communication protocols aside from filling-out or fixing the details of underspecified bits of standard protocols, [...]” https://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypert...

Re:Roy Fielding's Misappropriated REST Dissertation by WClayFerguson on Monday June 29, 2020 @02:41PM (#23680872)
I consider HTTP the 'pipe' over which the data is marshalled. It has it's own error codes, it's own verbs, and it's own protocol that has nothing whatsoever to do with my API for my APP and that's the way I want to keep it.

I do an HTTP "post" to send up a JSON object as a request, and I get a JSON object back as the reply. No one is going to tell me there's a "simpler" way. There isn't.

For example, if I need to delete data, I'll call "deleteSomething" as an endpoint. I could care less if HTTP has a delete in it's language, because I don't want/need any of that coupled into my API or affecting my API in any way whatsoever.

That way my API can be moved to some non-HTTP pipe at some point and it will remain unchanged. It's just like how in good OOP you ideally code to 'interfaces' rather than coding to 'objects' directly.

Here's an example controller: https://github.com/Clay-Ferguson/quantizr/blob/master/src/ma...

You can tell it's perfectly type-safe on both client (TypeScript) and server (Java), and the API itself doesn't have any clue it's even be running over HTTP, and that's a good thing.

Re:Roy Fielding's Misappropriated REST Dissertation by dragonwriter on Monday June 29, 2020 @09:37PM (#23685584)
I'm not sure what your point is. Yes, RPC over HTTP post is a perfectly valid style of API. It's not REST. It may in some sense be simpler, but being simple for a narrow interface isn't the hallmark of REST (being simple on an “across a whole world wide network of diverse resources that don't share common ownership and control” is more REST’s thing.)
Re:Roy Fielding's Misappropriated REST Dissertation by WClayFerguson on Tuesday June 30, 2020 @06:42PM (#23695647)
My entire discussion has been around the assumption that there's some very specific WebApp that needs to communicate to a server (likely over HTTP too), and that I like RPC and verbs in my API.

What you seem to be stating is that there's more to that on the web and that HTTP has a reason to exist. I agree. It makes sense for the language of the browser itself to be basic CRUD-type calls to servers (which is what HTTP is)

But for a specific RPC interface for a specific WebApp client, trying to meld THAT API into HTTP (the goal of REST) is awkward as all hell and that IS what everyone's using it for.

Re:Roy Fielding's Misappropriated REST Dissertation by mattmcknight on Monday June 29, 2020 @10:17AM (#23677813)
I think that's a bad example, because it almost perfectly matches up with REST.

user = UserApi.get(id)

user.name = "Clay"

UserApi.put(user)

Does using put instead of save really bother you that much?

The tight coupling doesn't matter if you are building a web service. HTTP is how they work.

Re:Roy Fielding's Misappropriated REST Dissertation by WClayFerguson on Monday June 29, 2020 @10:56AM (#23678157)
What bothers me is that if I have a verb called "transmogrify" in my API's domain language the REST purists will try to tell me not to use that verb, because some preexisting generic CRUD-type verb can be made to work instead. Sorry, no, that's awkward.
Re:Roy Fielding's Misappropriated REST Dissertation by tuesdayrain on Sunday June 28, 2020 @10:56PM (#23673940)
>I mean if I need to run some reports it had better be called "runReports()" not some janky update of a state of some 'report' object to change it to 'running' state. So silly. REST is so jank.

I fail to see how that's janky, it sounds like a great abstraction. I would have a 'createReports()' method that returns an array of Report objects that all correspond to a record in a database. Easy to query for the state, id, or any other details I might need. Doesn't get any cleaner than that in my opinion.

Re:Roy Fielding's Misappropriated REST Dissertation by WClayFerguson on Tuesday June 30, 2020 @06:27PM (#23695504)
Yes, we agree. What I meant is I'd have a verb that creates and returns some kind of "ReportContext" object, which sends back an "id" which I can then query status of later, for example. But no REST.

My point is that the entire endpoint would be mostly verbs (like runReports) and use only the HTTP POST to communicate. So I'm "ignoring" the fact that it's running over HTTP, I would ignore every "rule" of REST, because REST offers nothing but hurdles to jump over.

Re:Roy Fielding's Misappropriated REST Dissertation by mattmcknight on Sunday June 28, 2020 @06:32PM (#23672594)
I didn't really have an epiphany or buy in, I just figured out a way to think about it so I wasn't worrying about verbs all of the time. Purity in all things is a problem, REST included.

One thing that kind of gets you is that HTTP itself is not the best transport for all of these things. If we are talking about something that has to run over HTTP, we might do something like create a run of reports (maybe a POST to reports/run). That could return a list of report_ids that were created and their associated status, with an run_id associated with the collect run. There's no fighting!

However, if you want that data streaming back to you, this is where you might think you want something more like WebSockets. For some use cases, this can be more efficient than having the client polling to see if the result of a long running process is ready. It all depends.

Anyway, not advocating for anything here, just pointing out that I had the same worry about supporting a rich vocabulary of verbs, but then kind of realized it didn't matter because all verbs you want can be nouns. If you are using HTTP though, the REST verbs match up pretty nicely with how the protocol works, so it avoids inventing another abstraction to sit on top of it.

Re:Roy Fielding's Misappropriated REST Dissertation by WClayFerguson on Sunday June 28, 2020 @09:32PM (#23673545)
You seem to realize that an RPC API design is totally separate concern from HTTP, and I agree with most of what you're saying, but then in your last sentence you say "REST verbs match up nicely" and can simplify your API. Respectfully, no it can't.

REST doesn't remove abstraction layers, it creates abstraction layers. Whether you do REST or not you will have an interface between client and server, which has to be documented and have a well defined set of nouns and verbs, period. Can't be avoided. Removing my choice of verbs does NOT simplify things. If my API only needs CRUD verbs that's what I'll use. No problem. But forcing me into those 4 verbs, only, ever, and always (as pure REST does) is not a help, it's a hindrance.

Re:Roy Fielding's Misappropriated REST Dissertation by mattmcknight on Monday June 29, 2020 @12:40AM (#23674401)
By "REST verbs match up nicely", I meant REST verbs match up nicely with HTTP methods...(there are currently about 9 HTTP methods?). That's why it's not an additional abstraction, a POST is a POST. Compared to SOAP, which is where I came to it, it's tightly aligned with the transport. (People used to advocate for SOAP saying you could use it over SMTP...). If you are going to do a non-HTTP API, REST doesn't make a lot of sense.

Anyway, I was still annoyed by the limited verbs 10 years ago after using REST for five years at that point. I even blogged about it, as I started doing HATEOAS about that time, so I really feel your annoyance. I've just discovered over time that the verb/noun thing is just stylistic, not an actual technical concern. All of your verbs can be nouns.

Re:Roy Fielding's Misappropriated REST Dissertation by WClayFerguson on Monday June 29, 2020 @09:10AM (#23677228)
I've also done plenty of SOAP back in the day. I independently invented the equivalent of SOAP in an API back in 1998 where my RPC API used only one method, which was basically a "call(command)" for sending XML data upstream and getting an XML response (C++ app). The request XML had the "name" of the "verb" as part of the request. Basically a "command pattern".

So what I do today is I use "REST APIs" (like in Java Spring, Axios/Ajax, etc.) but all my endpoints are named as "verbs" (not nouns), and the only HTTP verb I ever do is a "POST".

So everything boils down to this:

let myJsonReponse = api.doSomeVerb(myJsonRequest);

Re:Roy Fielding's Misappropriated REST Dissertation by cworth on Monday June 29, 2020 @11:40AM (#23678567)
Your comment illustrates how REST forces you towards an OOP-style: https://steve-yegge.blogspot.com/2006/03/execution-in-kingdo...
Re:Roy Fielding's Misappropriated REST Dissertation by WClayFerguson on Tuesday June 30, 2020 @06:58PM (#23695778)
Sure you can definitely create an OOP-style architecture that allows only 4 functions to exist on any object (create, read, update, delete)

Programmers have had the ability to do that since the 1960s and guess what... nobody ever wanted to do it.

With the advent of HTTP (and it's fixed set of verbs and return codes), that didn't somehow invalidate all the prior decades of OOP. lol. However RESTful fanboys disagree with me on that.