I like some of the things that Catalyst::Controller::REST
does, you might take a look at it -- it follows a similar approach to what you are proposing, but in the context of Catalyst.
In particular, it unpacks the supplied content (if you want) based on the format specified by the "Content-Type" header, and serializes your output data structure. (It uses Content-Type for that too -- I think it should use "Accept" for that.)
Your GET/PUT/POST handler doesn't have to deal with that at all, but the user can supply input in whatever format they want: XML, YAML, JSON, etc. and consume your results however they want. The perl handler can just deal with native perl data structures.